sw/qa/core/text/data/floattable-wrap-empty-para-legacy.docx |binary sw/qa/core/text/itrform2.cxx | 28 ++++++++++++ sw/qa/core/text/text.cxx | 4 - sw/source/core/inc/txtfly.hxx | 3 + sw/source/core/text/itrform2.cxx | 10 ++-- sw/source/core/text/txtfly.cxx | 3 - 6 files changed, 38 insertions(+), 10 deletions(-)
New commits: commit 2e2398ee7b9e2115f6b691f107a6223455d72ef6 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Mon Jul 17 09:00:33 2023 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Mon Jul 31 11:46:36 2023 +0200 tdf#120262 sw floattable, legacy: fix text wrap around fly when no content fits The bugdoc is created from DOC (so tables are shifted to the left, slightly) and has 2 floating tables on 2 pages. Writer puts them to a single page, so they overlap, which is not wanted. The trouble is that there is some space (but not much) on the right of the floating table on page 1, and Writer wraps the empty anchor of the floating table on the right of the floating table, while Word puts it below the table, so no overlap happens. Fix the problem by extending the work from commit 8f8b31abd02876c3601e343b8b3274754f8a61b6 (compatibility setting for MS Word wrapping text in less space (bnc#822908), 2013-08-06), and work with that limit in SwTextFormatter::CalcFlyWidth(). This way Writer keeps its behavior that PARALLEL wrap text mode requires no minimal text width for existing documents, but correctly ~300 twips minimal text width (Word formats). The bugdoc still has a footer vs floating table overlap, but at least no 2 floating tables overlap now. (cherry picked from commit a4af5432753408c4eea8a8d56c2f48202160c5fe) Change-Id: Ib307ede08ead272fe16dca261db615fd8e9c547d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154646 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/qa/core/text/data/floattable-wrap-empty-para-legacy.docx b/sw/qa/core/text/data/floattable-wrap-empty-para-legacy.docx new file mode 100644 index 000000000000..c62a25a193a7 Binary files /dev/null and b/sw/qa/core/text/data/floattable-wrap-empty-para-legacy.docx differ diff --git a/sw/qa/core/text/itrform2.cxx b/sw/qa/core/text/itrform2.cxx index 066a8fb331a6..e190bed46f33 100644 --- a/sw/qa/core/text/itrform2.cxx +++ b/sw/qa/core/text/itrform2.cxx @@ -54,6 +54,34 @@ CPPUNIT_TEST_FIXTURE(Test, testFloattableWrapEmptyParagraph) const SwSortedObjs& rPageObjs2 = *pPage2->GetSortedObjs(); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPageObjs2.size()); } + +CPPUNIT_TEST_FIXTURE(Test, testFloattableLegacyWrapEmptyParagraph) +{ + // Given a document with 2 pages, a floating table on both pages (from DOC, so the table is + // shifted towards the left page edge slightly): + createSwDoc("floattable-wrap-empty-para-legacy.docx"); + + // When calculating the layout: + calcLayout(); + + // Then make sure that each page has exactly 1 floating table: + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage = dynamic_cast<SwPageFrame*>(pLayout->Lower()); + CPPUNIT_ASSERT(pPage); + CPPUNIT_ASSERT(pPage->GetSortedObjs()); + const SwSortedObjs& rPageObjs = *pPage->GetSortedObjs(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 2 + // i.e. both tables were on page 1, leading to an overlap. + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPageObjs.size()); + auto pPage2 = dynamic_cast<SwPageFrame*>(pPage->GetNext()); + CPPUNIT_ASSERT(pPage2); + CPPUNIT_ASSERT(pPage2->GetSortedObjs()); + const SwSortedObjs& rPageObjs2 = *pPage2->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPageObjs2.size()); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/core/text/text.cxx b/sw/qa/core/text/text.cxx index 83acef5e77d8..84cbf830db15 100644 --- a/sw/qa/core/text/text.cxx +++ b/sw/qa/core/text/text.cxx @@ -1286,10 +1286,10 @@ CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testParaUpperMarginFlyIntersect) nHeight += getXPath(pXmlDoc, xPath, "height").toInt32(); } // Without the accompanying fix in place, this test would have failed with: - // - Expected: 521 (~500) + // - Expected: 542 (~500) // - Actual : 857 (~1000) // I.e. both upper and lower margin was taken into account. - CPPUNIT_ASSERT_EQUAL(521, nHeight); + CPPUNIT_ASSERT_EQUAL(542, nHeight); } CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testTdf129810) diff --git a/sw/source/core/inc/txtfly.hxx b/sw/source/core/inc/txtfly.hxx index 95d70198f858..fe0782dcf938 100644 --- a/sw/source/core/inc/txtfly.hxx +++ b/sw/source/core/inc/txtfly.hxx @@ -86,6 +86,9 @@ public: const bool bRight ); }; +// MS Word wraps on sides with even less space (value guessed). +#define TEXT_MIN_SMALL 300 + /** The purpose of this class is to be the universal interface between formatting/text output and the possibly overlapping free-flying frames. diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx index 2f5abb9a5c6b..10a7671279da 100644 --- a/sw/source/core/text/itrform2.cxx +++ b/sw/source/core/text/itrform2.cxx @@ -2802,12 +2802,12 @@ void SwTextFormatter::CalcFlyWidth( SwTextFormatInfo &rInf ) bool bFullLine = aLine.Left() == aInter.Left() && aLine.Right() == aInter.Right(); - if (!bFullLine && bWordFlyWrap) + if (!bFullLine && bWordFlyWrap && !GetTextFrame()->IsInTab()) { - // Word >= 2013 style: if there is minimal space remaining, then handle that similar to a - // full line and put the actual empty paragraph below the fly. - bFullLine = std::abs(aLine.Left() - aInter.Left()) < MINLAY - && std::abs(aLine.Right() - aInter.Right()) < MINLAY; + // Word style: if there is minimal space remaining, then handle that similar to a full line + // and put the actual empty paragraph below the fly. + bFullLine = std::abs(aLine.Left() - aInter.Left()) < TEXT_MIN_SMALL + && std::abs(aLine.Right() - aInter.Right()) < TEXT_MIN_SMALL; } // Although no text is left, we need to format another line, diff --git a/sw/source/core/text/txtfly.cxx b/sw/source/core/text/txtfly.cxx index c080a42248a8..e5bf03162db4 100644 --- a/sw/source/core/text/txtfly.cxx +++ b/sw/source/core/text/txtfly.cxx @@ -1388,9 +1388,6 @@ SwRect SwTextFly::AnchoredObjToRect( const SwAnchoredObject* pAnchoredObj, // Wrap only on sides with at least 2cm space for the text #define TEXT_MIN 1134 -// MS Word wraps on sides with even less space (value guessed). -#define TEXT_MIN_SMALL 300 - // Wrap on both sides up to a frame width of 1.5cm #define FRAME_MAX 850