summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2016-10-19 23:04:34 +0200
committerEike Rathke <erack@redhat.com>2016-10-19 23:05:44 +0200
commitdfa92e106f7eaa8c3fc6cda034001197ecc53a8f (patch)
tree9c144af03922e9dda3e897c7de496c836f663069
parentb420a6ab0729530df6ff95c41d24673b5399ceae (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
-rw-r--r--sc/source/core/data/column.cxx16
-rw-r--r--sc/source/core/tool/token.cxx3
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) ||