sw/qa/uitest/writer_tests7/tdf144439.py |   22 ++++++++++++++++++++
 sw/source/core/doc/number.cxx           |   35 +++++++++++++-------------------
 2 files changed, 37 insertions(+), 20 deletions(-)

New commits:
commit 6ecf8fbb2c2422df78b55acaa436ee14a3dca4b6
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Tue Dec 19 11:40:24 2023 +0200
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Jan 10 10:29:36 2024 +0600

    tdf#154864 Changing starting number of numbered list does nothing
    
    regression from
        commit cd3c16fbcb4f8e5e4c4448bc7cda96e8476d6aec
        Author: Noel Grandin <noel.gran...@collabora.co.uk>
        Date:   Fri Oct 14 15:14:13 2022 +0200
        tdf#129101 CTRL+A & Cut very slow
        avoid repeated invalidation of number tree, shaves 90% time off
    
    The problem is that, after the above change, InvalidateListTree is not
    called late enough to force invalidation of all necessary stuff.
    
    So simply delay that until we do re-validation in SwNumRule::Validate.
    
    Change-Id: I796cc34fe7d66d4876ee06286a8af7029a759eca
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160974
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/qa/uitest/writer_tests7/tdf144439.py 
b/sw/qa/uitest/writer_tests7/tdf144439.py
index 34911ee4c542..4d0ce465d5ac 100644
--- a/sw/qa/uitest/writer_tests7/tdf144439.py
+++ b/sw/qa/uitest/writer_tests7/tdf144439.py
@@ -40,6 +40,28 @@ class tdf144439(UITestCase):
             self.assertEqual(Para1.String, "List item")
             self.assertEqual(Para1.getPropertyValue("ListLabelString"), "1.1.")
 
+            # this section is checking tdf#154864 - Changing starting number 
of numbered list does nothing
+            #
+
+            with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog") 
as xDialog:
+                # Select custom tab
+                xTabs = xDialog.getChild("tabcontrol")
+                select_pos(xTabs, "5")
+
+                # Select numbering
+                xNumFmt = xDialog.getChild("numfmtlb")
+                select_by_text(xNumFmt, "1, 2, 3, ...")
+
+                # Increase "start at"
+                xStartAt = xDialog.getChild("startat")
+                xStartAt.executeAction("UP", tuple())
+                xStartAt.executeAction("UP", tuple())
+
+            Paragraphs = document.Text.createEnumeration()
+            Para1 = Paragraphs.nextElement()
+            self.assertEqual(Para1.String, "List item")
+            self.assertEqual(Para1.getPropertyValue("ListLabelString"), "1.3.")
+
     def test_tdf144439_outline(self):
         with self.ui_test.create_doc_in_start_center("writer") as document:
             xWriterDoc = self.xUITest.getTopFocusWindow()
diff --git a/sw/source/core/doc/number.cxx b/sw/source/core/doc/number.cxx
index f953a93dbde4..2753bc44b26c 100644
--- a/sw/source/core/doc/number.cxx
+++ b/sw/source/core/doc/number.cxx
@@ -153,10 +153,17 @@ void SwNumRule::RemoveTextNode( SwTextNode& rTextNode )
 {
     tTextNodeList::iterator aIter =
         std::find( maTextNodeList.begin(), maTextNodeList.end(), &rTextNode );
+    if ( aIter == maTextNodeList.end() )
+        return;
 
-    if ( aIter != maTextNodeList.end() )
+    maTextNodeList.erase( aIter );
+
+    // Just in case we remove a node after we have marked the rule invalid, 
but before we have validated the tree
+    if (mbInvalidRuleFlag)
     {
-        maTextNodeList.erase( aIter );
+        SwList* pList = 
rTextNode.GetDoc().getIDocumentListsAccess().getListByName( 
rTextNode.GetListId() );
+        if (pList)
+            pList->InvalidateListTree();
     }
 }
 
@@ -960,23 +967,6 @@ void SwNumRule::SetInvalidRule(bool bFlag)
     if (mbInvalidRuleFlag == bFlag)
         return;
 
-    if (bFlag)
-    {
-        o3tl::sorted_vector< SwList* > aLists;
-        for ( const SwTextNode* pTextNode : maTextNodeList )
-        {
-            // #i111681# - applying patch from cmc
-            SwList* pList = 
pTextNode->GetDoc().getIDocumentListsAccess().getListByName( 
pTextNode->GetListId() );
-            OSL_ENSURE( pList, "<SwNumRule::SetInvalidRule(..)> - list at 
which the text node is registered at does not exist. This is a serious issue.");
-            if ( pList )
-            {
-                aLists.insert( pList );
-            }
-        }
-        for ( auto aList : aLists )
-            aList->InvalidateListTree();
-    }
-
     mbInvalidRuleFlag = bFlag;
 }
 
@@ -1077,8 +1067,13 @@ void SwNumRule::Validate(const SwDoc& rDoc)
     o3tl::sorted_vector< SwList* > aLists;
     for ( const SwTextNode* pTextNode : maTextNodeList )
     {
-        aLists.insert( 
pTextNode->GetDoc().getIDocumentListsAccess().getListByName( 
pTextNode->GetListId() ) );
+        SwList* pList = 
pTextNode->GetDoc().getIDocumentListsAccess().getListByName( 
pTextNode->GetListId() );
+        aLists.insert( pList );
     }
+
+    for ( auto aList : aLists )
+        aList->InvalidateListTree();
+
     for ( auto aList : aLists )
         aList->ValidateListTree(rDoc);
 

Reply via email to