svx/source/svdraw/svdedtv2.cxx |   29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

New commits:
commit 4a46a74a3de0ac7df5d3ce949dda5e809c1729ab
Author:     Armin Le Grand (Allotropia) <[email protected]>
AuthorDate: Tue Mar 22 11:59:09 2022 +0100
Commit:     Armin Le Grand <[email protected]>
CommitDate: Tue Mar 22 16:15:33 2022 +0100

    Advanced Diagram support: Enhanced Ungroup for Diagram
    
    A Diagram has a 'filler' BG object as 1st object in the
    Group to guarantee the Diagram's dimensions. It has
    no FillStyle or LineStyle and is Move/Size-Protected.
    
    When Un-Grouping the Diagram and thus removing it's
    Diagram-Functionality that filler-BG Object is not
    useful and needs to be removed. Do that in an UNDO-
    supporting way to allow seamless UNDO/REDO actions.
    
    Change-Id: I1c5052de59dafb6ba1b35a68123bdabd10bf7885
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131930
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <[email protected]>

diff --git a/svx/source/svdraw/svdedtv2.cxx b/svx/source/svdraw/svdedtv2.cxx
index 0700847fe920..a046a6b3a59e 100644
--- a/svx/source/svdraw/svdedtv2.cxx
+++ b/svx/source/svdraw/svdedtv2.cxx
@@ -1910,12 +1910,36 @@ void SdrEditView::UnGroupMarked()
             }
             size_t nDstCnt=pGrp->GetOrdNum();
             SdrObjList* pDstLst=pM->GetPageView()->GetObjList();
+            size_t nObjCount=pSrcLst->GetObjCount();
+            auto* pGroup(dynamic_cast<SdrObjGroup*>(pGrp));
+            const bool bIsDiagram(nullptr != pGroup && pGroup->isDiagram());
+
+            // If the Group is a Diagram, it has a filler BG object to 
guarantee
+            // the Diagam's dimensions. Identify that shape & delete it, it is 
not
+            // useful for any further processing
+            if(bIsDiagram && nObjCount)
+            {
+                SdrObject* pObj(pSrcLst->GetObj(0));
+
+                if(nullptr != pObj && !pObj->IsGroupObject() &&
+                    !pObj->HasFillStyle() && !pObj->HasLineStyle() &&
+                    pObj->IsMoveProtect() && pObj->IsResizeProtect())
+                {
+                    if( bUndo )
+                        
AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoDeleteObject(*pObj));
+
+                    pObj = pSrcLst->RemoveObject(0);
+
+                    if( !bUndo )
+                        SdrObject::Free(pObj);
+
+                    nObjCount = pSrcLst->GetObjCount();
+                }
+            }
 
             // FIRST move contained objects to parent of group, so that
             // the contained objects are NOT migrated to the UNDO-ItemPool
             // when AddUndo(new SdrUndoDelObj(*pGrp)) is called.
-            const size_t nObjCount=pSrcLst->GetObjCount();
-
             if( bUndo )
             {
                 for (size_t no=nObjCount; no>0;)
@@ -1925,6 +1949,7 @@ void SdrEditView::UnGroupMarked()
                     
AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoRemoveObject(*pObj));
                 }
             }
+
             for (size_t no=0; no<nObjCount; ++no)
             {
                 SdrObject* pObj=pSrcLst->RemoveObject(0);

Reply via email to