include/svx/svdotext.hxx                               |    3 +-
 oox/source/export/drawingml.cxx                        |    2 -
 oox/source/export/vmlexport.cxx                        |    2 -
 sd/source/ui/slidesorter/controller/SlsSlotManager.cxx |    4 ---
 sd/source/ui/unoidl/unoobj.cxx                         |    3 --
 sd/source/ui/view/drviews7.cxx                         |    4 ---
 sd/source/ui/view/outlnvsh.cxx                         |    4 ---
 svx/source/accessibility/AccessibleShape.cxx           |   15 +-----------
 svx/source/inc/cell.hxx                                |    3 +-
 svx/source/sdr/primitive2d/sdrattributecreator.cxx     |    5 +---
 svx/source/svdraw/svdotext.cxx                         |   15 +++++++++---
 svx/source/table/accessiblecell.cxx                    |   12 ---------
 svx/source/table/cell.cxx                              |   21 ++++++++++-------
 svx/source/table/tablertfexporter.cxx                  |    2 -
 svx/source/unodraw/unoshtxt.cxx                        |   19 ++++++++++++++-
 sw/source/filter/ww8/rtfsdrexport.cxx                  |    2 -
 sw/source/filter/ww8/wrtw8esh.cxx                      |    2 -
 17 files changed, 61 insertions(+), 57 deletions(-)

New commits:
commit c075add8c86d11baba63a13c637b5b1a5a886283
Author:     Serge Krot <serge.k...@cib.de>
AuthorDate: Fri Jan 3 20:08:45 2020 +0100
Commit:     Thorsten Behrens <thorsten.behr...@cib.de>
CommitDate: Tue Apr 28 01:10:04 2020 +0200

    tdf#129708 speed-up: check if we could create outline instead of creation 
of it
    
    Conflicts:
            include/svx/svdotext.hxx
            oox/source/export/drawingml.cxx
            oox/source/export/vmlexport.cxx
            sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
            sd/source/ui/view/drviews7.cxx
            sd/source/ui/view/outlnvsh.cxx
            svx/source/accessibility/AccessibleShape.cxx
            svx/source/inc/cell.hxx
            svx/source/sdr/primitive2d/sdrattributecreator.cxx
            svx/source/svdraw/svdotext.cxx
            svx/source/table/accessiblecell.cxx
            svx/source/table/cell.cxx
            svx/source/table/tablertfexporter.cxx
            svx/source/unodraw/unoshtxt.cxx
            sw/source/filter/ww8/rtfsdrexport.cxx
            sw/source/filter/ww8/wrtw8esh.cxx
    
    Change-Id: I0629b4e6ccae4ab9be0142fe39c627f2f9a8f5ea
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86199
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92650
    Tested-by: Thorsten Behrens <thorsten.behr...@cib.de>

diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx
index 7be26b52d40f..8fccc05978c8 100644
--- a/include/svx/svdotext.hxx
+++ b/include/svx/svdotext.hxx
@@ -491,7 +491,8 @@ public:
     virtual void NbcSetOutlinerParaObject(OutlinerParaObject* pTextObject) 
override;
     void NbcSetOutlinerParaObjectForText( OutlinerParaObject* pTextObject, 
SdrText* pText );
     virtual OutlinerParaObject* GetOutlinerParaObject() const override;
