summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-05-30 12:12:43 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-05-30 14:05:40 +0200
commit5a74ef3d249ea88cf0bf1f333014809f652a6a41 (patch)
tree2e018ff34bf67f93b145105b73ba415c8bd24bc3
parent460cf721da261e6c9d7388fd4cddf4b66fc7b1b7 (diff)
tdf#125372 writer, file with lots of hints very slow to open, part7
Takes load time from 1m45 to 22s Instead of (1) taking a list of SwTextAttrs (2) invoking a method that inserts a new one (3) taking a new list and doing a delta on the list, just the information about the new SwTextAttr up the stack and avoid all that work. Change-Id: Iec88618af696299aaba65f43bc33b1a5f030fac0 Reviewed-on: https://gerrit.libreoffice.org/73195 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r--sw/inc/IDocumentContentOperations.hxx4
-rw-r--r--sw/inc/ndtxt.hxx3
-rw-r--r--sw/source/core/doc/DocumentContentOperationsManager.cxx20
-rw-r--r--sw/source/core/inc/DocumentContentOperationsManager.hxx3
-rw-r--r--sw/source/core/inc/rolbck.hxx3
-rw-r--r--sw/source/core/txtnode/thints.cxx6
-rw-r--r--sw/source/core/undo/rolbck.cxx5
-rw-r--r--sw/source/core/unocore/unoidx.cxx41
8 files changed, 35 insertions, 50 deletions
diff --git a/sw/inc/IDocumentContentOperations.hxx b/sw/inc/IDocumentContentOperations.hxx
index f0b7a8d88497..f59b1f0eef89 100644
--- a/sw/inc/IDocumentContentOperations.hxx
+++ b/sw/inc/IDocumentContentOperations.hxx
@@ -38,6 +38,7 @@ class SwDrawFrameFormat;
class SwFlyFrameFormat;
class SwNodeIndex;
class SwRootFrame;
+class SwTextAttr;
namespace utl { class TransliterationWrapper; }
namespace svt { class EmbeddedObjectRef; }
@@ -215,7 +216,8 @@ public:
virtual bool InsertPoolItem(const SwPaM &rRg, const SfxPoolItem&,
const SetAttrMode nFlags = SetAttrMode::DEFAULT,
SwRootFrame const* pLayout = nullptr,
- bool bExpandCharToPara=false) = 0;
+ bool bExpandCharToPara = false,
+ SwTextAttr **ppNewTextAttr = nullptr) = 0;
virtual void InsertItemSet (const SwPaM &rRg, const SfxItemSet&,
const SetAttrMode nFlags = SetAttrMode::DEFAULT,
diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx
index debe937dd0bf..d8ab09b60f23 100644
--- a/sw/inc/ndtxt.hxx
+++ b/sw/inc/ndtxt.hxx
@@ -295,7 +295,8 @@ public:
set them only in AutoAttrSet (SwContentNode::SetAttr). */
bool SetAttr( const SfxItemSet& rSet,
sal_Int32 nStt, sal_Int32 nEnd,
- const SetAttrMode nMode = SetAttrMode::DEFAULT );
+ const SetAttrMode nMode = SetAttrMode::DEFAULT,
+ SwTextAttr **ppNewTextAttr = nullptr);
/** Query the attributes of textnode over the range.
Introduce 4th optional parameter <bMergeIndentValuesOfNumRule>.
If <bMergeIndentValuesOfNumRule> == true, the indent attributes of
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 7e2d3e415148..f15bb96ba7ae 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -1101,7 +1101,8 @@ namespace //local functions originally from docfmt.cxx
const SetAttrMode nFlags,
SwUndoAttr *const pUndo,
SwRootFrame const*const pLayout,
- const bool bExpandCharToPara=false)
+ const bool bExpandCharToPara,
+ SwTextAttr **ppNewTextAttr)
{
// Divide the Sets (for selections in Nodes)
const SfxItemSet* pCharSet = nullptr;
@@ -1233,7 +1234,7 @@ namespace //local functions originally from docfmt.cxx
{
SwRegHistory history( pNode, *pNode, pHistory );
bRet = history.InsertItems(
- aTextSet, rSt.GetIndex(), rSt.GetIndex(), nFlags ) || bRet;
+ aTextSet, rSt.GetIndex(), rSt.GetIndex(), nFlags, /*ppNewTextAttr*/nullptr ) || bRet;
if (bRet && (pDoc->getIDocumentRedlineAccess().IsRedlineOn() || (!pDoc->getIDocumentRedlineAccess().IsIgnoreRedline()
&& !pDoc->getIDocumentRedlineAccess().GetRedlineTable().empty())))
@@ -1272,7 +1273,7 @@ namespace //local functions originally from docfmt.cxx
? pEnd->nContent.GetIndex()
: pNode->Len();
SwRegHistory history( pNode, *pNode, pHistory );
- bRet = history.InsertItems( aTextSet, nInsCnt, nEnd, nFlags )
+ bRet = history.InsertItems( aTextSet, nInsCnt, nEnd, nFlags, ppNewTextAttr )
|| bRet;
if (bRet && (pDoc->getIDocumentRedlineAccess().IsRedlineOn() || (!pDoc->getIDocumentRedlineAccess().IsIgnoreRedline()
@@ -1474,7 +1475,7 @@ namespace //local functions originally from docfmt.cxx
// the SwRegHistory inserts the attribute into the TextNode!
SwRegHistory history( pNode, *pNode, pHistory );
- bRet = history.InsertItems( *pCharSet, nMkPos, nPtPos, nFlags )
+ bRet = history.InsertItems( *pCharSet, nMkPos, nPtPos, nFlags, /*ppNewTextAttr*/nullptr )
|| bRet;
if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() )
@@ -1528,7 +1529,7 @@ namespace //local functions originally from docfmt.cxx
{
SwRegHistory history( pNode, *pNode, pHistory );
bRet = history.InsertItems(*pCharSet,
- pStt->nContent.GetIndex(), aCntEnd.GetIndex(), nFlags)
+ pStt->nContent.GetIndex(), aCntEnd.GetIndex(), nFlags, /*ppNewTextAttr*/nullptr)
|| bRet;
}
@@ -1588,7 +1589,7 @@ namespace //local functions originally from docfmt.cxx
{
SwRegHistory history( pNode, *pNode, pHistory );
(void)history.InsertItems(*pCharSet,
- 0, aCntEnd.GetIndex(), nFlags);
+ 0, aCntEnd.GetIndex(), nFlags, /*ppNewTextAttr*/nullptr);
}
if( pOtherSet && pOtherSet->Count() )
@@ -3214,7 +3215,8 @@ bool DocumentContentOperationsManager::InsertPoolItem(
const SfxPoolItem &rHt,
const SetAttrMode nFlags,
SwRootFrame const*const pLayout,
- const bool bExpandCharToPara)
+ const bool bExpandCharToPara,
+ SwTextAttr **ppNewTextAttr)
{
if (utl::ConfigManager::IsFuzzing())
return false;
@@ -3229,7 +3231,7 @@ bool DocumentContentOperationsManager::InsertPoolItem(
SfxItemSet aSet( m_rDoc.GetAttrPool(), {{rHt.Which(), rHt.Which()}} );
aSet.Put( rHt );
- const bool bRet = lcl_InsAttr(&m_rDoc, rRg, aSet, nFlags, pUndoAttr.get(), pLayout, bExpandCharToPara);
+ const bool bRet = lcl_InsAttr(&m_rDoc, rRg, aSet, nFlags, pUndoAttr.get(), pLayout, bExpandCharToPara, ppNewTextAttr);
if (m_rDoc.GetIDocumentUndoRedo().DoesUndo())
{
@@ -3254,7 +3256,7 @@ void DocumentContentOperationsManager::InsertItemSet ( const SwPaM &rRg, const S
pUndoAttr.reset(new SwUndoAttr( rRg, rSet, nFlags ));
}
- bool bRet = lcl_InsAttr(&m_rDoc, rRg, rSet, nFlags, pUndoAttr.get(), pLayout);
+ bool bRet = lcl_InsAttr(&m_rDoc, rRg, rSet, nFlags, pUndoAttr.get(), pLayout, /*bExpandCharToPara*/false, /*ppNewTextAttr*/nullptr );
if (m_rDoc.GetIDocumentUndoRedo().DoesUndo())
{
diff --git a/sw/source/core/inc/DocumentContentOperationsManager.hxx b/sw/source/core/inc/DocumentContentOperationsManager.hxx
index e276d4e61238..f02bf2fb46e7 100644
--- a/sw/source/core/inc/DocumentContentOperationsManager.hxx
+++ b/sw/source/core/inc/DocumentContentOperationsManager.hxx
@@ -89,7 +89,8 @@ public:
bool InsertPoolItem(const SwPaM &rRg, const SfxPoolItem&,
const SetAttrMode nFlags = SetAttrMode::DEFAULT,
SwRootFrame const* pLayout = nullptr,
- bool bExpandCharToPara=false) override;
+ bool bExpandCharToPara = false,
+ SwTextAttr **ppNewTextAttr = nullptr) override;
void InsertItemSet (const SwPaM &rRg, const SfxItemSet&,
const SetAttrMode nFlags = SetAttrMode::DEFAULT,
diff --git a/sw/source/core/inc/rolbck.hxx b/sw/source/core/inc/rolbck.hxx
index eafb74fb303d..5a1613efb4df 100644
--- a/sw/source/core/inc/rolbck.hxx
+++ b/sw/source/core/inc/rolbck.hxx
@@ -416,7 +416,8 @@ public:
/// @return true if at least 1 item was inserted
bool InsertItems( const SfxItemSet& rSet,
sal_Int32 const nStart, sal_Int32 const nEnd,
- SetAttrMode const nFlags );
+ SetAttrMode const nFlags,
+ SwTextAttr **ppNewTextAttr );
void AddHint( SwTextAttr* pHt, const bool bNew );
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index a53ae1cf0593..3d55ed251f2b 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -1836,7 +1836,8 @@ bool SwTextNode::SetAttr(
const SfxItemSet& rSet,
const sal_Int32 nStt,
const sal_Int32 nEnd,
- const SetAttrMode nMode )
+ const SetAttrMode nMode,
+ SwTextAttr **ppNewTextAttr )
{
if( !rSet.Count() )
return false;
@@ -1931,6 +1932,9 @@ bool SwTextNode::SetAttr(
const_cast<SfxPoolItem&>(*pItem), nStt, nEnd );
if ( pNew )
{
+ // store the first one we create into the pp
+ if (ppNewTextAttr && !*ppNewTextAttr)
+ *ppNewTextAttr = pNew;
if ( nEnd != nStt && !pNew->GetEnd() )
{
OSL_FAIL("Attribute without end, but area marked");
diff --git a/sw/source/core/undo/rolbck.cxx b/sw/source/core/undo/rolbck.cxx
index 1fc7850b6de1..48fe37b27b7a 100644
--- a/sw/source/core/undo/rolbck.cxx
+++ b/sw/source/core/undo/rolbck.cxx
@@ -1350,7 +1350,8 @@ void SwRegHistory::AddHint( SwTextAttr* pHt, const bool bNew )
}
bool SwRegHistory::InsertItems( const SfxItemSet& rSet,
- sal_Int32 const nStart, sal_Int32 const nEnd, SetAttrMode const nFlags )
+ sal_Int32 const nStart, sal_Int32 const nEnd, SetAttrMode const nFlags,
+ SwTextAttr **ppNewTextAttr )
{
if( !rSet.Count() )
return false;
@@ -1367,7 +1368,7 @@ bool SwRegHistory::InsertItems( const SfxItemSet& rSet,
pTextNode->GetOrCreateSwpHints().Register(this);
}
- const bool bInserted = pTextNode->SetAttr( rSet, nStart, nEnd, nFlags );
+ const bool bInserted = pTextNode->SetAttr( rSet, nStart, nEnd, nFlags, ppNewTextAttr );
// Caution: The array can be deleted when inserting an attribute!
// This can happen when the value that should be added first deletes
diff --git a/sw/source/core/unocore/unoidx.cxx b/sw/source/core/unocore/unoidx.cxx
index 31c1474f84c7..6ac2e5f33232 100644
--- a/sw/source/core/unocore/unoidx.cxx
+++ b/sw/source/core/unocore/unoidx.cxx
@@ -1944,44 +1944,17 @@ void SwXDocumentIndexMark::Impl::InsertTOXMark(
| SetAttrMode::DONTEXPAND)
: SetAttrMode::DONTEXPAND;
- std::vector<SwTextAttr *> oldMarks;
- if (bMark)
- {
- oldMarks = rPam.GetNode().GetTextNode()->GetTextAttrsAt(
- rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_TOXMARK);
- }
-
- pDoc->getIDocumentContentOperations().InsertPoolItem(rPam, rMark, nInsertFlags);
+ // rMark gets copied into the document pool;
+ // pNewTextAttr comes back with the real format
+ SwTextAttr *pNewTextAttr = nullptr;
+ pDoc->getIDocumentContentOperations().InsertPoolItem(rPam, rMark, nInsertFlags,
+ /*pLayout*/nullptr, /*bExpandCharToPara*/false, &pNewTextAttr);
if (bMark && *rPam.GetPoint() > *rPam.GetMark())
{
rPam.Exchange();
}
- // rMark was copied into the document pool; now retrieve real format...
- SwTextAttr * pTextAttr(nullptr);
- if (bMark)
- {
- // #i107672#
- // ensure that we do not retrieve a different mark at the same position
- std::vector<SwTextAttr *> const newMarks(
- rPam.GetNode().GetTextNode()->GetTextAttrsAt(
- rPam.GetPoint()->nContent.GetIndex(), RES_TXTATR_TOXMARK));
- std::vector<SwTextAttr *>::const_iterator const iter(
- std::find_if(newMarks.begin(), newMarks.end(),
- NotContainedIn<SwTextAttr *>(oldMarks)));
- assert(newMarks.end() != iter);
- if (newMarks.end() != iter)
- {
- pTextAttr = *iter;
- }
- }
- else
- {
- pTextAttr = rPam.GetNode().GetTextNode()->GetTextAttrForCharAt(
- rPam.GetPoint()->nContent.GetIndex()-1, RES_TXTATR_TOXMARK );
- }
-
- if (!pTextAttr)
+ if (!pNewTextAttr)
{
throw uno::RuntimeException(
"SwXDocumentIndexMark::InsertTOXMark(): cannot insert attribute",
@@ -1989,7 +1962,7 @@ void SwXDocumentIndexMark::Impl::InsertTOXMark(
}
m_pDoc = pDoc;
- m_pTOXMark = &pTextAttr->GetTOXMark();
+ m_pTOXMark = &pNewTextAttr->GetTOXMark();
m_pTOXType = &rTOXType;
m_aListener.EndListeningAll();
m_aListener.StartListening(const_cast<SwTOXMark*>(m_pTOXMark));