tdf#160706 speed up loading conditional formatting rule in XLS (II)
Reduce the work we do in IndexedStyleSheets::Reindex
takes my test document from 117s to 48s
Change-Id: I2e23b05684d0f2e3a9dc05c0a0fc4e9bbea7008d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166180
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
(cherry picked from commit 5060893f0b69c094beae73ab1a0926e3feb249b2)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167078
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
diff --git a/include/svl/IndexedStyleSheets.hxx b/include/svl/IndexedStyleSheets.hxx
index 910acd9..c58a4b7 100644
--- a/include/svl/IndexedStyleSheets.hxx
+++ b/include/svl/IndexedStyleSheets.hxx
@@ -144,6 +144,7 @@ public:
void Clear(StyleSheetDisposer& cleanup);
void Reindex();
void ReindexOnNameChange(const OUString& rOldName, const OUString& rNewName);
/** Warning: counting for n starts at 0, i.e., the 0th style sheet is the first that is found. */
SfxStyleSheetBase* GetNthStyleSheetThatMatchesPredicate(sal_Int32 n,
diff --git a/include/svl/style.hxx b/include/svl/style.hxx
index fc12dc0..87c5563 100644
--- a/include/svl/style.hxx
+++ b/include/svl/style.hxx
@@ -275,6 +275,7 @@ public:
virtual SfxStyleSheetBase* Find( const OUString&, SfxStyleFamily eFam, SfxStyleSearchBits n=SfxStyleSearchBits::All );
void Reindex();
void ReindexOnNameChange(const OUString& rOldName, const OUString& rNewName);
/** Add a style sheet.
* Not an actual public function. Do not call it from non-subclasses.
*/
diff --git a/svl/source/items/IndexedStyleSheets.cxx b/svl/source/items/IndexedStyleSheets.cxx
index 57e2ddd..3761f0e 100644
--- a/svl/source/items/IndexedStyleSheets.cxx
+++ b/svl/source/items/IndexedStyleSheets.cxx
@@ -83,6 +83,18 @@ sal_Int32 IndexedStyleSheets::GetNumberOfStyleSheets() const
}
void
IndexedStyleSheets::ReindexOnNameChange(const OUString& rOldName, const OUString& rNewName)
{
auto it = mPositionsByName.find(rOldName);
if (it != mPositionsByName.end())
{
unsigned nPos = it->second;
mPositionsByName.erase(it);
mPositionsByName.insert(std::make_pair(rNewName, nPos));
}
}
void
IndexedStyleSheets::AddStyleSheet(const rtl::Reference< SfxStyleSheetBase >& style)
{
if (!HasStyleSheet(style)) {
diff --git a/svl/source/items/style.cxx b/svl/source/items/style.cxx
index 41551e5..bfdbac6 100644
--- a/svl/source/items/style.cxx
+++ b/svl/source/items/style.cxx
@@ -163,24 +163,24 @@ bool SfxStyleSheetBase::SetName(const OUString& rName, bool bReIndexNow)
if(rName.isEmpty())
return false;
if( aName != rName )
{
OUString aOldName = aName;
SfxStyleSheetBase *pOther = m_pPool->Find( rName, nFamily ) ;
if ( pOther && pOther != this )
return false;
if( aName == rName )
return true;
if ( !aName.isEmpty() )
m_pPool->ChangeParent(aName, rName, nFamily, false);
OUString aOldName = aName;
SfxStyleSheetBase *pOther = m_pPool->Find( rName, nFamily ) ;
if ( pOther && pOther != this )
return false;
if ( aFollow == aName )
aFollow = rName;
aName = rName;
if (bReIndexNow)
m_pPool->Reindex();
if ( !aName.isEmpty() )
m_pPool->ChangeParent(aName, rName, nFamily, false);
m_pPool->Broadcast( SfxStyleSheetModifiedHint( aOldName, *this ) );
}
if ( aFollow == aName )
aFollow = rName;
aName = rName;
if (bReIndexNow)
m_pPool->ReindexOnNameChange(aOldName, rName);
m_pPool->Broadcast( SfxStyleSheetModifiedHint( aOldName, *this ) );
return true;
}
@@ -890,6 +890,12 @@ SfxStyleSheetBasePool::Reindex()
pImpl->mxIndexedStyleSheets->Reindex();
}
void
SfxStyleSheetBasePool::ReindexOnNameChange(const OUString& rOldName, const OUString& rNewName)
{
pImpl->mxIndexedStyleSheets->ReindexOnNameChange(rOldName, rNewName);
}
const svl::IndexedStyleSheets&
SfxStyleSheetBasePool::GetIndexedStyleSheets() const
{