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)
