summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2019-02-07 11:06:24 +0100
committerAron Budea <aron.budea@collabora.com>2019-04-23 16:33:12 +0200
commitda21956366a13b62b056d6074262f44c1559b29d (patch)
treebd8e789c981cafd8d52afc33a7859c0050ca89d7 /sw
parentaafafca61527fb650d3f9f11ec6c8226cd612fae (diff)
tdf#123032 sw, AddVerticalFrameOffsets: fix shape pos after mouse move
Regression from commit 50223ea6e212b60b7d33839c2753c5601fb50f95 (tdf#98987 sw: add AddVerticalFrameOffsets compat mode, 2016-03-31), the problem was that vertical position of the shape was wrong after mouse move, even if we attempted to take fly frames of the paragraph into account. (Similar situation is when saving and loading the file; which is much easier to test.) Fly frames are created as the text frames is formatted, and then SwTextFrame::CalcBaseOfstForFly() can calculate the vertical offset correctly. But in the "move with mouse" case SwToContentAnchoredObjectPosition::CalcPosition() was invoked by the time the old flys of the text frame were already removed, but the new ones were not yet added. Solve the problem by formatting the text frame from SwAnchoredDrawObject::MakeObjPosAnchoredAtPara() (if any of its validity flags are set to false) -- this is expected to be safe, as the object formatter is invoked by SwLayAction::FormatContent(), i.e. there is no recursive SwFrame::Calc() call here. (cherry picked from commit 961ba62df045473e5793d9e103be86eaad8d9575) Change-Id: I95851874e3da3f50f304421537c6743e04bdfc7b Reviewed-on: https://gerrit.libreoffice.org/71127 Reviewed-by: Aron Budea <aron.budea@collabora.com> Tested-by: Aron Budea <aron.budea@collabora.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/qa/extras/uiwriter/uiwriter2.cxx16
-rw-r--r--sw/source/core/layout/anchoreddrawobject.cxx18
2 files changed, 28 insertions, 6 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index df4fef72e547..6d3355af30bb 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -460,6 +460,22 @@ void SwUiWriterTest2::testTdf122942()
// 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();
+ pDoc = pWrtShell->GetDoc();
+ 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());
}
CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest2);
diff --git a/sw/source/core/layout/anchoreddrawobject.cxx b/sw/source/core/layout/anchoreddrawobject.cxx
index ca5014f7e9b5..1706fafe4372 100644
--- a/sw/source/core/layout/anchoreddrawobject.cxx
+++ b/sw/source/core/layout/anchoreddrawobject.cxx
@@ -391,12 +391,18 @@ void SwAnchoredDrawObject::MakeObjPosAnchoredAtPara()
// --> #i50356# - format anchor frame containing the anchor
// position. E.g., for at-character anchored object this can be the follow
// frame of the anchor frame, which contains the anchor character.
- const bool bFormatAnchor =
- !static_cast<const SwTextFrame*>( GetAnchorFrameContainingAnchPos() )->IsAnyJoinLocked() &&
- !ConsiderObjWrapInfluenceOnObjPos() &&
- !ConsiderObjWrapInfluenceOfOtherObjs();
-
- if ( bFormatAnchor )
+ bool bJoinLocked
+ = static_cast<const SwTextFrame*>(GetAnchorFrameContainingAnchPos())->IsAnyJoinLocked();
+ const bool bFormatAnchor = !bJoinLocked && !ConsiderObjWrapInfluenceOnObjPos()
+ && !ConsiderObjWrapInfluenceOfOtherObjs();
+
+ // Format of anchor is needed for (vertical) fly offsets, otherwise the
+ // lack of fly portions will result in an incorrect 0 offset.
+ bool bAddVerticalFlyOffsets = GetFrameFormat().getIDocumentSettingAccess().get(
+ DocumentSettingId::ADD_VERTICAL_FLY_OFFSETS);
+ bool bFormatAnchorOnce = !bJoinLocked && bAddVerticalFlyOffsets;
+
+ if (bFormatAnchor || bFormatAnchorOnce)
{
// --> #i50356#
GetAnchorFrameContainingAnchPos()->Calc(GetAnchorFrameContainingAnchPos()->getRootFrame()->GetCurrShell()->GetOut());