summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2023-04-21 16:16:02 +0100
committerCaolán McNamara <caolanm@redhat.com>2023-04-21 21:18:00 +0200
commit1d0fadfd218b872ee5d4b07b88320c8f37667218 (patch)
tree5389230b9819daec665216e977320077b2ad5221 /svx
parentb3f3d1447477428669a6d96dc2d6421de61204ba (diff)
Resolves: tdf#154535 create the OXFormsDescriptor on-demand
so we don't cause an unwanted Binding to be created unless we are forced to. Change-Id: Id78cbbb72ebd4e78b82a1ba614bbcb6488d04ce4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150769 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svx')
-rw-r--r--svx/source/fmcomp/xmlexchg.cxx10
-rw-r--r--svx/source/form/datanavi.cxx36
2 files changed, 28 insertions, 18 deletions
diff --git a/svx/source/fmcomp/xmlexchg.cxx b/svx/source/fmcomp/xmlexchg.cxx
index 1f8d44ee7d3a..86bc1bbf46b9 100644
--- a/svx/source/fmcomp/xmlexchg.cxx
+++ b/svx/source/fmcomp/xmlexchg.cxx
@@ -27,8 +27,8 @@ namespace svx
using namespace ::com::sun::star::datatransfer;
- OXFormsTransferable::OXFormsTransferable( const OXFormsDescriptor &rhs ) :
- m_aDescriptor(rhs)
+ OXFormsTransferable::OXFormsTransferable(const std::function<OXFormsDescriptor()>& getDescriptorFunc) :
+ m_getDescriptorFunc(getDescriptorFunc)
{
}
@@ -47,13 +47,13 @@ namespace svx
return false;
}
- const OXFormsDescriptor &OXFormsTransferable::extractDescriptor( const TransferableDataHelper &_rData ) {
-
+ OXFormsDescriptor OXFormsTransferable::extractDescriptor( const TransferableDataHelper &_rData )
+ {
using namespace ::com::sun::star::uno;
Reference<XTransferable> &transfer = const_cast<Reference<XTransferable> &>(_rData.GetTransferable());
XTransferable *pInterface = transfer.get();
OXFormsTransferable& rThis = dynamic_cast<OXFormsTransferable&>(*pInterface);
- return rThis.m_aDescriptor;
+ return rThis.m_getDescriptorFunc();
}
}
diff --git a/svx/source/form/datanavi.cxx b/svx/source/form/datanavi.cxx
index cfacfa948fbe..a00747cd2633 100644
--- a/svx/source/form/datanavi.cxx
+++ b/svx/source/form/datanavi.cxx
@@ -300,19 +300,29 @@ namespace svxform
return;
}
- OXFormsDescriptor desc;
- desc.szName = m_xItemList->get_text(*m_xScratchIter);
- if(pItemNode->m_xNode.is()) {
- // a valid node interface tells us that we need to create a control from a binding
- desc.szServiceName = GetServiceNameForNode(pItemNode->m_xNode);
- desc.xPropSet = GetBindingForNode(pItemNode->m_xNode);
- DBG_ASSERT( desc.xPropSet.is(), "DataTreeListBox::StartDrag(): invalid node binding" );
- }
- else {
- desc.szServiceName = FM_COMPONENT_COMMANDBUTTON;
- desc.xPropSet = pItemNode->m_xPropSet;
- }
- xTransferable = rtl::Reference<TransferDataContainer>(new OXFormsTransferable(desc));
+ OUString szName = m_xItemList->get_text(*m_xScratchIter);
+ Reference<css::xml::dom::XNode> xNode(pItemNode->m_xNode);
+ Reference<XPropertySet> xPropSet(pItemNode->m_xPropSet);
+
+ // tdf#154535 create the OXFormsDescriptor on-demand so we don't cause an unwanted
+ // Binding to be created unless we are forced to.
+ auto fnCreateFormsDescriptor = [this, szName, xNode, xPropSet](){
+ OXFormsDescriptor desc;
+ desc.szName = szName;
+ if (xNode) {
+ // a valid node interface tells us that we need to create a control from a binding
+ desc.szServiceName = GetServiceNameForNode(xNode);
+ desc.xPropSet = GetBindingForNode(xNode);
+ DBG_ASSERT( desc.xPropSet.is(), "DataTreeListBox::StartDrag(): invalid node binding" );
+ }
+ else {
+ desc.szServiceName = FM_COMPONENT_COMMANDBUTTON;
+ desc.xPropSet = xPropSet;
+ }
+ return desc;
+ };
+
+ xTransferable = rtl::Reference<TransferDataContainer>(new OXFormsTransferable(fnCreateFormsDescriptor));
m_xItemList->enable_drag_source(xTransferable, DND_ACTION_COPY);
}