tdf#148366 sw clearing breaks: fix handling of anchored objs from header/footer
Regression from commit f86d1482bef285f90079b5130e410646db96cf58 (sw
clearing breaks: add DOCX import, 2022-03-08), the trouble was that we
considered an anchored object from the header for text wrapping, while
this anchored object was in the background in Word.
Change-Id: I806cc91ce1eb390c02cbff2defa4cb47fde86853
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132578
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
diff --git a/sw/qa/core/text/data/clearing-break-header.fodt b/sw/qa/core/text/data/clearing-break-header.fodt
new file mode 100644
index 0000000..2bdbcd3
--- /dev/null
+++ b/sw/qa/core/text/data/clearing-break-header.fodt
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<office:document xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
<office:automatic-styles>
<style:style style:name="gr1" style:family="graphic">
<style:graphic-properties fo:margin-left="0.318cm" fo:margin-right="0.318cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:run-through="background" style:wrap="run-through" style:number-wrapped-paragraphs="no-limit" style:vertical-pos="from-top" style:vertical-rel="page" style:horizontal-pos="from-left" style:horizontal-rel="page" draw:wrap-influence-on-position="once-concurrent" loext:allow-overlap="true" style:flow-with-text="false"/>
</style:style>
<style:style style:name="gr2" style:family="graphic">
<style:graphic-properties draw:stroke="none" svg:stroke-width="0cm" draw:fill="none" draw:textarea-horizontal-align="center" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" style:run-through="background"/>
</style:style>
<style:page-layout style:name="pm1">
<style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" fo:margin-top="1.251cm" fo:margin-bottom="2.54cm" fo:margin-left="2.501cm" fo:margin-right="2.501cm">
</style:page-layout-properties>
<style:header-style>
<style:header-footer-properties fo:min-height="1.289cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-bottom="1.189cm" style:dynamic-spacing="true"/>
</style:header-style>
</style:page-layout>
</office:automatic-styles>
<office:master-styles>
<style:master-page style:name="Standard" style:page-layout-name="pm1">
<style:header>
<text:p><draw:g text:anchor-type="char" draw:z-index="1" draw:style-name="gr1"><draw:rect draw:style-name="gr2" svg:width="8.347cm" svg:height="8.908cm" svg:x="11.871cm" svg:y="21.243cm"><text:p/></draw:rect></draw:g></text:p>
<text:p/>
</style:header>
</style:master-page>
</office:master-styles>
<office:body>
<office:text>
<text:p><text:line-break loext:clear="all"/></text:p>
</office:text>
</office:body>
</office:document>
diff --git a/sw/qa/core/text/text.cxx b/sw/qa/core/text/text.cxx
index ec04039..8ad0d23 100644
--- a/sw/qa/core/text/text.cxx
+++ b/sw/qa/core/text/text.cxx
@@ -366,6 +366,22 @@ CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testClearingLineBreakLeft)
assertXPath(pXmlDoc, "//SwParaPortion/SwLineLayout[1]", "height", "2837");
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testClearingLineBreakHeader)
{
// Given a document with a shape in the header and a clearing break in the body text:
createSwDoc(DATA_DIRECTORY, "clearing-break-header.fodt");
// When laying out that document:
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// Then make sure that the shape from the header is ignored while calculating the line height:
// Without the accompanying fix in place, this test would have failed with:
// - Expected: 276
// - Actual : 15398
// i.e. the shape was in the background, but we failed to ignore it for the break portion.
assertXPath(pXmlDoc, "//SwParaPortion/SwLineLayout[1]", "height", "276");
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/text/txtfly.cxx b/sw/source/core/text/txtfly.cxx
index 1b9c3b5..88f0687 100644
--- a/sw/source/core/text/txtfly.cxx
+++ b/sw/source/core/text/txtfly.cxx
@@ -1012,6 +1012,13 @@ SwTwips SwTextFly::GetMaxBottom(const SwBreakPortion& rPortion, const SwTextForm
for (size_t i = 0; i < nCount; ++i)
{
const SwAnchoredObject* pAnchoredObj = (*mpAnchoredObjList)[i];
if (pAnchoredObj->GetAnchorFrame()->FindFooterOrHeader())
{
// Anchored in the header or footer, ignore it for clearing break purposes.
continue;
}
SwRect aRect(pAnchoredObj->GetObjRectWithSpaces());
if (rPortion.GetClear() == SwLineBreakClear::LEFT)
{