summaryrefslogtreecommitdiff
path: root/sw/qa/extras/layout/layout3.cxx
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2024-02-09 11:56:19 +0600
committerMike Kaganski <mike.kaganski@collabora.com>2024-02-14 21:54:55 +0100
commit0c96119895b347f8eb5bb89f393351bd3c02b9f1 (patch)
tree00523cee811e15bd688452453c5590301cca756d /sw/qa/extras/layout/layout3.cxx
parent3a0807b08f0254e89d361322bce1ef13df3427f2 (diff)
tdf#159565 prerequisite: make hidden sections have zero-height frames
As mentioned in commit bb733957dd39e6f0b9d80bb59eb0177188794797 (tdf#114973 sw: enable SelectAll with hidden para at start/end, 2023-01-27), the hidden sections didn't have frames. That prevented correct handling of the case when such a frame was in the beginning of the document. This change re-implements the hidden section to use 0-height frames, like hidden paragraphs, as a pre-requisite for a follow-up change. Some layout breakages noticed while working on this are unit-tested now. This change needed to handle the case when the first section is hidden, and then goes a page break with page style. In this case, the page style must apply to the very first page of the document. Implementing this now, when the frame that defines the page style is not the first in the document, I accidentally fixed also the previously broken case when the first paragraph was hidden. Now the page style defined in the second paragraph's page break will apply correctly. This change makes hidden sections break outer section's frames. This means that when text borders are shown, there will be an artifact in the place of the hidden sections (a horizontal line breaking outer frame). I suppose it's not a problem, actually helping to see the layout better, so in line with the "show text borders" helper functionality. If this proves to be problematic, this can be handled specially in a follow-up. Change-Id: I14ebf0559b463186aba28902cd10c5cc978ba456 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163151 Tested-by: Mike Kaganski <mike.kaganski@collabora.com> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'sw/qa/extras/layout/layout3.cxx')
-rw-r--r--sw/qa/extras/layout/layout3.cxx68
1 files changed, 59 insertions, 9 deletions
diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx
index 846899cdd4a6..de11ac7d788d 100644
--- a/sw/qa/extras/layout/layout3.cxx
+++ b/sw/qa/extras/layout/layout3.cxx
@@ -97,15 +97,25 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf119875)
{
createSwDoc("tdf119875.odt");
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
- sal_Int32 nFirstTop
- = getXPath(pXmlDoc, "/root/page[2]/body/section[1]/infos/bounds"_ostr, "top"_ostr)
- .toInt32();
- sal_Int32 nSecondTop
- = getXPath(pXmlDoc, "/root/page[2]/body/section[2]/infos/bounds"_ostr, "top"_ostr)
- .toInt32();
- // The first section had the same top value as the second one, so they
- // overlapped.
- CPPUNIT_ASSERT_LESS(nSecondTop, nFirstTop);
+
+ assertXPath(pXmlDoc, "//page[2]/body/section[1]"_ostr, "formatName"_ostr, u"S10"_ustr);
+ assertXPath(pXmlDoc, "//page[2]/body/section[2]"_ostr, "formatName"_ostr, u"S11"_ustr);
+ assertXPath(pXmlDoc, "//page[2]/body/section[3]"_ostr, "formatName"_ostr, u"S13"_ustr);
+ assertXPath(pXmlDoc, "//page[2]/body/section[4]"_ostr, "formatName"_ostr, u"S14"_ustr);
+ // Sections "S10" and "S13" are hidden -> their frames are zero-height
+ assertXPath(pXmlDoc, "//page[2]/body/section[1]/infos/bounds"_ostr, "height"_ostr, u"0"_ustr);
+ assertXPath(pXmlDoc, "//page[2]/body/section[3]/infos/bounds"_ostr, "height"_ostr, u"0"_ustr);
+
+ OUString S10Top = getXPath(pXmlDoc, "//page[2]/body/section[1]/infos/bounds"_ostr, "top"_ostr);
+ OUString S11Top = getXPath(pXmlDoc, "//page[2]/body/section[2]/infos/bounds"_ostr, "top"_ostr);
+ OUString S13Top = getXPath(pXmlDoc, "//page[2]/body/section[3]/infos/bounds"_ostr, "top"_ostr);
+ OUString S14Top = getXPath(pXmlDoc, "//page[2]/body/section[4]/infos/bounds"_ostr, "top"_ostr);
+
+ CPPUNIT_ASSERT_EQUAL(S10Top, S11Top);
+ CPPUNIT_ASSERT_EQUAL(S13Top, S14Top);
+
+ // Section "S11" had the same top value as section "S14", so they overlapped.
+ CPPUNIT_ASSERT_LESS(S14Top.toInt32(), S11Top.toInt32());
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf137523)
@@ -2339,6 +2349,46 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf159259)
CPPUNIT_ASSERT_EQUAL(paraHeight, flyHeight);
}
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testLargeTopParaMarginAfterHiddenSection)
+{
+ // Given a large top margin in Standard paragraph style, and the first section hidden
+ createSwDoc("largeTopMarginAndHiddenFirstSection.fodt");
+ xmlDocUniquePtr pXmlDoc = parseLayoutDump();
+ // Make sure there is only one page and two sections, first hidden (zero-height)
+ assertXPath(pXmlDoc, "//page"_ostr, 1);
+ assertXPath(pXmlDoc, "//page/body/section"_ostr, 2);
+ assertXPath(pXmlDoc, "//page/body/section[1]/infos/bounds"_ostr, "height"_ostr, u"0"_ustr);
+ // Check that the top margin (1 in = 1440 twip) is added to line height (12 pt = 240 twip)
+ assertXPath(pXmlDoc, "//page/body/section[2]/infos/bounds"_ostr, "height"_ostr, u"1680"_ustr);
+}
+
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testPageBreakInHiddenSection)
+{
+ // Given a paragraph with page-break-before with page style and page number
+ createSwDoc("pageBreakInHiddenSection.fodt");
+ xmlDocUniquePtr pXmlDoc = parseLayoutDump();
+ assertXPath(pXmlDoc, "//page"_ostr, 4);
+ assertXPath(pXmlDoc, "//section"_ostr, 4);
+ assertXPath(pXmlDoc, "//page[1]/body/txt"_ostr, 1);
+ // The page break inside the hidden section is ignored (otherwise, there would be one section
+ // on the first page)
+ assertXPath(pXmlDoc, "//page[1]/body/section"_ostr, 2);
+ // The first section is hidden
+ assertXPath(pXmlDoc, "//page[1]/body/section[1]/infos/bounds"_ostr, "height"_ostr, u"0"_ustr);
+
+ // Page 2 is empty even page (generated by the next page's section with page-break-before)
+ assertXPath(pXmlDoc, "//page[2]/body"_ostr, 0);
+
+ // The section on page 3 is not hidden, only text in it is, therefore its page break works
+ assertXPath(pXmlDoc, "//page[3]/body/section"_ostr, 1);
+ assertXPath(pXmlDoc, "//page[3]/body/section/infos/bounds"_ostr, "height"_ostr, u"0"_ustr);
+
+ // The section on page 4 is hidden, thus page break in it is ignored (no further pages, where
+ // the section would be moved to otherwise)
+ assertXPath(pXmlDoc, "//page[4]/body/section"_ostr, 1);
+ assertXPath(pXmlDoc, "//page[4]/body/section/infos/bounds"_ostr, "height"_ostr, u"0"_ustr);
+}
+
} // end of anonymous namespace
CPPUNIT_PLUGIN_IMPLEMENT();