[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