summaryrefslogtreecommitdiff
path: root/sw/source/filter/ww8/wrtw8sty.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-02-07 16:06:19 +0100
committerMiklos Vajna <vmiklos@collabora.com>2020-05-06 09:56:10 +0200
commit9b13dab4da0bbfa560a6bbe6c26dd9cff2a2537b (patch)
tree18647f51a98cb620781b10b0e9ebbba7d53bcfc3 /sw/source/filter/ww8/wrtw8sty.cxx
parent1b0f859c625b32c9fb21d0fc67b786f464794389 (diff)
DOCX export: fix handling of section starts that originally had page margins
This is similar to commit 26f2a9e1a10a22e864e71ee7c94934821703e021 (DOCX export: fix handling of section starts that originally had headers, 2020-02-06), except here the top margin has to taken from that follow page style, not the header. Without this, it can happen that the page number in the original Writer doc model and the exported Word result do not match. This required reworking WriteNextStyleHeaderFooter(), which assumed that the header/footer status is already calculated by the time its called. But the page margin code runs earlier, so we need to make that decision earlier, even when the header/footer status is not yet calculated. Change-Id: Ife7396603702d2048d544aa46f96acfa337a041a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88211 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins (cherry picked from commit f0decd9c932b50eddeecd49a6ee44182e78be938)
Diffstat (limited to 'sw/source/filter/ww8/wrtw8sty.cxx')
-rw-r--r--sw/source/filter/ww8/wrtw8sty.cxx28
1 files changed, 16 insertions, 12 deletions
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
index 2908f78fef0e..bfe6483b7f41 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -1523,11 +1523,11 @@ void WW8Export::WriteHeadersFooters( sal_uInt8 nHeadFootFlags,
namespace
{
/**
- * Find a node near the section start that has a page break, it may have a follow header/footer for
- * us.
+ * Determines if the continuous section break we start should use page style properties (header,
+ * footer, margins) from the next page style of the previous section.
*/
-bool WriteNextStyleHeaderFooter(sal_uInt8 nBreakCode, sal_uInt8 nHeadFootFlags,
- const SwPageDesc* pPd, const WW8_SepInfo& rSepInfo)
+bool UsePrevSectionNextStyle(sal_uInt8 nBreakCode, const SwPageDesc* pPd,
+ const WW8_SepInfo& rSepInfo)
{
if (nBreakCode != 0)
{
@@ -1535,12 +1535,6 @@ bool WriteNextStyleHeaderFooter(sal_uInt8 nBreakCode, sal_uInt8 nHeadFootFlags,
return false;
}
- if (nHeadFootFlags != 0)
- {
- // Would write some header/footer anyway.
- return false;
- }
-
if (!pPd->GetFollow())
{
// Page style has no follow style.
@@ -1624,6 +1618,7 @@ void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAtt
bool bOutPgDscSet = true, bLeftRightPgChain = false, bOutputStyleItemSet = false;
bool bEnsureHeaderFooterWritten = rSepInfo.pSectionFormat && rSepInfo.bIsFirstParagraph;
const SwFrameFormat* pPdFormat = &pPd->GetMaster();
+ bool bUsePrevSectionNextStyle = false;
if ( rSepInfo.pSectionFormat )
{
// if pSectionFormat is set, then there is a SectionNode
@@ -1649,6 +1644,15 @@ void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAtt
// produce Itemset, which inherits PgDesk-Attr-Set:
// as child also the parent is searched if 'deep'-OutputItemSet
const SfxItemSet* pPdSet = &pPdFormat->GetAttrSet();
+
+ bUsePrevSectionNextStyle = GetExportFormat() == ExportFormat::DOCX
+ && UsePrevSectionNextStyle(nBreakCode, pPd, rSepInfo);
+ if (bUsePrevSectionNextStyle)
+ {
+ // Take page margins from the previous section's next style.
+ pPdSet = &pPd->GetFollow()->GetMaster().GetAttrSet();
+ }
+
SfxItemSet aSet( *pPdSet->GetPool(), pPdSet->GetRanges() );
aSet.SetParent( pPdSet );
@@ -1841,9 +1845,9 @@ void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAtt
const SwTextNode *pOldPageRoot = GetHdFtPageRoot();
SetHdFtPageRoot( rSepInfo.pPDNd ? rSepInfo.pPDNd->GetTextNode() : nullptr );
- if (GetExportFormat() == ExportFormat::DOCX
- && WriteNextStyleHeaderFooter(nBreakCode, nHeadFootFlags, pPd, rSepInfo))
+ if (bUsePrevSectionNextStyle && nHeadFootFlags == 0)
{
+ // Take headers/footers from the previous section's next style.
pPdFormat = &pPd->GetFollow()->GetMaster();
MSWordSections::SetHeaderFlag(nHeadFootFlags, *pPdFormat, WW8_HEADER_ODD);
MSWordSections::SetFooterFlag(nHeadFootFlags, *pPdFormat, WW8_FOOTER_ODD);