diff options
author | Caolán McNamara <caolanm@redhat.com> | 2023-04-21 16:16:02 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2023-04-21 21:18:00 +0200 |
commit | 1d0fadfd218b872ee5d4b07b88320c8f37667218 (patch) | |
tree | 5389230b9819daec665216e977320077b2ad5221 /svx | |
parent | b3f3d1447477428669a6d96dc2d6421de61204ba (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.cxx | 10 | ||||
-rw-r--r-- | svx/source/form/datanavi.cxx | 36 |
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); } |