diff options
author | Luke Deller <luke@deller.id.au> | 2016-01-03 23:12:56 +1100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-01-08 11:23:56 +0100 |
commit | faa767dbef7ee9a0a7ab80bf4ad0fb529cec54a8 (patch) | |
tree | cb30443b285e473efaaee12b637d6e97d49a5309 /sw/qa/extras/ooxmlimport | |
parent | 1ec88cdb82a28851c4b97d7f043d8bcec3c675e8 (diff) |
tdf#93640 Fix import of linked left page header/footer
In a docx section, any header/footer which is not defined in the
section is considered to be linked to the previous section.
In the Word UI this is shown as an option named "Link to Previous",
and editing the header/footer in either section affects both sections.
LO imports this by copying the header/footer contents from the previous
section, but it did not handle the case where a section had different
headers for left pages vs right pages.
Fix this, which involved changing the mechanism used to detect
whether a section has defined a certain header/footer (which unlinks
it from the previous section):
rather than trying to figure it out from the converted LO page styles,
explicitly track which headers/footers have been defined using boolean
member variables on the SectionPropertyMap instance.
Conflicts:
sw/qa/extras/ooxmlimport/ooxmlimport.cxx
Change-Id: Ic43a867356c2cd5df09d39f2a3ddefa584b6765c
Diffstat (limited to 'sw/qa/extras/ooxmlimport')
-rw-r--r-- | sw/qa/extras/ooxmlimport/data/headerfooter-link-to-prev.docx | bin | 0 -> 18770 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 100 |
2 files changed, 100 insertions, 0 deletions
diff --git a/sw/qa/extras/ooxmlimport/data/headerfooter-link-to-prev.docx b/sw/qa/extras/ooxmlimport/data/headerfooter-link-to-prev.docx Binary files differnew file mode 100644 index 000000000000..cc4ddc89bb9b --- /dev/null +++ b/sw/qa/extras/ooxmlimport/data/headerfooter-link-to-prev.docx diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index fe67d762292b..a245be01fd99 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -3047,6 +3047,106 @@ DECLARE_OOXMLIMPORT_TEST(testTdf95213, "tdf95213.docx") CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty<float>(xStyle, "CharWeight")); } +// base class to supply a helper method for testHFLinkToPrev +class testHFBase : public Test +{ +protected: + OUString + getHFText(const uno::Reference<style::XStyle>& xPageStyle, + const OUString &sPropName) + { + auto xTextRange = getProperty< uno::Reference<text::XTextRange> >( + xPageStyle, sPropName); + return xTextRange->getString(); + } +}; + +DECLARE_SW_IMPORT_TEST(testHFLinkToPrev, "headerfooter-link-to-prev.docx", + testHFBase) +{ + uno::Reference<container::XNameAccess> xPageStyles = getStyles("PageStyles"); + + // get a page cursor + uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier( + xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference<text::XPageCursor> xCursor( + xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY); + + // get LO page style for page 1, corresponding to docx section 1 first page + xCursor->jumpToFirstPage(); + OUString pageStyleName = getProperty<OUString>(xCursor, "PageStyleName"); + uno::Reference<style::XStyle> xPageStyle( + xPageStyles->getByName(pageStyleName), uno::UNO_QUERY); + // check page 1 header & footer text + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderText"), + OUString("First page header for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterText"), + OUString("First page footer for section 1 only")); + + // get LO page style for page 2, corresponding to docx section 1 + xCursor->jumpToPage(2); + pageStyleName = getProperty<OUString>(xCursor, "PageStyleName"); + xPageStyle.set( xPageStyles->getByName(pageStyleName), uno::UNO_QUERY ); + // check header & footer text + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderTextLeft"), + OUString("Even page header for section 1 only")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterTextLeft"), + OUString("Even page footer for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderText"), + OUString("Odd page header for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterText"), + OUString("Odd page footer for section 1 only")); + + // get LO page style for page 4, corresponding to docx section 2 first page + xCursor->jumpToPage(4); + pageStyleName = getProperty<OUString>(xCursor, "PageStyleName"); + xPageStyle.set( xPageStyles->getByName(pageStyleName), uno::UNO_QUERY ); + // check header & footer text + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderText"), + OUString("First page header for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterText"), + OUString("First page footer for sections 2 and 3 only")); + + // get LO page style for page 5, corresponding to docx section 2 + xCursor->jumpToPage(5); + pageStyleName = getProperty<OUString>(xCursor, "PageStyleName"); + xPageStyle.set( xPageStyles->getByName(pageStyleName), uno::UNO_QUERY ); + // check header & footer text + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderTextLeft"), + OUString("Even page header for sections 2 and 3 only")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterTextLeft"), + OUString("Even page footer for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderText"), + OUString("Odd page header for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterText"), + OUString("Odd page footer for sections 2 and 3 only")); + + // get LO page style for page 7, corresponding to docx section 3 first page + xCursor->jumpToPage(7); + pageStyleName = getProperty<OUString>(xCursor, "PageStyleName"); + xPageStyle.set( xPageStyles->getByName(pageStyleName), uno::UNO_QUERY ); + // check header & footer text + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderText"), + OUString("First page header for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterText"), + OUString("First page footer for sections 2 and 3 only")); + + // get LO page style for page 8, corresponding to docx section 3 + xCursor->jumpToPage(8); + pageStyleName = getProperty<OUString>(xCursor, "PageStyleName"); + xPageStyle.set( xPageStyles->getByName(pageStyleName), uno::UNO_QUERY ); + // check header & footer text + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderTextLeft"), + OUString("Even page header for sections 2 and 3 only")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterTextLeft"), + OUString("Even page footer for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "HeaderText"), + OUString("Odd page header for all sections")); + CPPUNIT_ASSERT_EQUAL(getHFText(xPageStyle, "FooterText"), + OUString("Odd page footer for sections 2 and 3 only")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |