svx/source/sdr/contact/objectcontactofpageview.cxx | 31 ++++++++++++++++----- 1 file changed, 25 insertions(+), 6 deletions(-)
New commits: commit 4d4fa2f3f131631f97d49883a4983f90611429b2 Author: Armin Le Grand (allotropia) <armin.le.grand.ext...@allotropia.de> AuthorDate: Wed Jul 5 16:02:26 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Fri Jul 7 10:44:29 2023 +0200 tdf#122735 get the correct ActiveViewContact In ObjectContactOfPageView::getActiveViewContact() the decision which ViewContact is to be returned depends on if the SdrObjList fetched from the SdrPageView is a SdrObject or a SdrPage. Both are derived from SdrObjList, so to decide that the helpers getSdrObjectFromSdrObjList and getSdrPageFromSdrObjList are used. For SdrObject the 1st will return ptr, 2nd nullptr. For SdrPage the 1st and 2nd will return ptr due to 1st trying to return something useful by getting up the hierarchy and return the SdrPage the SdrObjList/SdrObject is inserted (as the name says). This means that here the test for SdrObject *has* to be used 1st to correctly decide of what nature SdrObjList is. NOTE: Here it would also be possible to use dynamic_cast(s) to the classes to test for, but tooling is virtual/faster. Change-Id: I113afceddd3210aa63960d248f7c7356f82cf413 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154065 Tested-by: Jenkins Reviewed-by: Armin Le Grand <armin.le.gr...@me.com> (cherry picked from commit 2dde0bf99ed11feb32d361303bb15fbd6d33ec0e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154124 Reviewed-by: Stéphane Guillou <stephane.guil...@libreoffice.org> Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/svx/source/sdr/contact/objectcontactofpageview.cxx b/svx/source/sdr/contact/objectcontactofpageview.cxx index ce0ca6463370..e07cf01bb86c 100644 --- a/svx/source/sdr/contact/objectcontactofpageview.cxx +++ b/svx/source/sdr/contact/objectcontactofpageview.cxx @@ -303,15 +303,34 @@ namespace sdr::contact if(pActiveGroupList) { - if(nullptr != pActiveGroupList->getSdrPageFromSdrObjList()) + // tdf#122735 + // Here it is necessary to check for SdrObject 1st, that may + // return nullptr if it is not a SdrObject/SdrObjGroup. + // Checking for SrPage OTOH will *always* try to return + // something useful due to SdrObjGroup::getSdrPageFromSdrObjList + // using getSdrPageFromSdrObject which will recursively go up the + // hierarchy to get the SdrPage the SdrObject belongs to, so + // this will *not* be nullptr for e.g. a SdrObjGroup if the + // SdrObjGroup is inserted to a SdrPage. + // NOTE: It is also possible to use dynamic_cast<SdrObjGroup*> + // here, but getSdrObjectFromSdrObjList and + // getSdrPageFromSdrObjListexist to not need to do that + SdrObject* pSdrObject(pActiveGroupList->getSdrObjectFromSdrObjList()); + + if(nullptr != pSdrObject) { - // It's a Page itself - return &(pActiveGroupList->getSdrPageFromSdrObjList()->GetViewContact()); + // It is a group object + return &(pSdrObject->GetViewContact()); } - else if(pActiveGroupList->getSdrObjectFromSdrObjList()) + else { - // Group object - return &(pActiveGroupList->getSdrObjectFromSdrObjList()->GetViewContact()); + SdrPage* pSdrPage(pActiveGroupList->getSdrPageFromSdrObjList()); + + if(nullptr != pSdrPage) + { + // It's a Page itself + return &(pSdrPage->GetViewContact()); + } } } else if(GetSdrPage())