Kaydet (Commit) dfa92e10 authored tarafından Eike Rathke's avatar Eike Rathke

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
üst b420a6ab
......@@ -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 )
{
......
......@@ -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) ||
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment