From dfa92e106f7eaa8c3fc6cda034001197ecc53a8f Mon Sep 17 00:00:00 2001 From: Eike Rathke Date: Wed, 19 Oct 2016 23:04:34 +0200 Subject: Resolves: tdf#97968 adjust references during Cut&Paste of formula groups ... and split groups for cases where references point outside or into the moved range. Change-Id: Iab799e94eed1677f266413b6304651ac4d330e95 --- sc/source/core/data/column.cxx | 16 ++++++++++++++-- sc/source/core/tool/token.cxx | 3 +++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 6dfce01b2617..ef991cb848f4 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -2072,6 +2072,7 @@ class UpdateRefOnNonCopy : public std::unary_functionaPos; ScAddress aOldPos = aPos; + bool bCellMoved; if (mpCxt->maRange.In(aPos)) { + bCellMoved = true; + // The cell is being moved or copied to a new position. The // position has already been updated prior to this call. // Determine its original position before the move which will be @@ -2188,6 +2192,10 @@ class UpdateRefOnNonCopy : public std::unary_functionmnRowDelta, aPos.Tab() - mpCxt->mnTabDelta); } + else + { + bCellMoved = false; + } bool bRecalcOnMove = pCode->IsRecalcModeOnRefMove(); if (bRecalcOnMove) @@ -2224,7 +2232,10 @@ class UpdateRefOnNonCopy : public std::unary_functionSetDirty(); } - fillUndoDoc(aOldPos, rGroup.mnLength, *pOldCode); + // Move from clipboard is Cut&Paste, then do not copy the original + // positions' formula cells to the Undo document. + if (!mbClipboardSource || !bCellMoved) + fillUndoDoc(aOldPos, rGroup.mnLength, *pOldCode); } } @@ -2264,7 +2275,8 @@ public: SCCOL nCol, SCTAB nTab, const sc::RefUpdateContext* pCxt, ScDocument* pUndoDoc) : mnCol(nCol), mnTab(nTab), mpCxt(pCxt), - mpUndoDoc(pUndoDoc), mbUpdated(false) {} + mpUndoDoc(pUndoDoc), mbUpdated(false), + mbClipboardSource(pCxt->mrDoc.IsClipboardSource()){} void operator() ( sc::FormulaGroupEntry& rGroup ) { diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 47a3d2a0a831..9e3c956ab743 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -4430,6 +4430,9 @@ void checkBounds( { assert(!"can't move"); } + + // Check bounds also against the range moved into. + pDeletedRange = &rCxt.maRange; } else if (rCxt.meMode == URM_INSDEL && ((rCxt.mnColDelta < 0 && rCxt.maRange.aStart.Col() > 0) || -- cgit