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>
(cherry picked from commit 1b3310a5805cf50f7aca88a83768ffa5adc42a0b)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104588
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/sw/source/core/doc/docfly.cxx b/sw/source/core/doc/docfly.cxx
index e435920..988e59c 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 d3be540..2cbe4ba 100644
--- a/sw/source/core/layout/anchoreddrawobject.cxx
+++ b/sw/source/core/layout/anchoreddrawobject.cxx
@@ -776,11 +776,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.