editeng/source/items/numitem.cxx        |   12 +++++
 sw/qa/uitest/data/tdf144578.odt         |binary
 sw/qa/uitest/writer_tests7/tdf144578.py |   66 ++++++++++++++++++++++++++++++++
 xmloff/source/style/xmlnumi.cxx         |    4 -
 4 files changed, 79 insertions(+), 3 deletions(-)

New commits:
commit e6bf21d2d5efb231c877eb985997b28033198600
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Mon Sep 27 13:40:41 2021 +0300
Commit:     Vasily Melenchuk <vasily.melenc...@cib.de>
CommitDate: Mon Oct 4 15:29:45 2021 +0200

    tdf#144578: numbering: generate include upper levels for UI
    
    In spite of used list format in ODF for UI we still need to
    show prefix/suffix (already was there) and included upper
    levels (done in this patch) for correct visualization of
    level properties.
    
    Moved initialization of ListLevel to later steps to avoid
    overriding of generated values for prefix, suffix and
    IncludeUpperLevel by some invalid values.
    
    Change-Id: I5d132426c06021ed526d16fb09276523105aa7b9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122686
    Tested-by: Jenkins
    Reviewed-by: Vasily Melenchuk <vasily.melenc...@cib.de>

diff --git a/editeng/source/items/numitem.cxx b/editeng/source/items/numitem.cxx
index 7348eb16df4d..ca454d92f894 100644
--- a/editeng/source/items/numitem.cxx
+++ b/editeng/source/items/numitem.cxx
@@ -621,7 +621,9 @@ void SvxNumberFormat::SetListFormat(std::optional<OUString> 
oSet)
 
     sListFormat = oSet;
 
-    // For backward compatibility and UI we should create prefix/suffix also
+    // For backward compatibility and UI we should create something looking 
like
+    // a prefix, suffix and included levels also. This is not possible in 
general case
+    // since level format string is much more flexible. But for most cases is 
okay
     sal_Int32 nFirstReplacement = sListFormat->indexOf('%');
     sal_Int32 nLastReplacement = sListFormat->lastIndexOf('%') + 1;
     if (nFirstReplacement > 0)
@@ -630,6 +632,14 @@ void 
SvxNumberFormat::SetListFormat(std::optional<OUString> oSet)
     if (nLastReplacement >= 0 && nLastReplacement < sListFormat->getLength())
         // Everything beyond last '%' is a suffix
         sSuffix = sListFormat->copy(nLastReplacement);
+
+    sal_uInt8 nPercents = 0;
+    for (sal_Int32 i = 0; i < sListFormat->getLength(); i++)
+    {
+        if ((*sListFormat)[i] == '%')
+            nPercents++;
+    }
+    nInclUpperLevels = nPercents/2;
 }
 
 OUString SvxNumberFormat::GetListFormat(bool bIncludePrefixSuffix /*= true*/) 
