summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2017-04-05 21:09:59 -0400
committerEike Rathke <erack@redhat.com>2017-04-18 22:09:17 +0200
commit7f5614209ffa2eef2e78bdb976d30d2f5b7fff48 (patch)
tree828d98c617417475d955e875e7d58578a8895809
parente8ee69d9557887c1736c50bdb11a875c8c126cc0 (diff)
tdf#92650: handle overwritten references correctly in undo.
(cherry picked from commit de39b6ba3a9edd20a476937ef0c78920df2f5c6d) Conflicts: sc/source/ui/docshell/docfunc.cxx sc/source/ui/undo/undoblk.cxx Change-Id: Idc3fbd78f8163c97a9cd80a3ff474b6da0349353 Reviewed-on: https://gerrit.libreoffice.org/36540 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com>
-rw-r--r--sc/source/core/tool/token.cxx10
-rw-r--r--sc/source/ui/docshell/docfunc.cxx2
-rw-r--r--sc/source/ui/undo/undoblk.cxx2
3 files changed, 12 insertions, 2 deletions
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index e7714801dac0..6671a5ab5dbc 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -3210,6 +3210,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());
@@ -3226,6 +3231,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 8aacaad8f163..e314e3b35273 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -2816,7 +2816,7 @@ bool ScDocFunc::MoveBlock( const ScRange& rSource, const ScAddress& rDestPos,
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, true, false, bIncludeFiltered );
+ pUndoDoc, pClipDoc, 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 e42ca42f7b8f..157540535667 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -1102,7 +1102,7 @@ bool ScUndoPaste::CanRepeat(SfxRepeatTarget& rTarget) const
ScUndoDragDrop::ScUndoDragDrop( ScDocShell* pNewDocShell,
const ScRange& rRange, ScAddress aNewDestPos, bool bNewCut,
ScDocument* pUndoDocument, ScRefUndoData* pRefData, bool bScenario ) :
- ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFFIRST ),
+ ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ),
mnPaintExtFlags( 0 ),
aSrcRange( rRange ),
bCut( bNewCut ),