-    OutlinerParaObject* GetEditOutlinerParaObject() const;
+    bool CanCreateEditOutlinerParaObject() const;
+    std::unique_ptr<OutlinerParaObject> CreateEditOutlinerParaObject() const;
 
     virtual void NbcReformatText() override;
     virtual void ReformatText() override;
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 943d5aed9add..b6249f535aa9 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -2490,7 +2490,7 @@ void DrawingML::WriteText( const Reference< XInterface >& 
rXIface, const OUStrin
         */
         if (pTxtObj->IsTextEditActive())
         {
-            pParaObj = pTxtObj->GetEditOutlinerParaObject();
+            pParaObj = pTxtObj->CreateEditOutlinerParaObject().release();
             bOwnParaObj = true;
         }
         else
diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx
index 2ec6992381a6..c3078b6cd983 100644
--- a/oox/source/export/vmlexport.cxx
+++ b/oox/source/export/vmlexport.cxx
@@ -1346,7 +1346,7 @@ sal_Int32 VMLExport::StartShape()
         */
         if (pTxtObj->IsTextEditActive())
         {
-            pParaObj = pTxtObj->GetEditOutlinerParaObject();
+            pParaObj = pTxtObj->CreateEditOutlinerParaObject().release();
             bOwnParaObj = true;
         }
         else
diff --git a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx 
b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
index 18b9b01b24cc..0c996d8dedf8 100644
--- a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
+++ b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
@@ -560,10 +560,8 @@ void SlotManager::GetMenuState (SfxItemSet& rSet)
                         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObj );
                         if( pTextObj )
                         {
-                            OutlinerParaObject* pParaObj = 
pTextObj->GetEditOutlinerParaObject();
-                            if( pParaObj )
+                            if( pTextObj->CanCreateEditOutlinerParaObject() )
                             {
-                                delete pParaObj;
                                 bDisable = false;
                             }
                         }
diff --git a/sd/source/ui/unoidl/unoobj.cxx b/sd/source/ui/unoidl/unoobj.cxx
index 72df58e77918..82152eef5577 100644
--- a/sd/source/ui/unoidl/unoobj.cxx
+++ b/sd/source/ui/unoidl/unoobj.cxx
@@ -891,8 +891,7 @@ bool SdXShape::IsEmptyPresObj() const
         if( pTextObj == nullptr )
             return true;
 
-        const std::unique_ptr<OutlinerParaObject> 
pParaObj(pTextObj->GetEditOutlinerParaObject());
-        return !pParaObj;
+        return !pTextObj->CanCreateEditOutlinerParaObject();
     }
 
     return false;
diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
index 230d75c2e853..43053b053aa7 100644
--- a/sd/source/ui/view/drviews7.cxx
+++ b/sd/source/ui/view/drviews7.cxx
@@ -378,10 +378,8 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
                         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObj );
                         if( pTextObj )
                         {
-                            OutlinerParaObject* pParaObj = 
pTextObj->GetEditOutlinerParaObject();
-                            if( pParaObj )
+                            if( pTextObj->CanCreateEditOutlinerParaObject() )
                             {
-                                delete pParaObj;
                                 bDisable = false;
                             }
                         }
diff --git a/sd/source/ui/view/outlnvsh.cxx b/sd/source/ui/view/outlnvsh.cxx
index 21ecec524955..c396fa0e2163 100644
--- a/sd/source/ui/view/outlnvsh.cxx
+++ b/sd/source/ui/view/outlnvsh.cxx
@@ -970,10 +970,8 @@ void OutlineViewShell::GetMenuState( SfxItemSet &rSet )
                         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObj );
                         if( pTextObj )
                         {
-                            OutlinerParaObject* pParaObj = 
pTextObj->GetEditOutlinerParaObject();
-                            if( pParaObj )
+                            if( pTextObj->CanCreateEditOutlinerParaObject() )
                             {
-                                delete pParaObj;
                                 bDisable = false;
                             }
                         }
diff --git a/svx/source/accessibility/AccessibleShape.cxx 
b/svx/source/accessibility/AccessibleShape.cxx
index da50d27cac19..2d09f0f4db18 100644
--- a/svx/source/accessibility/AccessibleShape.cxx
+++ b/svx/source/accessibility/AccessibleShape.cxx
@@ -158,18 +158,10 @@ void AccessibleShape::Init()
             if( pSdrObject )
             {
                 SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( pSdrObject  
);
-                OutlinerParaObject* pOutlinerParaObject = nullptr;
-
-                if( pTextObj )
-                    pOutlinerParaObject = 
pTextObj->GetEditOutlinerParaObject(); // Get the OutlinerParaObject if text 
edit is active
-
-                bool bOwnParaObj = pOutlinerParaObject != nullptr;
-
-                if( !pOutlinerParaObject && pSdrObject )
-                    pOutlinerParaObject = pSdrObject->GetOutlinerParaObject();
+                const bool hasOutlinerParaObject = 
pTextObj->CanCreateEditOutlinerParaObject() || 
pSdrObject->GetOutlinerParaObject() != nullptr;
 
                 // create AccessibleTextHelper to handle this shape's text
-                if( !pOutlinerParaObject )
+                if( !hasOutlinerParaObject )
                 {
                     // empty text -> use proxy edit source to delay creation 
of EditEngine
                     mpText.reset( new AccessibleTextHelper( 
o3tl::make_unique<AccessibleEmptyEditSource >(*pSdrObject, *pView, *pWindow) ) 
);
@@ -182,9 +174,6 @@ void AccessibleShape::Init()
                 if( pWindow->HasFocus() )
                     mpText->SetFocus();
 
-                if( bOwnParaObj )
-                    delete pOutlinerParaObject;
-
                 mpText->SetEventSource(this);
             }
         }
diff --git a/svx/source/inc/cell.hxx b/svx/source/inc/cell.hxx
index 2f9a9dfec8c7..0844aa1e6434 100644
--- a/svx/source/inc/cell.hxx
+++ b/svx/source/inc/cell.hxx
@@ -71,7 +71,8 @@ public:
     SVX_DLLPRIVATE const ::tools::Rectangle& getCellRect() const { return 
maCellRect; }
     SVX_DLLPRIVATE ::tools::Rectangle& getCellRect() { return maCellRect; }
 
-    OutlinerParaObject* GetEditOutlinerParaObject() const;
+    bool CanCreateEditOutlinerParaObject() const;
+    std::unique_ptr<OutlinerParaObject> CreateEditOutlinerParaObject() const;
     SVX_DLLPRIVATE void SetStyleSheet( SfxStyleSheet* pStyleSheet, bool 
bDontRemoveHardAttr );
     SVX_DLLPRIVATE virtual SfxStyleSheet* GetStyleSheet() const override;
     SVX_DLLPRIVATE void TakeTextAnchorRect(tools::Rectangle& rAnchorRect) 
const;
diff --git a/svx/source/sdr/primitive2d/sdrattributecreator.cxx 
b/svx/source/sdr/primitive2d/sdrattributecreator.cxx
index f66d789d7ddc..31f3d22170a1 100644
--- a/svx/source/sdr/primitive2d/sdrattributecreator.cxx
+++ b/svx/source/sdr/primitive2d/sdrattributecreator.cxx
@@ -545,17 +545,16 @@ namespace drawinglayer
 
                 if(bInEditMode)
                 {
-                    OutlinerParaObject* pTempObj = 
rTextObj.GetEditOutlinerParaObject();
+                    std::unique_ptr<OutlinerParaObject> pTempObj = 
rTextObj.CreateEditOutlinerParaObject();
 
                     if(pTempObj)
                     {
                         aOutlinerParaObject = *pTempObj;
-                        delete pTempObj;
                     }
                     else
                     {
                         // #i100537#
-                        // GetEditOutlinerParaObject() returning no object 
does not mean that
+                        // CreateEditOutlinerParaObject() returning no object 
does not mean that
                         // text edit mode is not active. Do not reset the flag 
here
                         // bInEditMode = false;
                     }
diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx
index 18b628b35991..19c1018d0be7 100644
--- a/svx/source/svdraw/svdotext.cxx
+++ b/svx/source/svdraw/svdotext.cxx
@@ -802,13 +802,22 @@ void SdrTextObj::TakeTextRect( SdrOutliner& rOutliner, 
tools::Rectangle& rTextRe
         rTextRect=aAnkRect;
 }
 
-OutlinerParaObject* SdrTextObj::GetEditOutlinerParaObject() const
+bool SdrTextObj::CanCreateEditOutlinerParaObject() const
 {
-    OutlinerParaObject* pPara=nullptr;
+    if( HasTextImpl( pEdtOutl ) )
+    {
+        return pEdtOutl->GetParagraphCount() > 0;
+    }
+    return false;
+}
+
+std::unique_ptr<OutlinerParaObject> SdrTextObj::CreateEditOutlinerParaObject() 
const
+{
+    std::unique_ptr<OutlinerParaObject> pPara;
     if( HasTextImpl( pEdtOutl ) )
     {
         sal_Int32 nParaCount = pEdtOutl->GetParagraphCount();
-        pPara = pEdtOutl->CreateParaObject(0, nParaCount);
+        pPara.reset(pEdtOutl->CreateParaObject(0, nParaCount));
     }
     return pPara;
 }
diff --git a/svx/source/table/accessiblecell.cxx 
b/svx/source/table/accessiblecell.cxx
index 08754ad21160..22452c359a38 100644
--- a/svx/source/table/accessiblecell.cxx
+++ b/svx/source/table/accessiblecell.cxx
@@ -71,15 +71,8 @@ void AccessibleCell::Init()
     const vcl::Window* pWindow = maShapeTreeInfo.GetWindow ();
     if( (pView != nullptr) && (pWindow != nullptr) && mxCell.is())
     {
-        OutlinerParaObject* pOutlinerParaObject = 
mxCell->GetEditOutlinerParaObject(); // Get the OutlinerParaObject if text edit 
is active
-
-        bool bOwnParaObject = pOutlinerParaObject != nullptr;
-
-        if( !pOutlinerParaObject )
-            pOutlinerParaObject = mxCell->GetOutlinerParaObject();
-
         // create AccessibleTextHelper to handle this shape's text
-        if( pOutlinerParaObject )
+        if( mxCell->CanCreateEditOutlinerParaObject() || 
mxCell->GetOutlinerParaObject() != nullptr )
         {
             // non-empty text -> use full-fledged edit source right away
 
@@ -88,9 +81,6 @@ void AccessibleCell::Init()
                 mpText->SetFocus();
             mpText->SetEventSource(this);
         }
-
-        if( bOwnParaObject)
-            delete pOutlinerParaObject;
     }
 }
 
diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx
index e402c483a5ba..dce86cd0c769 100644
--- a/svx/source/table/cell.cxx
+++ b/svx/source/table/cell.cxx
@@ -228,7 +228,7 @@ namespace sdr
 
             if( mxCell.is() )
             {
-                OutlinerParaObject* pParaObj = 
mxCell->GetEditOutlinerParaObject();
+                OutlinerParaObject* pParaObj = 
mxCell->CreateEditOutlinerParaObject().release();
 
                 const bool bOwnParaObj = pParaObj != nullptr;
 
@@ -308,7 +308,7 @@ namespace sdr
                 rObj.SetVerticalWriting(bVertical);
 
                 // Set a cell vertical property
-                OutlinerParaObject* pParaObj = 
mxCell->GetEditOutlinerParaObject();
+                OutlinerParaObject* pParaObj = 
mxCell->CreateEditOutlinerParaObject().release();
 
                 const bool bOwnParaObj = pParaObj != nullptr;
 
@@ -329,7 +329,7 @@ namespace sdr
                 const SvxTextRotateItem* pRotateItem = static_cast<const 
SvxTextRotateItem*>(pNewItem);
 
                 // Set a cell vertical property
-                OutlinerParaObject* pParaObj = 
mxCell->GetEditOutlinerParaObject();
+                OutlinerParaObject* pParaObj = 
mxCell->CreateEditOutlinerParaObject().release();
 
                 const bool bOwnParaObj = pParaObj != nullptr;
 
@@ -593,11 +593,9 @@ bool Cell::IsTextEditActive()
     SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
     if(rTableObj.getActiveCell().get() == this )
     {
-        OutlinerParaObject* pParaObj = rTableObj.GetEditOutlinerParaObject();
-        if( pParaObj != nullptr )
+        if( rTableObj.CanCreateEditOutlinerParaObject() )
         {
             isActive = true;
-            delete pParaObj;
         }
     }
     return isActive;
@@ -624,12 +622,19 @@ bool Cell::hasText() const
     return false;
 }
 
+bool Cell::CanCreateEditOutlinerParaObject() const
+{
+    SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
+    if( rTableObj.getActiveCell().get() == this )
+        return rTableObj.CanCreateEditOutlinerParaObject();
+    return false;
+}
 
-OutlinerParaObject* Cell::GetEditOutlinerParaObject() const
+std::unique_ptr<OutlinerParaObject> Cell::CreateEditOutlinerParaObject() const
 {
     SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
     if( rTableObj.getActiveCell().get() == this )
-        return rTableObj.GetEditOutlinerParaObject();
+        return rTableObj.CreateEditOutlinerParaObject();
     return nullptr;
 }
 
