diff options
author | Eike Rathke <erack@redhat.com> | 2016-10-19 23:04:34 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2016-10-19 23:05:44 +0200 |
commit | dfa92e106f7eaa8c3fc6cda034001197ecc53a8f (patch) | |
tree | 9c144af03922e9dda3e897c7de496c836f663069 /sc | |
parent | b420a6ab0729530df6ff95c41d24673b5399ceae (diff) |
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
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/data/column.cxx | 16 | ||||
-rw-r--r-- | 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_function<sc::FormulaGroupEntry, voi const sc::RefUpdateContext* mpCxt; ScDocument* mpUndoDoc; bool mbUpdated; + bool mbClipboardSource; void recompileTokenArray( ScFormulaCell& rTopCell ) { @@ -2176,8 +2177,11 @@ class UpdateRefOnNonCopy : public std::unary_function<sc::FormulaGroupEntry, voi ScAddress aPos = pTop->aPos; 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_function<sc::FormulaGroupEntry, voi aPos.Row() - mpCxt->mnRowDelta, aPos.Tab() - mpCxt->mnTabDelta); } + else + { + bCellMoved = false; + } bool bRecalcOnMove = pCode->IsRecalcModeOnRefMove(); if (bRecalcOnMove) @@ -2224,7 +2232,10 @@ class UpdateRefOnNonCopy : public std::unary_function<sc::FormulaGroupEntry, voi p->SetDirty(); } - 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) || |