From b42b3acd043e3d464e2751ff17b0fda462ed62bd Mon Sep 17 00:00:00 2001 From: Ilhan Yesil Date: Wed, 30 Jan 2019 17:43:56 +0100 Subject: tdf#123057 Correct page count in mail merge if sections are hidden Remove of invisible content has influence on page count and therefore on fields for page count. So straight after removing invisible content in the mail merge process, the layout has to be updated before fields are converted to text. Change-Id: If43f9921b6797c7ceb112860cda4baf4978c36bc Reviewed-on: https://gerrit.libreoffice.org/67343 Tested-by: Jenkins Reviewed-by: Michael Stahl --- sw/qa/extras/mailmerge/data/db_pagecounttest.ods | Bin 0 -> 9154 bytes sw/qa/extras/mailmerge/data/pagecounttest.ott | Bin 0 -> 12132 bytes sw/qa/extras/mailmerge/mailmerge.cxx | 71 +++++++++++++++++++++++ sw/source/uibase/dbui/dbmgr.cxx | 5 +- 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 sw/qa/extras/mailmerge/data/db_pagecounttest.ods create mode 100644 sw/qa/extras/mailmerge/data/pagecounttest.ott diff --git a/sw/qa/extras/mailmerge/data/db_pagecounttest.ods b/sw/qa/extras/mailmerge/data/db_pagecounttest.ods new file mode 100644 index 000000000000..4b9f90ec9098 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/db_pagecounttest.ods differ diff --git a/sw/qa/extras/mailmerge/data/pagecounttest.ott b/sw/qa/extras/mailmerge/data/pagecounttest.ott new file mode 100644 index 000000000000..d7f63419c2b7 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/pagecounttest.ott differ diff --git a/sw/qa/extras/mailmerge/mailmerge.cxx b/sw/qa/extras/mailmerge/mailmerge.cxx index 59cd2b512875..dae7008f4f12 100644 --- a/sw/qa/extras/mailmerge/mailmerge.cxx +++ b/sw/qa/extras/mailmerge/mailmerge.cxx @@ -1129,5 +1129,76 @@ DECLARE_SHELL_MAILMERGE_TEST(testTdf81750_shell, "tdf81750.odt", "10-testing-add CPPUNIT_ASSERT_EQUAL( aExpected, parseDump("/root/page[9]/body/txt[2]", "")); } + +DECLARE_FILE_MAILMERGE_TEST(testTdf123057_file, "pagecounttest.ott", "db_pagecounttest.ods", "Sheet1") +{ + executeMailMerge(true); + + for (int doc = 0; doc < 4; ++doc) + { + loadMailMergeDocument(doc); + + // get document properties + uno::Reference xSectionsSupplier(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xSections(xSectionsSupplier->getTextSections(), uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount()); + uno::Reference xSect0(xSections->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xSect1(xSections->getByIndex(1), uno::UNO_QUERY_THROW); + + OUString sFieldPageCount; + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + if (xFields.is()) + { + while (xFields->hasMoreElements()) + { + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + if (xServiceInfo->supportsService("com.sun.star.text.textfield.PageCount")) + { + uno::Reference xField(aField, uno::UNO_QUERY); + sFieldPageCount = xField->getAnchor()->getString(); + } + } + } + + switch (doc) + { + case 0: + // both sections visible, page num is 2 + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect0, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect1, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(OUString("2"), sFieldPageCount); + break; + case 1: + // second section hidden, page num is 1 + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect0, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xSect1, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(OUString("1"), sFieldPageCount); + break; + case 2: + // first section hidden, page num is 1 + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xSect0, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect1, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(OUString("1"), sFieldPageCount); + break; + case 3: + // both sections hidden, page num is 1 + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xSect0, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xSect1, "IsCurrentlyVisible")); + CPPUNIT_ASSERT_EQUAL(OUString("1"), sFieldPageCount); + break; + } + } +} + + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index fc68894c539d..d5e5790445b1 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -1497,6 +1497,9 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, // prepare working copy and target to append pWorkDoc->RemoveInvisibleContent(); + // remove of invisible content has influence on page count and so on fields for page count, + // therefore layout has to be updated before fields are converted to text + pWorkShell->CalcLayout(); pWorkShell->ConvertFieldsToText(); pWorkShell->SetNumberingRestart(); if( bSynchronizedDoc ) @@ -1512,8 +1515,6 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, ++targetDocPageCount; // Docs always start on odd pages (so offset must be even). SwNodeIndex appendedDocStart = pTargetDoc->AppendDoc( *pWorkDoc, nStartingPageNo, !bWorkDocInitialized, targetDocPageCount, nDocNo); - // ensure layout is up to date in order to get correct page count - pWorkShell->CalcLayout(); targetDocPageCount += pWorkShell->GetPageCnt(); if ( (nMaxDumpDocs < 0) || (nDocNo <= nMaxDumpDocs) ) -- cgit