Kaydet (Commit) 27894be9 authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#123651 sw AddVerticalFrameOffsets: make vert offset depend on hori offset

Regression from commit 961ba62d
(tdf#123032 sw, AddVerticalFrameOffsets: fix shape pos after mouse move,
2019-02-07), the vertical position of the bugdoc was too large, and
turns out Word only works with vertical offsets if there is already a
horizontal offset.

For example open tdf98987.docx in Word, remove the left square shape,
notice how the other square shape jumps up due to no longer working with
a vertical offset (while the doc model vertical position of the shape is
unchanged).

Change our layout, so that in case the AddVerticalFrameOffsets
compatibility flag is on (which was added to emulate Word's behavior),
we also consider the horizontal offset before setting the vertical
offset.

Also improve the SwUiWriterTest2::testTdf122942() test that asserted doc
model positions, which are now different (needed so that at the end the
layout position visible to the user is unchanged).

Change-Id: I8ac451efbacefdd3578b3a578260e7b2060c16a6
Reviewed-on: https://gerrit.libreoffice.org/69716
Tested-by: Jenkins
Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.com>
üst c49583e9
......@@ -72,6 +72,7 @@ public:
void testTdf122607();
void testBtlrCell();
void testTdf123898();
void testTdf123651();
CPPUNIT_TEST_SUITE(SwLayoutWriter);
CPPUNIT_TEST(testRedlineFootnotes);
......@@ -114,6 +115,7 @@ public:
CPPUNIT_TEST(testTdf122607);
CPPUNIT_TEST(testBtlrCell);
CPPUNIT_TEST(testTdf123898);
CPPUNIT_TEST(testTdf123651);
CPPUNIT_TEST_SUITE_END();
private:
......@@ -2938,6 +2940,15 @@ void SwLayoutWriter::testTdf123898()
assertXPathChildren(pXmlDoc, "/root/page/body/txt/anchored/fly/txt", 42);
}
void SwLayoutWriter::testTdf123651()
{
createDoc("tdf123651.docx");
xmlDocPtr pXmlDoc = parseLayoutDump();
// Without the accompanying fix in place, this test would have failed with 'Expected: 7639;
// Actual: 12926'. The shape was below the second "Lorem ipsum" text, not above it.
assertXPath(pXmlDoc, "//SwAnchoredDrawObject/bounds", "top", "7639");
}
CPPUNIT_TEST_SUITE_REGISTRATION(SwLayoutWriter);
CPPUNIT_PLUGIN_IMPLEMENT();
......
......@@ -891,12 +891,6 @@ void SwUiWriterTest2::testTdf122942()
const SwFrameFormats& rFormats = *pDoc->GetSpzFrameFormats();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(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<SwTwips>(0), rVert.GetPos());
reload("writer8", "tdf122942.odt");
pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
pWrtShell = pTextDoc->GetDocShell()->GetWrtShell();
......@@ -904,14 +898,15 @@ void SwUiWriterTest2::testTdf122942()
const SwFrameFormats& rFormats2 = *pDoc->GetSpzFrameFormats();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rFormats2.size());
SdrObject* pObject = rFormats2[1]->FindSdrObject();
CPPUNIT_ASSERT(pObject);
const tools::Rectangle& rOutRect = pObject->GetLastBoundRect();
// Without the accompanying fix in place, this test would have failed with
// 'Expected greater than: 5000; Actual: 2817', i.e. the shape moved up
// after a reload(), while it's expected to not change its position (5773).
CPPUNIT_ASSERT_GREATER(static_cast<SwTwips>(5000), rOutRect.Top());
// Make sure the top of the inserted shape does not move outside the existing shape, even after
// reload.
SdrObject* pObject1 = rFormats2[0]->FindSdrObject();
CPPUNIT_ASSERT(pObject1);
const tools::Rectangle& rOutRect1 = pObject1->GetLastBoundRect();
SdrObject* pObject2 = rFormats2[1]->FindSdrObject();
CPPUNIT_ASSERT(pObject2);
const tools::Rectangle& rOutRect2 = pObject2->GetLastBoundRect();
CPPUNIT_ASSERT(rOutRect2.Top() > rOutRect1.Top() && rOutRect2.Top() < rOutRect1.Bottom());
}
void SwUiWriterTest2::testTdf52391()
......
......@@ -3976,7 +3976,8 @@ void SwTextFrame::CalcBaseOfstForFly()
if (!GetDoc().getIDocumentSettingAccess().get(DocumentSettingId::ADD_VERTICAL_FLY_OFFSETS))
return;
mnFlyAnchorVertOfstNoWrap = nFlyAnchorVertOfstNoWrap;
if (mnFlyAnchorOfstNoWrap > 0)
mnFlyAnchorVertOfstNoWrap = nFlyAnchorVertOfstNoWrap;
}
SwTwips SwTextFrame::GetBaseVertOffsetForFly(bool bIgnoreFlysAnchoredAtThisFrame) const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment