summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsw/qa/extras/ww8import/data/fdo77844.docbin0 -> 28672 bytes
-rw-r--r--sw/qa/extras/ww8import/ww8import.cxx47
-rw-r--r--sw/source/filter/ww8/ww8par.cxx15
3 files changed, 60 insertions, 2 deletions
diff --git a/sw/qa/extras/ww8import/data/fdo77844.doc b/sw/qa/extras/ww8import/data/fdo77844.doc
new file mode 100755
index 000000000000..cd7368d5d654
--- /dev/null
+++ b/sw/qa/extras/ww8import/data/fdo77844.doc
Binary files differ
diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx
index 270d665d26a2..147fb882f19e 100644
--- a/sw/qa/extras/ww8import/ww8import.cxx
+++ b/sw/qa/extras/ww8import/ww8import.cxx
@@ -415,6 +415,53 @@ DECLARE_WW8IMPORT_TEST(testBnc875715, "bnc875715.doc")
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xSections->getByIndex(0), "SectionLeftMargin"));
}
+DECLARE_WW8IMPORT_TEST(testFdo77844, "fdo77844.doc")
+{
+ uno::Reference<container::XNameAccess> pageStyles = 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);
+
+ // check that the first page has no header
+ xCursor->jumpToFirstPage();
+ OUString pageStyleName = getProperty<OUString>(xCursor, "PageStyleName");
+ uno::Reference<style::XStyle> pageStyle(
+ pageStyles->getByName(pageStyleName), uno::UNO_QUERY);
+ bool headerIsOn = getProperty<bool>(pageStyle, "HeaderIsOn");
+ CPPUNIT_ASSERT(!headerIsOn);
+
+ // check that the second page has a header
+ xCursor->jumpToPage(2);
+ pageStyleName = getProperty<OUString>(xCursor, "PageStyleName");
+ pageStyle.set(
+ pageStyles->getByName(pageStyleName), uno::UNO_QUERY);
+ headerIsOn = getProperty<bool>(pageStyle, "HeaderIsOn");
+ CPPUNIT_ASSERT(headerIsOn);
+
+ // check that the third page has a header
+ xCursor->jumpToPage(3);
+ pageStyleName = getProperty<OUString>(xCursor, "PageStyleName");
+ pageStyle.set(
+ pageStyles->getByName(pageStyleName), uno::UNO_QUERY);
+ headerIsOn = getProperty<bool>(pageStyle, "HeaderIsOn");
+ CPPUNIT_ASSERT(headerIsOn);
+
+ // check that the fourth page has no header
+ // (#if'd out as this is not yet imported correctly)
+#if 0
+ xCursor->jumpToPage(4);
+ pageStyleName = getProperty<OUString>(xCursor, "PageStyleName");
+ pageStyle.set(
+ pageStyles->getByName(pageStyleName), uno::UNO_QUERY);
+ headerIsOn = getProperty<bool>(pageStyle, "HeaderIsOn");
+ CPPUNIT_ASSERT(!headerIsOn);
+#endif
+}
+
#endif
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index c3e29c30deb0..21ee239dfbd9 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -2375,6 +2375,9 @@ void SwWW8ImplReader::Read_HdFt(int nSect, const SwPageDesc *pPrev,
long nLen;
sal_uInt8 nNumber = 5;
+ // This loops through the 6 flags WW8_{FOOTER,HEADER}_{ODD,EVEN,FIRST}
+ // corresponding to bit fields in grpfIhdt indicating which
+ // header/footer(s) are present in this section
for( sal_uInt8 nI = 0x20; nI; nI >>= 1, nNumber-- )
{
if (nI & grpfIhdt)
@@ -2392,6 +2395,12 @@ void SwWW8ImplReader::Read_HdFt(int nSect, const SwPageDesc *pPrev,
= (nI & ( WW8_HEADER_EVEN | WW8_FOOTER_EVEN )) ? true: false;
bool bUseFirst
= (nI & ( WW8_HEADER_FIRST | WW8_FOOTER_FIRST )) ? true: false;
+
+ // If we are loading a first-page header/footer which is not
+ // actually enabled in this section (it still needs to be
+ // loaded as it may be inherited by a later section)
+ bool bDisabledFirst = bUseFirst && !rSection.HasTitlePage();
+
bool bFooter
= (nI & ( WW8_FOOTER_EVEN | WW8_FOOTER_ODD | WW8_FOOTER_FIRST )) ? true: false;
@@ -2406,7 +2415,8 @@ void SwWW8ImplReader::Read_HdFt(int nSect, const SwPageDesc *pPrev,
{
bIsFooter = true;
//#i17196# Cannot have left without right
- if (!pPD->GetMaster().GetFooter().GetFooterFmt())
+ if (!bDisabledFirst
+ && !pPD->GetMaster().GetFooter().GetFooterFmt())
pPD->GetMaster().SetFmtAttr(SwFmtFooter(true));
if (bUseLeft)
pPD->GetLeft().SetFmtAttr(SwFmtFooter(true));
@@ -2418,7 +2428,8 @@ void SwWW8ImplReader::Read_HdFt(int nSect, const SwPageDesc *pPrev,
{
bIsHeader = true;
//#i17196# Cannot have left without right
- if (!pPD->GetMaster().GetHeader().GetHeaderFmt())
+ if (!bDisabledFirst
+ && !pPD->GetMaster().GetHeader().GetHeaderFmt())
pPD->GetMaster().SetFmtAttr(SwFmtHeader(true));
if (bUseLeft)
pPD->GetLeft().SetFmtAttr(SwFmtHeader(true));