sw/source/uibase/utlui/content.cxx |   45 ++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 22 deletions(-)

New commits:
commit 2b924f0d83ce63882e7d14a2b51cc645c2532920
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Fri Feb 18 21:13:50 2022 -0900
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Fri Mar 4 01:42:40 2022 +0100

    SwNavigator: speed up footnote endnote content fill
    
    Reduces the time to fill the footnote endnote content array by avoiding
    SwFormatFootnote::GetFootnoteText which calls the somewhat time
    consuming SwTextNode::GetExpandText. Just calling SwTextNode::GetText
    to get the footnote endnote first paragraph text should be good enough
    here.
    
    Testing with debug and optimized builds on a test document with 6243
    footnotes and endnotes shows a relative average differene of 10000 μs
    between use of lcl_GetFootnoteText, introduced by this patch, versus
    the current use of SwFormatFootnote::GetFootnoteText.
    
    Change-Id: I6a870c0700a3e64348e5550a0fc129eabf1b1d44
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130182
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>

diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index 7fa9c9fa5fb2..e0b3fbd16d69 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -178,6 +178,15 @@ namespace
     {
         return IDocumentMarkAccess::GetType(*pMark) == 
IDocumentMarkAccess::MarkType::BOOKMARK;
     }
+
+    OUString lcl_GetFootnoteText(const SwTextFootnote& rTextFootnote)
+    {
+        SwNodeIndex aIdx(*rTextFootnote.GetStartNode(), 1);
+        SwContentNode* pCNd = aIdx.GetNode().GetTextNode();
+        if(!pCNd)
+            pCNd = aIdx.GetNodes().GoNext(&aIdx);
+        return pCNd->IsTextNode() ? static_cast<SwTextNode*>(pCNd)->GetText() 
: OUString();
+    }
 }
 
 // Content, contains names and reference at the content type.
@@ -620,34 +629,26 @@ void SwContentType::FillMemberList(bool* pbContentChanged)
         case ContentTypeId::FOOTNOTE:
         {
             const SwFootnoteIdxs& rFootnoteIdxs = 
m_pWrtShell->GetDoc()->GetFootnoteIdxs();
+            if (rFootnoteIdxs.size() == 0)
+                break;
             size_t nFootnoteCount = 0;
-            for (SwTextFootnote* pTextFootnote : rFootnoteIdxs)
+            for (const SwTextFootnote* pTextFootnote : rFootnoteIdxs)
                 if (!pTextFootnote->GetFootnote().IsEndNote())
                     ++nFootnoteCount;
             // insert a separator bar between footnote and endnote entries
-            if (rFootnoteIdxs.size())
-            {
-                std::unique_ptr<SwTextFootnoteContent> pCnt(new 
SwTextFootnoteContent(
-                                                            this, 
"-------------------------------",
-                                                            nullptr, 
nFootnoteCount + 1));
-                pCnt->SetInvisible();
-                m_pMember->insert(std::move(pCnt));
-            }
-            tools::Long nPos = 0, nInsertPos = 0;
-            for (SwTextFootnote* pTextFootnote : rFootnoteIdxs)
+            auto pSeparatorBar(make_unique<SwTextFootnoteContent>(this,
+                "-------------------------------", nullptr, nFootnoteCount + 
1));
+            pSeparatorBar->SetInvisible();
+            m_pMember->insert(std::move(pSeparatorBar));
+            // insert footnotes and endnotes
+            tools::Long nPos = 0;
+            for (const SwTextFootnote* pTextFootnote : rFootnoteIdxs)
             {
                 const SwFormatFootnote& rFormatFootnote = 
pTextFootnote->GetFootnote();
-                const OUString& sText =
-                        rFormatFootnote.GetViewNumStr(*m_pWrtShell->GetDoc(),
-                                                      
m_pWrtShell->GetLayout(), true) + " " +
-                        
rFormatFootnote.GetFootnoteText(*m_pWrtShell->GetLayout());
-                if (rFormatFootnote.IsEndNote())
-                    nInsertPos = nPos + nFootnoteCount + 2;
-                else
-                    nInsertPos = ++nPos;
-                std::unique_ptr<SwTextFootnoteContent> pCnt(new 
SwTextFootnoteContent(
-                                                                this, sText, 
pTextFootnote,
-                                                                nInsertPos));
+                const OUString& sText = 
rFormatFootnote.GetViewNumStr(*m_pWrtShell->GetDoc(),
+                    m_pWrtShell->GetLayout(), true) + " " + 
lcl_GetFootnoteText(*pTextFootnote);
+                auto pCnt(make_unique<SwTextFootnoteContent>(this, sText, 
pTextFootnote,
+                    rFormatFootnote.IsEndNote() ? nPos + nFootnoteCount + 2 : 
++nPos));
                 if 
(!pTextFootnote->GetTextNode().getLayoutFrame(m_pWrtShell->GetLayout()))
                     pCnt->SetInvisible();
                 m_pMember->insert(std::move(pCnt));

Reply via email to