summaryrefslogtreecommitdiff
path: root/sw/source/uibase
diff options
context:
space:
mode:
authorJim Raykowski <raykowj@gmail.com>2022-02-18 21:13:50 -0900
committerJim Raykowski <raykowj@gmail.com>2022-03-04 01:42:40 +0100
commit2b924f0d83ce63882e7d14a2b51cc645c2532920 (patch)
tree979015652abb21be48643ca18f4e227099c22a72 /sw/source/uibase
parent58f2c1e6ab3052e0746dabb36e6061125779b034 (diff)
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 <raykowj@gmail.com>
Diffstat (limited to 'sw/source/uibase')
-rw-r--r--sw/source/uibase/utlui/content.cxx45
1 files changed, 23 insertions, 22 deletions
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));