const
diff --git a/sw/qa/uitest/data/tdf144578.odt b/sw/qa/uitest/data/tdf144578.odt
new file mode 100644
index 000000000000..d8f0f0f830ee
Binary files /dev/null and b/sw/qa/uitest/data/tdf144578.odt differ
diff --git a/sw/qa/uitest/writer_tests7/tdf144578.py 
b/sw/qa/uitest/writer_tests7/tdf144578.py
new file mode 100644
index 000000000000..259b26ed8298
--- /dev/null
+++ b/sw/qa/uitest/writer_tests7/tdf144578.py
@@ -0,0 +1,66 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file
+
+import time
+
+class tdf144578(UITestCase):
+
+    def test_tdf144578(self):
+        with self.ui_test.load_file(get_url_for_data_file("tdf144578.odt")) as 
writer_doc:
+            with 
self.ui_test.execute_dialog_through_command(".uno:ChapterNumberingDialog") as 
xDialog:
+                # Select level "1"
+                xLevelsTree = xDialog.getChild("level")
+                xLevel = xLevelsTree.getChild("0")
+                xLevel.executeAction("SELECT", tuple())
+                # Check value for show upper levels
+                xSubLevels = xDialog.getChild("sublevelsnf")
+                self.assertEqual(get_state_as_dict(xSubLevels)["Text"], "1")
+
+                # Select level "2"
+                xLevel = xLevelsTree.getChild("1")
+                xLevel.executeAction("SELECT", tuple())
+                # Check value for show upper levels
+                xSubLevels = xDialog.getChild("sublevelsnf")
+                self.assertEqual(get_state_as_dict(xSubLevels)["Text"], "2")
+
+                # Select level "3"
+                xLevel = xLevelsTree.getChild("2")
+                xLevel.executeAction("SELECT", tuple())
+                # Check value for show upper levels
+                xSubLevels = xDialog.getChild("sublevelsnf")
+                self.assertEqual(get_state_as_dict(xSubLevels)["Text"], "3")
+
+                # Select level "3"
+                xLevel = xLevelsTree.getChild("3")
+                xLevel.executeAction("SELECT", tuple())
+                # Check value for show upper levels
+                xSubLevels = xDialog.getChild("sublevelsnf")
+                self.assertEqual(get_state_as_dict(xSubLevels)["Text"], "1")
+
+            # And also verify label strings in outlines
+            Paragraphs = []
+            ParagraphEnum = writer_doc.Text.createEnumeration()
+            while ParagraphEnum.hasMoreElements():
+                Para = ParagraphEnum.nextElement()
+                Paragraphs.append(Para)
+
+            
self.assertEqual(Paragraphs[0].getPropertyValue("ListLabelString"), "I.")
+            
self.assertEqual(Paragraphs[2].getPropertyValue("ListLabelString"), "II.")
+            
self.assertEqual(Paragraphs[4].getPropertyValue("ListLabelString"), "II.A.")
+            
self.assertEqual(Paragraphs[6].getPropertyValue("ListLabelString"), "II.B.")
+            
self.assertEqual(Paragraphs[8].getPropertyValue("ListLabelString"), "III.")
+            
self.assertEqual(Paragraphs[10].getPropertyValue("ListLabelString"), "III.A.")
+            
self.assertEqual(Paragraphs[11].getPropertyValue("ListLabelString"), "III.A.1.")
+            
self.assertEqual(Paragraphs[13].getPropertyValue("ListLabelString"), "III.A.2.")
+            
self.assertEqual(Paragraphs[15].getPropertyValue("ListLabelString"), "III.B.")
+            
self.assertEqual(Paragraphs[17].getPropertyValue("ListLabelString"), "III.C.")
+            
self.assertEqual(Paragraphs[19].getPropertyValue("ListLabelString"), "III.C.1.")
+            
self.assertEqual(Paragraphs[21].getPropertyValue("ListLabelString"), "III.C.2.")
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/xmloff/source/style/xmlnumi.cxx b/xmloff/source/style/xmlnumi.cxx
index 335bbfac928f..8f40530a2a53 100644
--- a/xmloff/source/style/xmlnumi.cxx
+++ b/xmloff/source/style/xmlnumi.cxx
@@ -423,8 +423,6 @@ Sequence<beans::PropertyValue> 
SvxXMLListLevelStyleContext_Impl::GetProperties()
 
     aProperties.push_back(comphelper::makePropertyValue("Suffix", sSuffix));
 
-    aProperties.push_back(comphelper::makePropertyValue("ListFormat", 
*sListFormat));
-
     aProperties.push_back(comphelper::makePropertyValue("Adjust", eAdjust));
 
     sal_Int32 nLeftMargin = nSpaceBefore + nMinLabelWidth;
@@ -522,6 +520,8 @@ Sequence<beans::PropertyValue> 
SvxXMLListLevelStyleContext_Impl::GetProperties()
         aProperties.push_back(comphelper::makePropertyValue("BulletColor", 
m_nColor));
     }
 
+    aProperties.push_back(comphelper::makePropertyValue("ListFormat", 
*sListFormat));
+
     return comphelper::containerToSequence(aProperties);
 }
 

Reply via email to