Kaydet (Commit) b38f856f authored tarafından Armin Le Grand's avatar Armin Le Grand

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: 's avatarArmin Le Grand <Armin.Le.Grand@cib.de>
üst 1aa10fcb
...@@ -384,8 +384,14 @@ SdrObject* SdrObjList::NbcRemoveObject(size_t nObjNum) ...@@ -384,8 +384,14 @@ SdrObject* SdrObjList::NbcRemoveObject(size_t nObjNum)
pObj->GetViewContact().flushViewObjectContacts(); pObj->GetViewContact().flushViewObjectContacts();
DBG_ASSERT(pObj->IsInserted(),"The object does not have the status Inserted."); 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); SetParentAtSdrObjectFromSdrObjList(*pObj, nullptr);
// calls UserCall, among other
pObj->InsertedStateChange();
if (!mbObjOrdNumsDirty) if (!mbObjOrdNumsDirty)
{ {
// optimizing for the case that the last object has to be removed // optimizing for the case that the last object has to be removed
...@@ -426,9 +432,13 @@ SdrObject* SdrObjList::RemoveObject(size_t nObjNum) ...@@ -426,9 +432,13 @@ SdrObject* SdrObjList::RemoveObject(size_t nObjNum)
pObj->getSdrModelFromSdrObject().SetChanged(); 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); SetParentAtSdrObjectFromSdrObjList(*pObj, nullptr);
// calls, among other things, the UserCall
pObj->InsertedStateChange();
if (!mbObjOrdNumsDirty) if (!mbObjOrdNumsDirty)
{ {
// optimization for the case that the last object is removed // optimization for the case that the last object is removed
...@@ -475,18 +485,28 @@ SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, size_t nObjNum) ...@@ -475,18 +485,28 @@ SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, size_t nObjNum)
pObj->getSdrModelFromSdrObject().Broadcast(aHint); pObj->getSdrModelFromSdrObject().Broadcast(aHint);
} }
pObj->InsertedStateChange(); // Change parent and replace in SdrObjList
SetParentAtSdrObjectFromSdrObjList(*pObj, nullptr); SetParentAtSdrObjectFromSdrObjList(*pObj, nullptr);
ReplaceObjectInContainer(*pNewObj,nObjNum); 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(); pObj->GetViewContact().flushViewObjectContacts();
// Setup data at new SdrObject - it already *is* inserted to
// the SdrObjList due to 'ReplaceObjectInContainer' above
pNewObj->SetOrdNum(nObjNum); pNewObj->SetOrdNum(nObjNum);
SetParentAtSdrObjectFromSdrObjList(*pNewObj, this); SetParentAtSdrObjectFromSdrObjList(*pNewObj, this);
// Inform the parent about change to allow invalidations at // 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); impChildInserted(*pNewObj);
pNewObj->InsertedStateChange(); pNewObj->InsertedStateChange();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment