[Libreoffice-commits] core.git: svx/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Wed Dec 5 12:58:15 UTC 2018
svx/source/svdraw/svdpage.cxx | 30 +++++++++++++++++++++++++-----
1 file changed, 25 insertions(+), 5 deletions(-)
New commits:
commit b38f856f234f364199d306226875471ed589b764
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
AuthorDate: Wed Dec 5 10:56:29 2018 +0100
Commit: Armin Le Grand <Armin.Le.Grand at cib.de>
CommitDate: Wed Dec 5 13:57:52 2018 +0100
tdf#121022 Do change parent of SdrObj early
Need to change parent of an SdrObject in the
according SdrObjList methods before calling
InsertedStateChange - that one relies on asking
for the parent of the SdrObject
Change-Id: I8c4d39190cafe889b27975941d72afca870e2ce5
Reviewed-on: https://gerrit.libreoffice.org/64608
Tested-by: Jenkins
Reviewed-by: Armin Le Grand <Armin.Le.Grand at cib.de>
diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx
index 5e38b25e043f..90d6d687c81b 100644
--- a/svx/source/svdraw/svdpage.cxx
+++ b/svx/source/svdraw/svdpage.cxx
@@ -384,8 +384,14 @@ SdrObject* SdrObjList::NbcRemoveObject(size_t nObjNum)
pObj->GetViewContact().flushViewObjectContacts();
DBG_ASSERT(pObj->IsInserted(),"The object does not have the status Inserted.");
- pObj->InsertedStateChange(); // calls UserCall, among other
+
+ // tdf#121022 Do first remove from SdrObjList - InsertedStateChange
+ // relies now on IsInserted which uses getParentSdrObjListFromSdrObject
SetParentAtSdrObjectFromSdrObjList(*pObj, nullptr);
+
+ // calls UserCall, among other
+ pObj->InsertedStateChange();
+
if (!mbObjOrdNumsDirty)
{
// optimizing for the case that the last object has to be removed
@@ -426,9 +432,13 @@ SdrObject* SdrObjList::RemoveObject(size_t nObjNum)
pObj->getSdrModelFromSdrObject().SetChanged();
- pObj->InsertedStateChange(); // calls, among other things, the UserCall
+ // tdf#121022 Do first remove from SdrObjList - InsertedStateChange
+ // relies now on IsInserted which uses getParentSdrObjListFromSdrObject
SetParentAtSdrObjectFromSdrObjList(*pObj, nullptr);
+ // calls, among other things, the UserCall
+ pObj->InsertedStateChange();
+
if (!mbObjOrdNumsDirty)
{
// optimization for the case that the last object is removed
@@ -475,18 +485,28 @@ SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, size_t nObjNum)
pObj->getSdrModelFromSdrObject().Broadcast(aHint);
}
- pObj->InsertedStateChange();
+ // Change parent and replace in SdrObjList
SetParentAtSdrObjectFromSdrObjList(*pObj, nullptr);
ReplaceObjectInContainer(*pNewObj,nObjNum);
- // flushViewObjectContacts() clears the VOC's and those invalidate
+ // tdf#121022 InsertedStateChange uses the parent
+ // to detect if pObj is inserted or not, so have to call
+ // it *after* changing these settings, else a obviously wrong
+ // 'SdrUserCallType::Inserted' would be sent
+ pObj->InsertedStateChange();
+
+ // flushViewObjectContacts() clears the VOC's and those
+ // trigger the evtl. needed invalidate(s)
pObj->GetViewContact().flushViewObjectContacts();
+ // Setup data at new SdrObject - it already *is* inserted to
+ // the SdrObjList due to 'ReplaceObjectInContainer' above
pNewObj->SetOrdNum(nObjNum);
SetParentAtSdrObjectFromSdrObjList(*pNewObj, this);
// Inform the parent about change to allow invalidations at
- // evtl. existing parent visualisations
+ // evtl. existing parent visualisations, but also react on
+ // newly inserted SdrObjects (as e.g. GraphCtrlUserCall does)
impChildInserted(*pNewObj);
pNewObj->InsertedStateChange();
More information about the Libreoffice-commits
mailing list