diff --git a/svx/source/table/tablertfexporter.cxx 
b/svx/source/table/tablertfexporter.cxx
index 37d793de6df3..748e7efe866d 100644
--- a/svx/source/table/tablertfexporter.cxx
+++ b/svx/source/table/tablertfexporter.cxx
@@ -174,7 +174,7 @@ void SdrTableRtfExporter::WriteCell( sal_Int32 nCol, 
sal_Int32 nRow )
 
     OUString aContent;
 
-    OutlinerParaObject* pParaObj = xCell->GetEditOutlinerParaObject();
+    OutlinerParaObject* pParaObj = 
xCell->CreateEditOutlinerParaObject().release();
     bool bOwnParaObj = pParaObj != nullptr;
 
     if( pParaObj == nullptr )
diff --git a/svx/source/unodraw/unoshtxt.cxx b/svx/source/unodraw/unoshtxt.cxx
index af313e15731e..105f9808e648 100644
--- a/svx/source/unodraw/unoshtxt.cxx
+++ b/svx/source/unodraw/unoshtxt.cxx
@@ -547,7 +547,7 @@ SvxTextForwarder* 
SvxTextEditSourceImpl::GetBackgroundTextForwarder()
         OutlinerParaObject* pOutlinerParaObject = nullptr;
         SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject  );
         if( pTextObj && pTextObj->getActiveText() == mpText )
-            pOutlinerParaObject = pTextObj->GetEditOutlinerParaObject(); // 
Get the OutlinerParaObject if text edit is active
+            pOutlinerParaObject = 
pTextObj->CreateEditOutlinerParaObject().release(); // Get the 
OutlinerParaObject if text edit is active
         bool bOwnParaObj(false);
 
         if( pOutlinerParaObject )
@@ -665,7 +665,24 @@ SvxTextForwarder* SvxTextEditSourceImpl::GetTextForwarder()
             return GetBackgroundTextForwarder();
     }
     else
+    {
+        // tdf#123470 if the text edit mode of the shape is active, then we
+        // cannot trust a previously cached TextForwarder state as the text may
+        // be out of date, so force a refetch in that case.
+        if (IsEditMode())
+        {
+            assert(!mbForwarderIsEditMode); // because without a view there is 
no other option except !mbForwarderIsEditMode
+            bool bTextEditActive = false;
+            SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(mpObject);
+            // similar to the GetBackgroundTextForwarder check, see if the 
text edit is active
+            if (pTextObj && pTextObj->getActiveText() == mpText && 
pTextObj->CanCreateEditOutlinerParaObject())
+                bTextEditActive = true; // text edit active
+            if (bTextEditActive)
+                mbDataValid = false;
+        }
+
         return GetBackgroundTextForwarder();
+    }
 }
 
 
diff --git a/sw/source/filter/ww8/rtfsdrexport.cxx 
b/sw/source/filter/ww8/rtfsdrexport.cxx
index c1b835194784..e299c704fdb4 100644
--- a/sw/source/filter/ww8/rtfsdrexport.cxx
+++ b/sw/source/filter/ww8/rtfsdrexport.cxx
@@ -617,7 +617,7 @@ sal_Int32 RtfSdrExport::StartShape()
         */
         if (pTextObj->IsTextEditActive())
         {
-            pOwnedParaObj.reset(pTextObj->GetEditOutlinerParaObject());
+            pOwnedParaObj = pTextObj->CreateEditOutlinerParaObject();
             pParaObj = pOwnedParaObj.get();
         }
         else
diff --git a/sw/source/filter/ww8/wrtw8esh.cxx 
b/sw/source/filter/ww8/wrtw8esh.cxx
index 278d459cdc53..bc74bf8232eb 100644
--- a/sw/source/filter/ww8/wrtw8esh.cxx
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -1319,7 +1319,7 @@ void WW8Export::WriteSdrTextObj(const SdrTextObj& 
rTextObj, sal_uInt8 nTyp)
     */
     if (rTextObj.IsTextEditActive())
     {
-        pParaObj = rTextObj.GetEditOutlinerParaObject();
+        pParaObj = rTextObj.CreateEditOutlinerParaObject().release();
         bOwnParaObj = true;
     }
     else
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to