[Libreoffice-commits] core.git: svx/source

Armin Le Grand Armin.Le.Grand at cib.de
Fri May 11 09:12:51 UTC 2018


 svx/source/tbxctrls/fontworkgallery.cxx |   37 +++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 8 deletions(-)

New commits:
commit 9ddbd8e2bce697ce244a1f6161e8f45312f6e6b2
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
Date:   Wed May 9 19:34:16 2018 +0200

    tdf#116993 corrected FontWork to use correct SdrModel
    
    Had to adapt FontWorkGalleryDialog::insertSelectedFontwork()
    to use the correct target-SdrModel when cloning the FontWork
    SdrObject. This is due to FontWorkGalleryDialog being used
    differently from Calc - it calls SetSdrObjectRef to set an
    exceptional SdrModel as target which I took as the always
    to-be-used target SdrModel - due to it's name 'mpDestModel'.
    
    Change-Id: Ia4860283082f041711b8c31952fd2c398eeac30e
    Reviewed-on: https://gerrit.libreoffice.org/54045
    Reviewed-by: Armin Le Grand <Armin.Le.Grand at cib.de>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/svx/source/tbxctrls/fontworkgallery.cxx b/svx/source/tbxctrls/fontworkgallery.cxx
index d504705ce4c6..2efa87a1592d 100644
--- a/svx/source/tbxctrls/fontworkgallery.cxx
+++ b/svx/source/tbxctrls/fontworkgallery.cxx
@@ -197,29 +197,50 @@ void FontWorkGalleryDialog::insertSelectedFontwork()
             SdrPage* pPage = pModel->GetPage(0);
             if( pPage && pPage->GetObjCount() )
             {
-                // Clone directly to target SdrModel
-                SdrObject* pNewObject(pPage->GetObj(0)->CloneSdrObject(*mpDestModel));
+                // tdf#116993 Calc uses a 'special' mode for this dialog in being the
+                // only caller of ::SetSdrObjectRef. Only in that case mpDestModel seems
+                // to be the correct target SdrModel.
+                // If this is not used, the correct SdrModel seems to be the one from
+                // the mpSdrView that is used to insert (InsertObjectAtView below) the
+                // cloned SdrObject.
+                const bool bUseSpecialCalcMode(nullptr != mppSdrObject && nullptr != mpDestModel);
+                const bool bSdrViewInsertMode(nullptr != mpSdrView);
 
                 // center shape on current view
-                OutputDevice* pOutDev = mpSdrView->GetFirstOutputDevice();
-                if( pOutDev )
+                OutputDevice* pOutDev(mpSdrView->GetFirstOutputDevice());
+
+                if(pOutDev && (bUseSpecialCalcMode || bSdrViewInsertMode))
                 {
+                    // Clone directly to target SdrModel (may be different due to user/caller (!))
+                    SdrObject* pNewObject(
+                        pPage->GetObj(0)->CloneSdrObject(
+                            bUseSpecialCalcMode ? *mpDestModel : mpSdrView->getSdrModelFromSdrView()));
+
                     tools::Rectangle aObjRect( pNewObject->GetLogicRect() );
                     tools::Rectangle aVisArea = pOutDev->PixelToLogic(tools::Rectangle(Point(0,0), pOutDev->GetOutputSizePixel()));
                     Point aPagePos = aVisArea.Center();
                     aPagePos.AdjustX( -(aObjRect.GetWidth() / 2) );
                     aPagePos.AdjustY( -(aObjRect.GetHeight() / 2) );
                     tools::Rectangle aNewObjectRectangle(aPagePos, aObjRect.GetSize());
-                    SdrPageView* pPV = mpSdrView->GetSdrPageView();
                     pNewObject->SetLogicRect(aNewObjectRectangle);
 
-                    if ( mppSdrObject )
+                    if(bUseSpecialCalcMode)
                     {
                         *mppSdrObject = pNewObject;
                     }
-                    else if( pPV )
+                    else // bSdrViewInsertMode
                     {
-                        mpSdrView->InsertObjectAtView( pNewObject, *pPV );
+                        SdrPageView* pPV(mpSdrView->GetSdrPageView());
+
+                        if(nullptr != pPV)
+                        {
+                            mpSdrView->InsertObjectAtView( pNewObject, *pPV );
+                        }
+                        else
+                        {
+                            // tdf#116993 no target -> delete clone
+                            SdrObject::Free(pNewObject);
+                        }
                     }
                 }
             }


More information about the Libreoffice-commits mailing list