summaryrefslogtreecommitdiff
path: root/sw/qa/extras/ooxmlimport
diff options
context:
space:
mode:
authorLuke Deller <luke@deller.id.au>2016-01-03 23:12:56 +1100
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-01-08 11:23:56 +0100
commitfaa767dbef7ee9a0a7ab80bf4ad0fb529cec54a8 (patch)
treecb30443b285e473efaaee12b637d6e97d49a5309 /sw/qa/extras/ooxmlimport
parent1ec88cdb82a28851c4b97d7f043d8bcec3c675e8 (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.docxbin0 -> 18770 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport.cxx100
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
new file mode 100644
index 000000000000..cc4ddc89bb9b
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/headerfooter-link-to-prev.docx
Binary files differ
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: */