tdf#92650: handle overwritten references correctly in undo.

Change-Id: Idc3fbd78f8163c97a9cd80a3ff474b6da0349353
Reviewed-on: https://gerrit.libreoffice.org/36496
Reviewed-by: Kohei Yoshida <libreoffice@kohei.us>
Tested-by: Kohei Yoshida <libreoffice@kohei.us>
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 26075a4..75ef12c 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -3167,6 +3167,11 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
                                aAbs = aErrorPos;
                            aRes.mbReferenceModified = true;
                        }
                        else if (rCxt.maRange.In(aAbs))
                        {
                            // Referenced cell has been overwritten.
                            aRes.mbValueChanged = true;
                        }

                        rRef.SetAddress(aAbs, rNewPos);
                        rRef.SetFlag3D(aAbs.Tab() != rNewPos.Tab() || !rRef.IsTabRel());
@@ -3183,6 +3188,11 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
                                aAbs = aErrorRange;
                            aRes.mbReferenceModified = true;
                        }
                        else if (rCxt.maRange.In(aAbs))
                        {
                            // Referenced range has been entirely overwritten.
                            aRes.mbValueChanged = true;
                        }

                        rRef.SetRange(aAbs, rNewPos);
                        // Absolute sheet reference => set 3D flag.
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index 1619865..76ac2a1 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -2839,8 +2839,10 @@ bool ScDocFunc::MoveBlock( const ScRange& rSource, const ScAddress& rDestPos,
        function ScDocument::UpdateReference() is called which calls
        ScDrawLayer::MoveCells() which may move away inserted objects to wrong
        positions (e.g. if source and destination range overlaps).*/
    rDoc.CopyFromClip( aPasteDest, aDestMark, InsertDeleteFlags::ALL & ~(InsertDeleteFlags::OBJECTS),
                        nullptr, pClipDoc.get(), true, false, bIncludeFiltered );

    rDoc.CopyFromClip(
        aPasteDest, aDestMark, InsertDeleteFlags::ALL & ~(InsertDeleteFlags::OBJECTS),
        pUndoDoc, pClipDoc.get(), true, false, bIncludeFiltered);

    // skipped rows and merged cells don't mix
    if ( !bIncludeFiltered && pClipDoc->HasClipFilteredRows() )
diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx
index dccc583..1141e75 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -1101,7 +1101,7 @@ bool ScUndoPaste::CanRepeat(SfxRepeatTarget& rTarget) const
ScUndoDragDrop::ScUndoDragDrop( ScDocShell* pNewDocShell,
                    const ScRange& rRange, ScAddress aNewDestPos, bool bNewCut,
                    ScDocument* pUndoDocument, bool bScenario ) :
    ScMoveUndo( pNewDocShell, pUndoDocument, nullptr, SC_UNDO_REFFIRST ),
    ScMoveUndo( pNewDocShell, pUndoDocument, nullptr, SC_UNDO_REFLAST ),
    mnPaintExtFlags( 0 ),
    aSrcRange( rRange ),
    bCut( bNewCut ),