From 200cd2b99bee18962a970edc5d059286f6c3ea0e Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 11 Jan 2021 21:03:34 +0100 Subject: [PATCH] tdf#138995 DOCX import: fix handling of textbox zorders Regression from commit d379d18666aa42031359ca8eb34b0021960347ae (oox: import WPS shape with text as shape with textbox, 2014-06-18), the problem was that a textbox's shape + textframe are internally 2 sdr objects, so once GraphicZOrderHelper knows the current shape should be on top of a shape+frame pair, it should suggest a larger ZOrder. This is necessary till there is no setter version of SwTextBoxHelper::getOrdNum(), which would allow import filters to ignore this complexity, but that would be a larger change. Change-Id: Ibbb1bcd9301eb369f25f211120f62be7c59b0fd2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109111 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- sw/CppunitTest_sw_core_doc.mk | 1 + sw/qa/core/doc/data/textbox-zorder.docx | Bin 0 -> 5407 bytes sw/qa/core/doc/doc.cxx | 16 ++++++++++++++++ writerfilter/source/dmapper/GraphicHelpers.cxx | 14 ++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 sw/qa/core/doc/data/textbox-zorder.docx diff --git a/sw/CppunitTest_sw_core_doc.mk b/sw/CppunitTest_sw_core_doc.mk index ba2555099e3b..934ccf8eee6f 100644 --- a/sw/CppunitTest_sw_core_doc.mk +++ b/sw/CppunitTest_sw_core_doc.mk @@ -24,6 +24,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_core_doc, \ editeng \ sal \ sfx \ + svxcore \ sw \ swqahelper \ test \ diff --git a/sw/qa/core/doc/data/textbox-zorder.docx b/sw/qa/core/doc/data/textbox-zorder.docx new file mode 100644 index 0000000000000000000000000000000000000000..d5263f8bbd6b536e03faf49fc04cd5626b58facc GIT binary patch literal 5407 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 + CPPUNIT_ASSERT_EQUAL(static_cast(3), rFormats.size()); + const SwFrameFormat* pEllipse = rFormats[2]; + const SdrObject* pEllipseShape = pEllipse->FindRealSdrObject(); + // Make sure we test the right shape. + CPPUNIT_ASSERT_EQUAL(OUString("Shape3"), pEllipseShape->GetName()); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 1 + // i.e. the ellipse was under the frame of the shape-frame pair, not on top of it. + CPPUNIT_ASSERT_EQUAL(static_cast(2), pEllipseShape->GetOrdNum()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx index 0bd7354fd962..d4fc4b9a8c09 100644 --- a/writerfilter/source/dmapper/GraphicHelpers.cxx +++ b/writerfilter/source/dmapper/GraphicHelpers.cxx @@ -295,6 +295,20 @@ sal_Int32 GraphicZOrderHelper::findZOrder( sal_Int32 relativeHeight, bool bOldSt return 0; --it; itemZOrderOffset = 1; // after the topmost + + // Check if this shape has a textbox. If so, the textbox will have its own ZOrder, so + // suggest a larger offset. + bool bTextBox = false; + uno::Reference xShape = it->second; + uno::Reference xInfo = xShape->getPropertySetInfo(); + if (xInfo->hasPropertyByName("TextBox")) + { + xShape->getPropertyValue("TextBox") >>= bTextBox; + } + if (bTextBox) + { + ++itemZOrderOffset; + } } // SwXFrame::getPropertyValue throws uno::RuntimeException // when its GetFrameFormat() returns nullptr