sw/qa/core/header_footer/HeaderFooterTest.cxx  |    5 +++
 sw/qa/extras/rtfexport/rtfexport8.cxx          |   12 +++++++
 sw/source/writerfilter/dmapper/PropertyMap.cxx |   39 ++++++++++++++-----------
 3 files changed, 40 insertions(+), 16 deletions(-)

New commits:
commit af4e5e7875a3cbcba172fa50fe4528f5dc3938e3
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Thu Jan 16 20:25:22 2025 -0500
Commit:     Thorsten Behrens <thorsten.behr...@allotropia.de>
CommitDate: Sat Mar 8 15:00:49 2025 +0100

    tdf#164748 writerfilter: fix missing even/odd header properties
    
    Lots of header/footer page style properties are ignored
    if the header/footer is not first enabled.
    So copying propertyList MUST follow completeCopyHeaderFooter()
    [which is where all those settings are turned on].
    
    However, copying properties AFTER turning on the header/footer
    was Exception'ing when trying to copy
    BottomMarginComplexColor as void().
    
    So ignore any property-copy errors,
    and then everything should work in theory...
    ...and it seems to.
    
    make CppunitTest_sw_core_header_footer \
        CPPUNIT_TEST_NAME=testBnc519228OddBreaks
    
    make CppunitTest_sw_rtfexport8 \
        CPPUNIT_TEST_NAME=testTdf160976_headerFooter
    
    Change-Id: Iecf0a070e77525c04b44c4fc38efa0f9d558eca5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180417
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182469
    Tested-by: allotropia jenkins <jenk...@allotropia.de>
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>

diff --git a/sw/qa/core/header_footer/HeaderFooterTest.cxx 
b/sw/qa/core/header_footer/HeaderFooterTest.cxx
index acfd77f1270e..30296785aae2 100644
--- a/sw/qa/core/header_footer/HeaderFooterTest.cxx
+++ b/sw/qa/core/header_footer/HeaderFooterTest.cxx
@@ -671,6 +671,8 @@ CPPUNIT_TEST_FIXTURE(HeaderFooterTest, 
testFirstPageFooterEnabled)
 CPPUNIT_TEST_FIXTURE(HeaderFooterTest, testBnc519228OddBreaks)
 {
     auto verify = [this]() {
+        CPPUNIT_ASSERT_EQUAL(5, getPages()); // logical pages - "blank page" 4 
usually not displayed
+
         // Check that all the normal styles are not set as right-only, those 
should be only those used after odd page breaks.
         auto xStyles = getStyles(u"PageStyles"_ustr);
         uno::Reference<beans::XPropertySet> xStyle;
@@ -724,6 +726,9 @@ CPPUNIT_TEST_FIXTURE(HeaderFooterTest, 
testBnc519228OddBreaks)
 
             CPPUNIT_ASSERT_EQUAL(getProperty<sal_Int32>(page1Style, 
u"TopMargin"_ustr),
                                  getProperty<sal_Int32>(page2Style, 
u"TopMargin"_ustr));
+            //tdf164748
+            CPPUNIT_ASSERT_EQUAL(getProperty<bool>(page1Style, 
u"HeaderDynamicSpacing"_ustr),
+                                 getProperty<bool>(page2Style, 
u"HeaderDynamicSpacing"_ustr));
         }
 
         // Page 5
diff --git a/sw/qa/extras/rtfexport/rtfexport8.cxx 
b/sw/qa/extras/rtfexport/rtfexport8.cxx
index c2c546b42b3e..0538ac71ea28 100644
--- a/sw/qa/extras/rtfexport/rtfexport8.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport8.cxx
@@ -431,6 +431,18 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf160976_headerFooter)
     verify();
     saveAndReload(mpFilter);
     verify(/*IsExported*/ true);
+
+    //tdf#164748: export must have the all same footer settings as the first 
page
+    auto xStyles = getStyles(u"PageStyles"_ustr);
+    auto xPara = getParagraph(2, "2");
+    OUString page2StyleName = getProperty<OUString>(xPara, 
u"PageDescName"_ustr);
+    uno::Reference<beans::XPropertySet> page2Style;
+    page2Style.set(xStyles->getByName(page2StyleName), uno::UNO_QUERY);
+    CPPUNIT_ASSERT(getProperty<bool>(page2Style, 
u"FooterDynamicSpacing"_ustr));
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(915),
+                         getProperty<sal_Int32>(page2Style, 
u"FooterBodyDistance"_ustr));
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1016), getProperty<sal_Int32>(page2Style, 
u"FooterHeight"_ustr));
+
     // note: an unexpected header surfaces on page 3.
 }
 
