diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2020-10-20 19:19:35 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-10-20 22:08:00 +0200 |
commit | 1b3310a5805cf50f7aca88a83768ffa5adc42a0b (patch) | |
tree | 5dbf70ccc2f63afa77dcc36477841a1cd92745f7 /sw/source/core | |
parent | 09bcd753036bb6f8abeeb5a523f7dfbcf770aca0 (diff) |
tdf#136385 sw: fix Undo of changing anchor type
There were a few problems here:
1. the changes to positions in
SwAnchoredDrawObject::AdjustPositioningAttr() weren't recorded
2. the Undo of setting the anchor type ran last, which ended up calling
SwDrawContact::Changed_() via some callback, which changed the
position from the correct one to a wrong one
3. if the fixup for FLY_AT_PAGE is done after AdjustPositioningAttr()
then that doesn't need to take into account the anchor type
(regression from 1de2b0d3234462b488db54d36ebc17e2b579b0f0)
Change-Id: If70408ad6140a5bec739dea176936ffcbfe3f5ed
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104571
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
Diffstat (limited to 'sw/source/core')
-rw-r--r-- | sw/source/core/doc/docfly.cxx | 26 | ||||
-rw-r--r-- | sw/source/core/layout/anchoreddrawobject.cxx | 11 |
2 files changed, 20 insertions, 17 deletions
diff --git a/sw/source/core/doc/docfly.cxx b/sw/source/core/doc/docfly.cxx index e435920da879..988e59c76a58 100644 --- a/sw/source/core/doc/docfly.cxx +++ b/sw/source/core/doc/docfly.cxx @@ -932,18 +932,6 @@ bool SwDoc::ChgAnchor( const SdrMarkList& _rMrkList, // #i26791# - Direct object positioning no longer needed. Apply // of attributes (method call <SetAttr(..)>) takes care of the // invalidation of the object position. - SetAttr( aNewAnch, *pContact->GetFormat() ); - if (aNewAnch.GetAnchorId() == RndStdIds::FLY_AT_PAGE) - { - SwFormatHoriOrient item(pContact->GetFormat()->GetHoriOrient()); - sal_Int16 nRelOrient(item.GetRelationOrient()); - if (sw::GetAtPageRelOrientation(nRelOrient, false)) - { - SAL_INFO("sw.ui", "fixing horizontal RelOrientation for at-page anchor"); - item.SetRelationOrient(text::RelOrientation::PAGE_FRAME); - SetAttr(item, *pContact->GetFormat()); - } - } if ( _bPosCorr ) { // #i33313# - consider not connected 'virtual' drawing @@ -962,6 +950,20 @@ bool SwDoc::ChgAnchor( const SdrMarkList& _rMrkList, ->AdjustPositioningAttr( pNewAnchorFrame ); } } + if (aNewAnch.GetAnchorId() == RndStdIds::FLY_AT_PAGE) + { + SwFormatHoriOrient item(pContact->GetFormat()->GetHoriOrient()); + sal_Int16 nRelOrient(item.GetRelationOrient()); + if (sw::GetAtPageRelOrientation(nRelOrient, false)) + { + SAL_INFO("sw.ui", "fixing horizontal RelOrientation for at-page anchor"); + item.SetRelationOrient(nRelOrient); + SetAttr(item, *pContact->GetFormat()); + } + } + // tdf#136385 set the anchor last - otherwise it messes up the + // position in SwDrawContact::Changed_() callback + SetAttr(aNewAnch, *pContact->GetFormat()); } // we have changed the anchoring attributes, and those are used to diff --git a/sw/source/core/layout/anchoreddrawobject.cxx b/sw/source/core/layout/anchoreddrawobject.cxx index b48e307858e9..a5631667c1e5 100644 --- a/sw/source/core/layout/anchoreddrawobject.cxx +++ b/sw/source/core/layout/anchoreddrawobject.cxx @@ -793,11 +793,12 @@ void SwAnchoredDrawObject::AdjustPositioningAttr( const SwFrame* _pNewAnchorFram nVertRelPos = aObjRect.Top() - aAnchorPos.Y(); } - GetFrameFormat().SetFormatAttr( SwFormatHoriOrient( nHoriRelPos, text::HoriOrientation::NONE, - GetFrameFormat().GetAnchor().GetAnchorId() == RndStdIds::FLY_AT_PAGE - ? text::RelOrientation::PAGE_FRAME - : text::RelOrientation::FRAME ) ); - GetFrameFormat().SetFormatAttr( SwFormatVertOrient( nVertRelPos, text::VertOrientation::NONE, text::RelOrientation::FRAME ) ); + SwFormatHoriOrient hori(nHoriRelPos, text::HoriOrientation::NONE, text::RelOrientation::FRAME); + SwFormatVertOrient vert(nVertRelPos, text::VertOrientation::NONE, text::RelOrientation::FRAME); + SfxItemSet items(GetFrameFormat().GetDoc()->GetAttrPool(), svl::Items<RES_VERT_ORIENT, RES_HORI_ORIENT>()); + items.Put(hori); + items.Put(vert); + GetFrameFormat().GetDoc()->SetAttr(items, GetFrameFormat()); } // --> #i34748# - change return type. |