sw/qa/extras/layout/layout.cxx | 50 ++++++++++ sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx | 13 ++ 2 files changed, 63 insertions(+)
New commits: commit ac7047f72087f09f2ab223f1af2518778382c06a Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Sep 24 14:57:53 2019 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Sep 24 16:16:48 2019 +0200 Related: tdf#124600 sw anchored object allow overlap: wrap-through handling Wrap-through and allow-overlap are conflicting requirements. Word gives wrap-though a priority, i.e. those objects can still overlap, even if allow-overlap=false is set. Let Writer have the same priority, this flag was added primarily for interoperability purposes. [ No compatibility flag, AllowOverlap is "@since LibreOffice 6.4", so the behavior can be just changed. ] Change-Id: I3743e6c94f8430c86c1ab5ffe0aabc4537e35ccc Reviewed-on: https://gerrit.libreoffice.org/79458 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index ccbfd0b944a3..a6d70234f423 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -12,6 +12,7 @@ #include <comphelper/propertysequence.hxx> #include <com/sun/star/linguistic2/LinguServiceManager.hpp> #include <com/sun/star/frame/DispatchHelper.hpp> +#include <com/sun/star/text/WrapTextMode.hpp> #include <comphelper/scopeguard.hxx> #include <unotools/syslocaleoptions.hxx> #include <i18nlangtag/languagetag.hxx> @@ -3154,6 +3155,55 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testShapeAllowOverlap) #endif } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testShapeAllowOverlapWrap) +{ + // Create an empty document with two, intentionally overlapping shapes. + // Set their AllowOverlap property to false and their wrap to through. + loadURL("private:factory/swriter", nullptr); + uno::Reference<lang::XMultiServiceFactory> xDocument(mxComponent, uno::UNO_QUERY); + awt::Point aPoint(1000, 1000); + awt::Size aSize(2000, 2000); + uno::Reference<drawing::XShape> xShape( + xDocument->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setPosition(aPoint); + xShape->setSize(aSize); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(xDocument, uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xShapeProperties(xShape, uno::UNO_QUERY); + xShapeProperties->setPropertyValue("AllowOverlap", uno::makeAny(false)); + xShapeProperties->setPropertyValue("AnchorType", + uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); + xShapeProperties->setPropertyValue("Surround", uno::makeAny(text::WrapTextMode_THROUGH)); + xDrawPageSupplier->getDrawPage()->add(xShape); + + aPoint = awt::Point(2000, 2000); + xShape.set(xDocument->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setPosition(aPoint); + xShape->setSize(aSize); + xShapeProperties.set(xShape, uno::UNO_QUERY); + xShapeProperties->setPropertyValue("AllowOverlap", uno::makeAny(false)); + xShapeProperties->setPropertyValue("AnchorType", + uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); + xShapeProperties->setPropertyValue("Surround", uno::makeAny(text::WrapTextMode_THROUGH)); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // Now verify that the rectangle of the anchored objects do overlap. + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwFrame* pPageFrame = pLayout->GetLower(); + SwFrame* pBodyFrame = pPageFrame->GetLower(); + SwFrame* pTextFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pTextFrame->GetDrawObjs()); + SwSortedObjs& rObjs = *pTextFrame->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rObjs.size()); + SwAnchoredObject* pFirst = rObjs[0]; + SwAnchoredObject* pSecond = rObjs[1]; + // Without the accompanying fix in place, this test would have failed: AllowOverlap=no had + // priority over Surround=through (which is bad for Word compat). + CPPUNIT_ASSERT(pSecond->GetObjRect().IsOver(pFirst->GetObjRect())); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf124600) { createDoc("tdf124600.docx"); diff --git a/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx b/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx index 0fc56d1af80e..ec4ceeb61578 100644 --- a/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx +++ b/sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx @@ -1083,6 +1083,12 @@ void SwToContentAnchoredObjectPosition::CalcOverlap(const SwTextFrame* pAnchorFr return; } + if (rFrameFormat.GetSurround().GetSurround() == css::text::WrapTextMode_THROUGH) + { + // This is explicit wrap through: allowed to overlap. + return; + } + if (SwTextBoxHelper::isTextBox(&rFrameFormat, RES_FLYFRMFMT)) { // This is the frame part of a textbox, just take the offset from the textbox's shape part. @@ -1116,6 +1122,13 @@ void SwToContentAnchoredObjectPosition::CalcOverlap(const SwTextFrame* pAnchorFr continue; } + css::text::WrapTextMode eWrap = pAnchoredObj->GetFrameFormat().GetSurround().GetSurround(); + if (eWrap == css::text::WrapTextMode_THROUGH) + { + // The other object is wrap through: allowed to overlap. + continue; + } + if (!GetAnchoredObj().GetObjRect().IsOver(pAnchoredObj->GetObjRect())) { // Found an already positioned object, but it doesn't overlap, ignore. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits