[Libreoffice-commits] core.git: include/svtools sd/source svtools/source

Michael Meeks michael.meeks at collabora.com
Wed May 13 13:27:42 PDT 2015


 include/svtools/treelistbox.hxx       |   10 -------
 sd/source/ui/dlg/sdtreelb.cxx         |   26 +++++++-----------
 sd/source/ui/inc/sdtreelb.hxx         |    4 --
 svtools/source/contnr/treelistbox.cxx |   48 +++++++++++++++-------------------
 4 files changed, 34 insertions(+), 54 deletions(-)

New commits:
commit 06ecf7d2aebe64226142ee27c2512351960f8bb1
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Wed May 13 21:30:25 2015 +0100

    tdf#91125 - unwind horrendous SvTreeListBox drag&drop code.
    
    This removes a horrible mess of shoving various process pointers into
    byte arrays and (potentially) pushing them across a process boundary
    in a gross fashion. Killed the SvLBoxDDInfo struct, and its many
    un-used members. Instead use the existing (also non-ideal) global
    variable to track the relevant state.
    
    Change-Id: I0b694bd530e7019042d22e46db831b5a4aae0e23

diff --git a/include/svtools/treelistbox.hxx b/include/svtools/treelistbox.hxx
index 9e53336..5babd96 100644
--- a/include/svtools/treelistbox.hxx
+++ b/include/svtools/treelistbox.hxx
@@ -587,6 +587,7 @@ protected:
 
 protected:
 
+    void            SetupDragOrigin();
     void            EditItemText( SvTreeListEntry* pEntry, SvLBoxString* pItem,
                         const Selection& );
     void            EditedText(const OUString&);
@@ -817,15 +818,6 @@ public:
 };
 
 #define SV_LBOX_DD_FORMAT "SV_LBOX_DD_FORMAT"
-struct SvLBoxDDInfo
-{
-    Application*    pApp;
-    VclPtr<SvTreeListBox>         pSource;
-    SvTreeListEntry*    pDDStartEntry;
-    // Relative position in the Entry at DragBeginn (IconView)
-    long            nMouseRelX,nMouseRelY;
-    sal_uLong           nRes1,nRes2,nRes3,nRes4;
-};
 
 class SvInplaceEdit2
 {
diff --git a/sd/source/ui/dlg/sdtreelb.cxx b/sd/source/ui/dlg/sdtreelb.cxx
index d0c7864..485f392 100644
--- a/sd/source/ui/dlg/sdtreelb.cxx
+++ b/sd/source/ui/dlg/sdtreelb.cxx
@@ -87,15 +87,14 @@ SdPageObjsTLB::SdPageObjsTransferable::SdPageObjsTransferable(
     SdPageObjsTLB& rParent,
         const INetBookmark& rBookmark,
     ::sd::DrawDocShell& rDocShell,
-    NavigatorDragType eDragType,
-    const ::com::sun::star::uno::Any& rTreeListBoxData )
+    NavigatorDragType eDragType)
     : SdTransferable(rDocShell.GetDoc(), NULL, true),
       mrParent( rParent ),
       maBookmark( rBookmark ),
       mrDocShell( rDocShell ),
-      meDragType( eDragType ),
-      maTreeListBoxData( rTreeListBoxData )
+      meDragType( eDragType )
 {
+    rParent.SetupDragOrigin();
 }
 
 VCL_BUILDER_DECL_FACTORY(SdPageObjsTLB)
@@ -128,8 +127,11 @@ bool SdPageObjsTLB::SdPageObjsTransferable::GetData( const css::datatransfer::Da
             return true;
 
         case SotClipboardFormatId::TREELISTBOX:
-            SetAny(maTreeListBoxData, rFlavor);
+        {
+            css::uno::Any aTreeListBoxData; // empty for now
+            SetAny(aTreeListBoxData, rFlavor);
             return true;
+        }
 
         default:
             return false;
@@ -1204,18 +1206,10 @@ void SdPageObjsTLB::DoDrag()
 
         bIsInDrag = true;
 
-        SvLBoxDDInfo aDDInfo;
-        memset(&aDDInfo,0,sizeof(SvLBoxDDInfo));
-        aDDInfo.pApp = GetpApp();
-        aDDInfo.pSource = this;
-        //            aDDInfo.pDDStartEntry = pEntry;
-        ::com::sun::star::uno::Sequence<sal_Int8> aSequence (sizeof(SvLBoxDDInfo));
-        memcpy(aSequence.getArray(), &aDDInfo, sizeof(SvLBoxDDInfo));
-        ::com::sun::star::uno::Any aTreeListBoxData (aSequence);
-
         // object is destroyed by internal reference mechanism
-        SdTransferable* pTransferable = new SdPageObjsTLB::SdPageObjsTransferable(
-            *this, aBookmark, *pDocShell, eDragType, aTreeListBoxData);
+        SdTransferable* pTransferable =
+                new SdPageObjsTLB::SdPageObjsTransferable(
+                            *this, aBookmark, *pDocShell, eDragType);
 
         // Get the view.
         ::sd::ViewShell* pViewShell = GetViewShellForDocShell(*pDocShell);
diff --git a/sd/source/ui/inc/sdtreelb.hxx b/sd/source/ui/inc/sdtreelb.hxx
index c03a6b0..31e8125 100644
--- a/sd/source/ui/inc/sdtreelb.hxx
+++ b/sd/source/ui/inc/sdtreelb.hxx
@@ -73,8 +73,7 @@ public:
             SdPageObjsTLB& rParent,
             const INetBookmark& rBookmark,
             ::sd::DrawDocShell& rDocShell,
-            NavigatorDragType eDragType,
-            const ::com::sun::star::uno::Any& rTreeListBoxData );
+            NavigatorDragType eDragType );
         ::sd::DrawDocShell&     GetDocShell() const { return mrDocShell;}
         NavigatorDragType   GetDragType() const { return meDragType;}
 
