From aafafca61527fb650d3f9f11ec6c8226cd612fae Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 28 Jan 2019 17:18:34 +0100 Subject: tdf#122942 sw: update shape insert UI for the AddVerticalFrameOffsets option Regression from commit 50223ea6e212b60b7d33839c2753c5601fb50f95 (tdf#98987 sw: add AddVerticalFrameOffsets compat mode, 2016-03-31), SwFEShell::ImpEndCreate() was not adapted to call SwTextFrame::GetBaseVertOffsetForFly() when determining the vertical position of the inserted shape. The call can be unconditional, the returned value is already 0 when the DocumentSettingId::ADD_VERTICAL_FLY_OFFSETS compat setting is false. (cherry picked from commit 4218caf142a7ecac34548c6d38c6f6fbebb898b9) Conflicts: sw/qa/extras/uiwriter/uiwriter2.cxx Change-Id: Iec6af5a6d1ff3466e08377853cc8ca84f33a76d1 Reviewed-on: https://gerrit.libreoffice.org/71126 Reviewed-by: Aron Budea Tested-by: Aron Budea --- sw/qa/extras/uiwriter/data2/tdf122942.odt | Bin 0 -> 9864 bytes sw/qa/extras/uiwriter/uiwriter2.cxx | 43 +++++++++++++++++++++++++++--- sw/source/core/frmedt/feshview.cxx | 23 +++++++++------- 3 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 sw/qa/extras/uiwriter/data2/tdf122942.odt diff --git a/sw/qa/extras/uiwriter/data2/tdf122942.odt b/sw/qa/extras/uiwriter/data2/tdf122942.odt new file mode 100644 index 000000000000..c56583d305f2 Binary files /dev/null and b/sw/qa/extras/uiwriter/data2/tdf122942.odt differ diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index e104e2e4dde4..df4fef72e547 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -23,6 +23,7 @@ #include #include #include +#include namespace { @@ -43,6 +44,7 @@ public: void testCheckboxFormFieldInsertion(); void testDropDownFormFieldInsertion(); void testMixedFormFieldInsertion(); + void testTdf122942(); CPPUNIT_TEST_SUITE(SwUiWriterTest2); CPPUNIT_TEST(testTdf101534); @@ -54,6 +56,7 @@ public: CPPUNIT_TEST(testCheckboxFormFieldInsertion); CPPUNIT_TEST(testDropDownFormFieldInsertion); CPPUNIT_TEST(testMixedFormFieldInsertion); + CPPUNIT_TEST(testTdf122942); CPPUNIT_TEST_SUITE_END(); private: @@ -67,14 +70,17 @@ SwDoc* SwUiWriterTest2::createDoc(const char* pName) else load(DATA_DIRECTORY, pName); - SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); return pTextDoc->GetDocShell()->GetDoc(); } -static void lcl_dispatchCommand(const uno::Reference& xComponent, const OUString& rCommand, const uno::Sequence& rPropertyValues) +static void lcl_dispatchCommand(const uno::Reference& xComponent, + const OUString& rCommand, + const uno::Sequence& rPropertyValues) { - uno::Reference xController = uno::Reference(xComponent, uno::UNO_QUERY)->getCurrentController(); + uno::Reference xController + = uno::Reference(xComponent, uno::UNO_QUERY)->getCurrentController(); CPPUNIT_ASSERT(xController.is()); uno::Reference xFrame(xController->getFrame(), uno::UNO_QUERY); CPPUNIT_ASSERT(xFrame.is()); @@ -425,6 +431,37 @@ void SwUiWriterTest2::testMixedFormFieldInsertion() CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pMarkAccess->getAllMarksCount()); } +void SwUiWriterTest2::testTdf122942() +{ + load(DATA_DIRECTORY, "tdf122942.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + + // Do the moral equivalent of mouse button down, move and up. + // Start creating a custom shape that overlaps with the rounded rectangle + // already present in the document. + Point aStartPos(8000, 3000); + pWrtShell->BeginCreate(static_cast(OBJ_CUSTOMSHAPE), aStartPos); + + // Set its size. + Point aMovePos(10000, 5000); + pWrtShell->MoveCreate(aMovePos); + + // Finish creation. + pWrtShell->EndCreate(SdrCreateCmd::ForceEnd); + + // Make sure that the shape is inserted. + SwDoc* pDoc = pWrtShell->GetDoc(); + const SwFrameFormats& rFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT_EQUAL(static_cast(2), rFormats.size()); + + // Without the accompanying fix in place, this test would have failed with + // 'Expected less than: 0; Actual : 1030', i.e. the shape was below the + // paragraph mark, not above it. + const SwFormatVertOrient& rVert = rFormats[1]->GetVertOrient(); + CPPUNIT_ASSERT_LESS(static_cast(0), rVert.GetPos()); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest2); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx index 4f17c72777f1..8066f9f4108e 100644 --- a/sw/source/core/frmedt/feshview.cxx +++ b/sw/source/core/frmedt/feshview.cxx @@ -1936,17 +1936,22 @@ bool SwFEShell::ImpEndCreate() nXOffset = pAnch->getFrameArea().Left()+pAnch->getFrameArea().Width()-rBound.Right(); else nXOffset = rBound.Left() - pAnch->getFrameArea().Left(); - if( pAnch->IsTextFrame() && static_cast(pAnch)->IsFollow() ) + if (pAnch->IsTextFrame()) { const SwTextFrame* pTmp = static_cast(pAnch); - do { - pTmp = pTmp->FindMaster(); - OSL_ENSURE( pTmp, "Where's my Master?" ); - // OD 2004-03-30 #i26791# - correction: add frame area height - // of master frames. - nYOffset += pTmp->IsVertical() ? - pTmp->getFrameArea().Width() : pTmp->getFrameArea().Height(); - } while ( pTmp->IsFollow() ); + if (pTmp->IsFollow()) + { + do { + pTmp = pTmp->FindMaster(); + OSL_ENSURE(pTmp, "Where's my Master?"); + // OD 2004-03-30 #i26791# - correction: add frame area height + // of master frames. + nYOffset += pTmp->IsVertical() ? + pTmp->getFrameArea().Width() : pTmp->getFrameArea().Height(); + } while (pTmp->IsFollow()); + } + + nYOffset -= pTmp->GetBaseVertOffsetForFly(false); } } -- cgit