[Libreoffice-commits] core.git: sw/source

Michael Stahl (via logerrit) logerrit at kemper.freedesktop.org
Tue Oct 20 20:08:46 UTC 2020


 sw/source/core/doc/docfly.cxx                |   26 ++++++++++++++------------
 sw/source/core/layout/anchoreddrawobject.cxx |   11 ++++++-----
 2 files changed, 20 insertions(+), 17 deletions(-)

New commits:
commit 1b3310a5805cf50f7aca88a83768ffa5adc42a0b
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Tue Oct 20 19:19:35 2020 +0200
Commit:     Michael Stahl <michael.stahl at cib.de>
CommitDate: Tue Oct 20 22:08:00 2020 +0200

    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 at cib.de>

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.


More information about the Libreoffice-commits mailing list