@@ -96,7 +95,6 @@ public:
         INetBookmark        maBookmark;
         ::sd::DrawDocShell&     mrDocShell;
         NavigatorDragType   meDragType;
-        const ::com::sun::star::uno::Any maTreeListBoxData;
         SAL_DLLPRIVATE virtual               ~SdPageObjsTransferable();
 
         SAL_DLLPRIVATE virtual void      AddSupportedFormats() SAL_OVERRIDE;
diff --git a/svtools/source/contnr/treelistbox.cxx b/svtools/source/contnr/treelistbox.cxx
index 377244a..aba60a7 100644
--- a/svtools/source/contnr/treelistbox.cxx
+++ b/svtools/source/contnr/treelistbox.cxx
@@ -1234,27 +1234,19 @@ sal_Int8 SvTreeListBox::AcceptDrop( const AcceptDropEvent& rEvt )
 
 sal_Int8 SvTreeListBox::ExecuteDrop( const ExecuteDropEvent& rEvt, SvTreeListBox* pSourceView )
 {
-    sal_Int8 nRet = DND_ACTION_NONE;
-
     DBG_ASSERT( pSourceView, "SvTreeListBox::ExecuteDrop(): no source view" );
     pSourceView->EnableSelectionAsDropTarget( true, true );
 
     ImplShowTargetEmphasis( pTargetEntry, false );
     pDDTarget = this;
 
-    SvLBoxDDInfo aDDInfo;
-    memset( &aDDInfo, 0, sizeof(SvLBoxDDInfo) );
-
     TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
+
+    sal_Int8 nRet;
     if( aData.HasFormat( SotClipboardFormatId::TREELISTBOX ))
-    {
-        css::uno::Sequence<sal_Int8> aSeq = aData.GetSequence(SotClipboardFormatId::TREELISTBOX, OUString());
-        if (sizeof(SvLBoxDDInfo) == aSeq.getLength())
-        {
-            memcpy( &aDDInfo, aSeq.getConstArray(), sizeof(SvLBoxDDInfo) );
-            nRet = rEvt.mnAction;
-        }
-    }
+        nRet = rEvt.mnAction;
+    else
+        nRet = DND_ACTION_NONE;
 
     if( DND_ACTION_NONE != nRet )
     {
@@ -1262,20 +1254,19 @@ sal_Int8 SvTreeListBox::ExecuteDrop( const ExecuteDropEvent& rEvt, SvTreeListBox
 
         SvTreeListEntry* pTarget = pTargetEntry; // may be 0!
 
-
         if( DND_ACTION_COPY == rEvt.mnAction )
         {
-            if ( CopySelection( aDDInfo.pSource, pTarget ) )
+            if ( CopySelection( pDDSource, pTarget ) )
                 nRet = rEvt.mnAction;
         }
         else if( DND_ACTION_MOVE == rEvt.mnAction )
         {
-            if ( MoveSelection( aDDInfo.pSource, pTarget ) )
+            if ( MoveSelection( pDDSource, pTarget ) )
                 nRet = rEvt.mnAction;
         }
         else if( DND_ACTION_COPYMOVE == rEvt.mnAction )
         {
-            if ( MoveSelectionCopyFallbackPossible( aDDInfo.pSource, pTarget, true ) )
+            if ( MoveSelectionCopyFallbackPossible( pDDSource, pTarget, true ) )
                 nRet = rEvt.mnAction;
         }
     }
@@ -1287,6 +1278,16 @@ sal_Int8 SvTreeListBox::ExecuteDrop( const ExecuteDropEvent& rEvt )
     return ExecuteDrop( rEvt, GetSourceView() );
 }
 
+/**
+ * This sets the global variables used to determine the
+ * in-process drag source.
+ */
+void SvTreeListBox::SetupDragOrigin()
+{
+    pDDSource = this;
+    pDDTarget = 0;
+}
+
 void SvTreeListBox::StartDrag( sal_Int8, const Point& rPosPixel )
 {
 
@@ -1310,25 +1311,20 @@ void SvTreeListBox::StartDrag( sal_Int8, const Point& rPosPixel )
     TransferDataContainer* pContainer = new TransferDataContainer;
     ::com::sun::star::uno::Reference<
         ::com::sun::star::datatransfer::XTransferable > xRef( pContainer );
-
     nDragDropMode = NotifyStartDrag( *pContainer, pEntry );
     if( nDragDropMode == DragDropMode::NONE || 0 == GetSelectionCount() )
     {
         nDragDropMode = nOldDragMode;
         DragFinished( DND_ACTION_NONE );
+        delete pContainer;
         return;
     }
 
-    SvLBoxDDInfo aDDInfo;
-    memset(&aDDInfo,0,sizeof(SvLBoxDDInfo));
-    aDDInfo.pApp = GetpApp();
-    aDDInfo.pSource = this;
-    aDDInfo.pDDStartEntry = pEntry;
+    SetupDragOrigin();
 
+    // apparently some (unused) content is needed
     pContainer->CopyAnyData( SotClipboardFormatId::TREELISTBOX,
-                        reinterpret_cast<char*>(&aDDInfo), sizeof(SvLBoxDDInfo) );
-    pDDSource = this;
-    pDDTarget = 0;
+                             "unused", SAL_N_ELEMENTS("unused") );
 
     bool bOldUpdateMode = Control::IsUpdateMode();
     Control::SetUpdateMode( true );


More information about the Libreoffice-commits mailing list