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 23a73756211eb198c2e6e46975d564c6274165a2
Author:     Justin Luth <[email protected]>
AuthorDate: Thu Jan 16 20:25:22 2025 -0500
Commit:     Justin Luth <[email protected]>
CommitDate: Sat Jan 18 00:33:46 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 <[email protected]>

diff --git a/sw/qa/core/header_footer/HeaderFooterTest.cxx 
b/sw/qa/core/header_footer/HeaderFooterTest.cxx
index af4e388dff2f..f277a0ed77aa 100644
--- a/sw/qa/core/header_footer/HeaderFooterTest.cxx
+++ b/sw/qa/core/header_footer/HeaderFooterTest.cxx
@@ -643,6 +643,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;
@@ -696,6 +698,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 7184b7cc5b89..e8e607c59126 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 ce373b092890..efd038964444 100644
--- a/sw/source/writerfilter/dmapper/PropertyMap.cxx
+++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx
@@ -1478,11 +1478,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()->insertStyleByName(evenOddStyleName, 
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 auto staticDenylist = 
frozen::make_unordered_set<std::u16string_view>({
         u"FooterBackGraphicURL", u"BackGraphicURL", u"HeaderBackGraphicURL",
@@ -1492,6 +1503,7 @@ void 
SectionPropertyMap::CreateEvenOddPageStyleCopy(DomainMapper_Impl& rDM_Impl,
         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)
     {
@@ -1507,26 +1519,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()->insertStyleByName(evenOddStyleName, 
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