diff --git a/sw/source/writerfilter/dmapper/PropertyMap.cxx 
b/sw/source/writerfilter/dmapper/PropertyMap.cxx
index fba05c5e3431..c55bfb2d92bc 100644
--- a/sw/source/writerfilter/dmapper/PropertyMap.cxx
+++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx
@@ -1490,11 +1490,22 @@ void 
SectionPropertyMap::CreateEvenOddPageStyleCopy(DomainMapper_Impl& rDM_Impl,
 {
     OUString evenOddStyleName = rDM_Impl.GetUnusedPageStyleName();
     rtl::Reference<SwXPageStyle> evenOddStyle = 
rDM_Impl.GetTextDocument()->createPageStyle();
-    // Unfortunately using setParent() does not work for page styles, so make 
a deep copy of the page style.
+    rDM_Impl.GetPageStyles()->insertByName(evenOddStyleName,  
uno::Any(uno::Reference<style::XStyle>(evenOddStyle)));
+
     rtl::Reference<SwXPageStyle> pageProperties(m_aPageStyle);
     uno::Reference<beans::XPropertySetInfo> 
pagePropertiesInfo(pageProperties->getPropertySetInfo());
     const uno::Sequence<beans::Property> 
propertyList(pagePropertiesInfo->getProperties());
 
+    if (rDM_Impl.IsNewDoc())
+    {
+        bool const 
bEvenAndOdd(rDM_Impl.GetSettingsTable()->GetEvenAndOddHeaders());
+        completeCopyHeaderFooter(pageProperties, evenOddStyle,
+            !rDM_Impl.SeenHeaderFooter(PagePartType::Header, PageType::RIGHT)
+                && (!bEvenAndOdd || 
!rDM_Impl.SeenHeaderFooter(PagePartType::Header, PageType::LEFT)),
+            !rDM_Impl.SeenHeaderFooter(PagePartType::Footer, PageType::RIGHT)
+                && (!bEvenAndOdd || 
!rDM_Impl.SeenHeaderFooter(PagePartType::Footer, PageType::LEFT)));
+    }
+
     // Ignore write-only properties.
     static constexpr frozen::unordered_set<std::u16string_view, 14> 
staticDenylist = {
         u"FooterBackGraphicURL", u"BackGraphicURL", u"HeaderBackGraphicURL",
@@ -1503,6 +1514,7 @@ void 
SectionPropertyMap::CreateEvenOddPageStyleCopy(DomainMapper_Impl& rDM_Impl,
         u"HeaderText", u"HeaderTextLeft", u"HeaderTextFirst",
         u"FooterText", u"FooterTextLeft", u"FooterTextFirst" };
 
+    // Unfortunately page styles can't inherit from a parent, so make a deep 
copy of the page style.
     bool isMirrorMargins = PageBreakType::Even == eBreakType && 
rDM_Impl.GetSettingsTable()->GetMirrorMarginSettings();
     for (const auto& rProperty : propertyList)
     {
@@ -1518,26 +1530,21 @@ void 
SectionPropertyMap::CreateEvenOddPageStyleCopy(DomainMapper_Impl& rDM_Impl,
                     else if (rProperty.Name == u"RightMargin"_ustr)
                         sSetName = u"LeftMargin"_ustr;
                 }
-                evenOddStyle->setPropertyValue(
-                    sSetName,
-                    pageProperties->getPropertyValue(rProperty.Name));
+                try
+                {
+                    evenOddStyle->setPropertyValue(
+                        sSetName,
+                        pageProperties->getPropertyValue(rProperty.Name));
+                }
+                catch (uno::Exception&)
+                {
+                    DBG_UNHANDLED_EXCEPTION("writerfilter", "failed to copy 
page style property");
+                }
             }
         }
     }
     evenOddStyle->setPropertyValue(u"FollowStyle"_ustr, 
uno::Any(m_sPageStyleName));
 
-    rDM_Impl.GetPageStyles()->insertByName(evenOddStyleName, 
uno::Any(uno::Reference<style::XStyle>(evenOddStyle)));
-
-    if (rDM_Impl.IsNewDoc())
-    {
-        bool const 
bEvenAndOdd(rDM_Impl.GetSettingsTable()->GetEvenAndOddHeaders());
-        completeCopyHeaderFooter(pageProperties, evenOddStyle,
-            !rDM_Impl.SeenHeaderFooter(PagePartType::Header, PageType::RIGHT)
-                && (!bEvenAndOdd || 
!rDM_Impl.SeenHeaderFooter(PagePartType::Header, PageType::LEFT)),
-            !rDM_Impl.SeenHeaderFooter(PagePartType::Footer, PageType::RIGHT)
-                && (!bEvenAndOdd || 
!rDM_Impl.SeenHeaderFooter(PagePartType::Footer, PageType::LEFT)));
-    }
-
     if (eBreakType == PageBreakType::Even)
         
evenOddStyle->setPropertyValue(getPropertyName(PROP_PAGE_STYLE_LAYOUT), 
uno::Any(style::PageStyleLayout_LEFT));
     else if (eBreakType == PageBreakType::Odd)

Reply via email to