Kaydet (Commit) 69fcd630 authored tarafından Mike Kaganski's avatar Mike Kaganski Kaydeden (comit) Michael Stahl

tdf#121168: Ensure page descriptions are correct in work document

When first node on a page is a section, then creation of a copy with
lcl_CreateWorkingDocument initially produces a document with layout
frames having wrong page descriptions applied (set to "Default Style").
The reason is that when SfxViewFrame::LoadHiddenDocument indirectly
calls SwRootFrame::Init, the sections in the document have hidden
flag set, which causes SwNodes::GoNextSection return the first node
after the first section. The returned node naturally doesn't have a
page description set, thus the initialized page frame doesn't get it.

This makes following copy to destination document use that wrong style;
if the correct page style had header/footer, then it would not be
properly copied per record in single-document output; headers/footers
would be wrong/absent.

This change forces check of page descriptions after the work document
had been created and initialized.

Change-Id: Ic196eb7fac0241f002eddd2c1d1b66dfb489bc60
Reviewed-on: https://gerrit.libreoffice.org/65383Reviewed-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
Tested-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
(cherry picked from commit ec928ac5)
Reviewed-on: https://gerrit.libreoffice.org/65407
Tested-by: Jenkins
Tested-by: 's avatarXisco Faulí <xiscofauli@libreoffice.org>
Reviewed-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
üst 960313f0
......@@ -858,5 +858,38 @@ DECLARE_SHELL_MAILMERGE_TEST(testTdf118845, "tdf118845.fodt", "4_v01.ods", "Tabe
CPPUNIT_ASSERT_EQUAL(OUString(""), xParagraph->getString());
}
DECLARE_SHELL_MAILMERGE_TEST(testTdf121168, "section_ps.odt", "4_v01.ods", "Tabelle1")
{
// A document starting with a section on a page with non-default page style with header
executeMailMerge();
SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxMMComponent.get());
CPPUNIT_ASSERT(pTextDoc);
// 4 documents 1 page each, starting at odd page numbers => 7
CPPUNIT_ASSERT_EQUAL(sal_uInt16(7), pTextDoc->GetDocShell()->GetWrtShell()->GetPhyPageNum());
SwDoc* pDocMM = pTextDoc->GetDocShell()->GetDoc();
sal_uLong nSizeMM = pDocMM->GetNodes().GetEndOfContent().GetIndex()
- pDocMM->GetNodes().GetEndOfExtras().GetIndex() - 2;
CPPUNIT_ASSERT_EQUAL(sal_uLong(16), nSizeMM);
// All even pages should be empty, all sub-documents have one page
const SwRootFrame* pLayout = pDocMM->getIDocumentLayoutAccess().GetCurrentLayout();
const SwPageFrame* pPageFrm = static_cast<const SwPageFrame*>(pLayout->Lower());
while (pPageFrm)
{
sal_uInt16 nPageNum = pPageFrm->GetPhyPageNum();
bool bOdd = (1 == (nPageNum % 2));
CPPUNIT_ASSERT_EQUAL(!bOdd, pPageFrm->IsEmptyPage());
CPPUNIT_ASSERT_EQUAL(sal_uInt16(bOdd ? 1 : 2), pPageFrm->GetVirtPageNum());
if (bOdd)
{
const SwPageDesc* pDesc = pPageFrm->GetPageDesc();
CPPUNIT_ASSERT_EQUAL(OUString("Teststyle" + OUString::number(nPageNum / 2 + 1)),
pDesc->GetName());
}
pPageFrm = static_cast<const SwPageFrame*>(pPageFrm->GetNext());
}
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -1502,6 +1502,15 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
// ExpFields update during printing, generation of preview, etc.
pWorkShell->LockExpFields();
pWorkShell->CalcLayout();
// tdf#121168: Now force correct page descriptions applied to page frames. Without
// this, e.g., page frames starting with sections could have page descriptions set
// wrong. This would lead to wrong page styles applied in SwDoc::AppendDoc below.
pWorkShell->GetViewOptions()->SetIdle(true);
for (auto aLayout : pWorkShell->GetDoc()->GetAllLayouts())
{
aLayout->FreezeLayout(false);
aLayout->AllCheckPageDescs();
}
}
lcl_emitEvent(SfxEventHintId::SwEventFieldMerge, STR_SW_EVENT_FIELD_MERGE, xWorkDocSh);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment