[Libreoffice-commits] core.git: sw/qa writerfilter/source

Justin Luth (via logerrit) logerrit at kemper.freedesktop.org
Tue Aug 24 06:29:36 UTC 2021


 sw/qa/extras/ooxmlexport/ooxmlexport16.cxx       |    4 -
 writerfilter/source/dmapper/NumberingManager.cxx |    2 
 writerfilter/source/dmapper/StyleSheetTable.cxx  |   54 +++++++++++++++++++++++
 writerfilter/source/dmapper/StyleSheetTable.hxx  |    2 
 4 files changed, 60 insertions(+), 2 deletions(-)

New commits:
commit 763f1e8236657a20b359991057679cf12bfac4f5
Author:     Justin Luth <justin_luth at sil.org>
AuthorDate: Thu Aug 19 18:44:35 2021 +0200
Commit:     Justin Luth <justin_luth at sil.org>
CommitDate: Tue Aug 24 08:28:59 2021 +0200

    tdf#143692 writerfilter CN: reapply lost OutlineLevel
    
    The paragraph styles had already set their numbering-related
    properties before numbering.xml choses some styles
    to be assigned as Chapter Numbering. Part of this CN process
    in SW is to clear the inheriting styles of any inherited
    numbering properties (numId, listLevel, outlineLevel).
    
    So, we need to re-address outline levels after
    numbering has been imported, and fix up anything
    that has been cleared.
    
    [P.S. No need to do the same thing for listLevel yet,
    b/c LO does not support listLevel on paragraph styles in general.]
    
    Change-Id: Idfb4d150b94558b069dbb1a87c764460396b34d6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120757
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_luth at sil.org>

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
index 10cb7f1126ed..e2f68bc4e7de 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
@@ -349,7 +349,7 @@ DECLARE_OOXMLEXPORT_TEST(testTdf143692_outlineLevelTortureTest, "tdf143692_outli
 
     xPara.set(getParagraph(7, "InheritCN3"), uno::UNO_QUERY);
     // fixed Chapter Numbering cancelling inheritance
-    //CPPUNIT_ASSERT_EQUAL(sal_Int16(3), getProperty<sal_Int16>(xPara, "OutlineLevel"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(3), getProperty<sal_Int16>(xPara, "OutlineLevel"));
 
     xPara.set(getParagraph(8, "noInheritCN3"), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(xPara, "OutlineLevel"));
@@ -360,7 +360,7 @@ DECLARE_OOXMLEXPORT_TEST(testTdf143692_outlineLevelTortureTest, "tdf143692_outli
 
     xPara.set(getParagraph(10, "illegal 25"), uno::UNO_QUERY);
     // fixed illegal value is ignored, so inherit from List Level (Chapter Numbering)
-    //CPPUNIT_ASSERT_EQUAL(sal_Int16(3), getProperty<sal_Int16>(xPara, "OutlineLevel"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(3), getProperty<sal_Int16>(xPara, "OutlineLevel"));
 }
 
 DECLARE_OOXMLEXPORT_TEST(testTdf132752, "tdf132752.docx")
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx
index b0f1102ad785..9e2072bc6ee6 100644
--- a/writerfilter/source/dmapper/NumberingManager.cxx
+++ b/writerfilter/source/dmapper/NumberingManager.cxx
@@ -610,6 +610,7 @@ void ListDef::CreateNumberingRules( DomainMapper& rDMapper,
                     xOutlines->getChapterNumberingRules( );
 
                 StyleSheetEntryPtr pParaStyle = pAbsLevel->GetParaStyle( );
+                pParaStyle->bAssignedAsChapterNumbering = true;
                 aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_HEADING_STYLE_NAME), pParaStyle->sConvertedStyleName));
 
                 xOutlineRules->replaceByIndex(nLevel, uno::makeAny(comphelper::containerToSequence(aLvlProps)));
@@ -1206,6 +1207,7 @@ void ListsManager::CreateNumberingRules( )
     {
         rList->CreateNumberingRules(m_rDMapper, m_xFactory, nChosenAsChapterNumberingId);
     }
+    m_rDMapper.GetStyleSheetTable()->ReApplyInheritedOutlineLevelFromChapterNumbering();
     m_rDMapper.GetStyleSheetTable()->ApplyNumberingStyleNameToParaStyles();
 }
 
diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
index 815a261ac092..11f0fddcd80c 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -55,6 +55,7 @@ namespace writerfilter::dmapper
 StyleSheetEntry::StyleSheetEntry() :
         sStyleIdentifierD()
         ,bIsDefaultStyle(false)
+        ,bAssignedAsChapterNumbering(false)
         ,bInvalidHeight(false)
         ,bHasUPE(false)
         ,nStyleTypeCode(STYLE_TYPE_UNKNOWN)
@@ -940,6 +941,59 @@ void StyleSheetTable::ApplyNumberingStyleNameToParaStyles()
     }
 }
 
+/* Counteract the destructive tendencies of LibreOffice's Chapter Numbering
+ *
+ * Any assignment to Chapter Numbering will erase the numbering-like properties of inherited styles.
+ * So go through the list of styles and any that inherit from a Chapter Numbering style
+ * should have the Outline Level reapplied.
+ */
+void StyleSheetTable::ReApplyInheritedOutlineLevelFromChapterNumbering()
+{
+    try
+    {
+        uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier(m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW);
+        uno::Reference< lang::XMultiServiceFactory > xDocFactory(m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW);
+        uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
+        uno::Reference<container::XNameContainer> xParaStyles;
+        xStyleFamilies->getByName(getPropertyName(PROP_PARAGRAPH_STYLES)) >>= xParaStyles;
+
+        if (!xParaStyles.is())
+            return;
+
+        for (auto& pEntry : m_pImpl->m_aStyleSheetEntries)
+        {
+            if (pEntry->nStyleTypeCode != STYLE_TYPE_PARA || pEntry->sBaseStyleIdentifier.isEmpty())
+                continue;
+
+            sal_Int16 nOutlineLevel = pEntry->pProperties->GetOutlineLevel();
+            if (nOutlineLevel != -1)
+                continue;
+
+            StyleSheetEntryPtr pParent = FindStyleSheetByISTD(pEntry->sBaseStyleIdentifier);
+            if (!pParent || !pParent->bAssignedAsChapterNumbering)
+                continue;
+
+            nOutlineLevel = pParent->pProperties->GetOutlineLevel();
+            assert(nOutlineLevel >= WW_OUTLINE_MIN && nOutlineLevel < WW_OUTLINE_MAX);
+
+            // convert MS level to LO equivalent outline level
+            ++nOutlineLevel;
+
+            uno::Reference< style::XStyle > xStyle;
+            xParaStyles->getByName(pEntry->sConvertedStyleName) >>= xStyle;
+            if ( !xStyle.is() )
+                break;
+
+            uno::Reference<beans::XPropertySet> xPropertySet( xStyle, uno::UNO_QUERY_THROW );
+            xPropertySet->setPropertyValue(getPropertyName(PROP_OUTLINE_LEVEL), uno::makeAny(nOutlineLevel));
+        }
+    }
+    catch( const uno::Exception& )
+    {
+        DBG_UNHANDLED_EXCEPTION("writerfilter", "Failed applying outlineLevel to Paragraph styles");
+    }
+}
+
 void StyleSheetTable::ApplyStyleSheets( const FontTablePtr& rFontTable )
 {
     try
diff --git a/writerfilter/source/dmapper/StyleSheetTable.hxx b/writerfilter/source/dmapper/StyleSheetTable.hxx
index 081d5ef0aa30..b0dd24fa6efa 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.hxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.hxx
@@ -52,6 +52,7 @@ class StyleSheetEntry : public virtual SvRefBase
 public:
     OUString sStyleIdentifierD;   // WW8 name
     bool            bIsDefaultStyle;
+    bool            bAssignedAsChapterNumbering;
     bool            bInvalidHeight;
     bool            bHasUPE; //universal property expansion
     StyleType       nStyleTypeCode; //sgc
@@ -88,6 +89,7 @@ public:
     StyleSheetTable(DomainMapper& rDMapper, css::uno::Reference<css::text::XTextDocument> const& xTextDocument, bool bIsNewDoc);
     virtual ~StyleSheetTable() override;
 
+    void ReApplyInheritedOutlineLevelFromChapterNumbering();
     void ApplyNumberingStyleNameToParaStyles();
     void ApplyStyleSheets( const FontTablePtr& rFontTable );
     StyleSheetEntryPtr FindStyleSheetByISTD(const OUString& sIndex);


More information about the Libreoffice-commits mailing list