[Libreoffice-commits] core.git: Branch 'libreoffice-5-2' - sw/inc sw/source

Michael Stahl mstahl at redhat.com
Fri Jun 17 18:40:51 UTC 2016


 sw/inc/doc.hxx                     |    3 ++
 sw/inc/fesh.hxx                    |    3 ++
 sw/source/core/doc/docfly.cxx      |   54 +++++++++++++++++++++++++++++++++++++
 sw/source/core/frmedt/feshview.cxx |    6 ++++
 sw/source/uibase/utlui/content.cxx |    9 +++---
 5 files changed, 71 insertions(+), 4 deletions(-)

New commits:
commit 8389616baa8c03f878be5dfeb0a9f2db546bb66f
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Jun 16 22:04:26 2016 +0200

    sw: speed up the navigator
    
    The call to SwTextBoxHelper::findTextBoxes() in SwDoc::GetFlyNum() made
    this so unbelievably slow that in a dbgutil build opening the navigator
    on the bugdoc of tdf#94212 the UI freezes because getting all the fly
    frames takes longer than the 1 second timeout.
    
    Lets's not retrieve the flys one by one but instead all at once, which
    makes it usable again.
    
    Change-Id: Ic41c1648a82dcc3f758ae1b08bac6058f541f25e
    (cherry picked from commit 5593d9e1422cbf8a122fa612713a832274d30559)
    Reviewed-on: https://gerrit.libreoffice.org/26425
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Stahl <mstahl at redhat.com>

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index e9b3be5..edf5287 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -857,6 +857,9 @@ public:
     Iterate over Flys - for Basic-Collections. */
     size_t GetFlyCount( FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false ) const;
     SwFrameFormat* GetFlyNum(size_t nIdx, FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false );
+    std::vector<SwFrameFormat const*> GetFlyFrameFormats(
+            FlyCntType eType = FLYCNTTYPE_ALL,
+            bool bIgnoreTextBoxes = false);
 
     // Copy formats in own arrays and return them.
     SwFrameFormat  *CopyFrameFormat ( const SwFrameFormat& );
diff --git a/sw/inc/fesh.hxx b/sw/inc/fesh.hxx
index ac85192..a99b4e4 100644
--- a/sw/inc/fesh.hxx
+++ b/sw/inc/fesh.hxx
@@ -418,6 +418,9 @@ public:
     size_t GetFlyCount( FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false ) const;
     const SwFrameFormat* GetFlyNum(size_t nIdx, FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false) const;
 
+    std::vector<SwFrameFormat const*> GetFlyFrameFormats(
+            FlyCntType eType = FLYCNTTYPE_ALL, bool bIgnoreTextBoxes = false);
+
     /// If a fly is selected, it draws cursor into the first ContentFrame.
     const SwFrameFormat* SelFlyGrabCursor();
 
diff --git a/sw/source/core/doc/docfly.cxx b/sw/source/core/doc/docfly.cxx
index e749759..e1291b6 100644
--- a/sw/source/core/doc/docfly.cxx
+++ b/sw/source/core/doc/docfly.cxx
@@ -171,6 +171,60 @@ SwFrameFormat* SwDoc::GetFlyNum( size_t nIdx, FlyCntType eType, bool bIgnoreText
     return pRetFormat;
 }
 
+std::vector<SwFrameFormat const*> SwDoc::GetFlyFrameFormats(
+    FlyCntType const eType, bool const bIgnoreTextBoxes)
+{
+    SwFrameFormats& rFormats = *GetSpzFrameFormats();
+    const size_t nSize = rFormats.size();
+
+    std::set<const SwFrameFormat*> aTextBoxes;
+    if (bIgnoreTextBoxes)
+        aTextBoxes = SwTextBoxHelper::findTextBoxes(this);
+
+    std::vector<SwFrameFormat const*> ret;
+    ret.reserve(nSize);
+
+    for (size_t i = 0; i < nSize; ++i)
+    {
+        SwFrameFormat const*const pFlyFormat = rFormats[ i ];
+
+        if (bIgnoreTextBoxes && aTextBoxes.find(pFlyFormat) != aTextBoxes.end())
+        {
+            continue;
+        }
+
+        if (RES_FLYFRMFMT != pFlyFormat->Which())
+        {
+            continue;
+        }
+
+        SwNodeIndex const*const pIdx(pFlyFormat->GetContent().GetContentIdx());
+        if (pIdx && pIdx->GetNodes().IsDocNodes())
+        {
+            SwNode const*const pNd = GetNodes()[ pIdx->GetIndex() + 1 ];
+            switch (eType)
+            {
+            case FLYCNTTYPE_FRM:
+                if (!pNd->IsNoTextNode())
+                    ret.push_back(pFlyFormat);
+                break;
+            case FLYCNTTYPE_GRF:
+                if (pNd->IsGrfNode())
+                    ret.push_back(pFlyFormat);
+                break;
+            case FLYCNTTYPE_OLE:
+                if (pNd->IsOLENode())
+                    ret.push_back(pFlyFormat);
+                break;
+            default:
+                ret.push_back(pFlyFormat);
+            }
+        }
+    }
+
+    return ret;
+}
+
 static Point lcl_FindAnchorLayPos( SwDoc& rDoc, const SwFormatAnchor& rAnch,
                             const SwFrameFormat* pFlyFormat )
 {
diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx
index c921e7f..6c8f7c1 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -2332,6 +2332,12 @@ const SwFrameFormat*  SwFEShell::GetFlyNum(size_t nIdx, FlyCntType eType, bool b
     return GetDoc()->GetFlyNum(nIdx, eType, bIgnoreTextBoxes);
 }
 
+std::vector<SwFrameFormat const*> SwFEShell::GetFlyFrameFormats(
+        FlyCntType const eType, bool const bIgnoreTextBoxes)
+{
+    return GetDoc()->GetFlyFrameFormats(eType, bIgnoreTextBoxes);
+}
+
 // show the current selected object
 void SwFEShell::MakeSelVisible()
 {
diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx
index e1038a4..309304e 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -556,13 +556,14 @@ void SwContentType::FillMemberList(bool* pbLevelOrVisibilityChanged)
                 eType = FLYCNTTYPE_OLE;
             else if(nContentType == ContentTypeId::GRAPHIC)
                 eType = FLYCNTTYPE_GRF;
-            OSL_ENSURE(nMemberCount ==  pWrtShell->GetFlyCount(eType, /*bIgnoreTextBoxes=*/true),
-                    "MemberCount differs");
             Point aNullPt;
             nMemberCount = pWrtShell->GetFlyCount(eType, /*bIgnoreTextBoxes=*/true);
-            for(size_t i = 0; i < nMemberCount; ++i)
+            std::vector<SwFrameFormat const*> formats(pWrtShell->GetFlyFrameFormats(eType, /*bIgnoreTextBoxes=*/true));
+            SAL_WARN_IF(nMemberCount != formats.size(), "sw.ui", "MemberCount differs");
+            nMemberCount = formats.size();
+            for (size_t i = 0; i < nMemberCount; ++i)
             {
-                const SwFrameFormat* pFrameFormat = pWrtShell->GetFlyNum(i,eType,/*bIgnoreTextBoxes=*/true);
+                SwFrameFormat const*const pFrameFormat = formats[i];
                 const OUString sFrameName = pFrameFormat->GetName();
 
                 SwContent* pCnt;


More information about the Libreoffice-commits mailing list