include/svl/IndexedStyleSheets.hxx      |    1 
 include/svl/style.hxx                   |    1 
 svl/source/items/IndexedStyleSheets.cxx |   12 ++++++++++
 svl/source/items/style.cxx              |   36 ++++++++++++++++++--------------
 4 files changed, 35 insertions(+), 15 deletions(-)

New commits:
commit d6bdcff5f739179efdd060083dc7feef14e5ba4d
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Wed Apr 17 14:41:48 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu May 9 13:29:57 2024 +0200

    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.gran...@collabora.co.uk>
    Reviewed-by: Noel Grandin <noel.gran...@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.mcnam...@collabora.com>

diff --git a/include/svl/IndexedStyleSheets.hxx 
b/include/svl/IndexedStyleSheets.hxx
index 910acd9e2566..c58a4b736703 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 fc12dc0be74e..87c5563ed547 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 57e2dddbf1c1..3761f0e427ef 100644
--- a/svl/source/items/IndexedStyleSheets.cxx
+++ b/svl/source/items/IndexedStyleSheets.cxx
@@ -82,6 +82,18 @@ sal_Int32 IndexedStyleSheets::GetNumberOfStyleSheets() const
     return mStyleSheets.size();
 }
 
+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)
 {
diff --git a/svl/source/items/style.cxx b/svl/source/items/style.cxx
index 41551e506498..bfdbac6f3f93 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
 {

Reply via email to