Kaydet (Commit) 53e899b5 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Mark formula cells dirty when a referenced range gets partially shifted.

Change-Id: I5d97cb0e325c0168fdae57f8ec39f62c85bec524
üst 8e59e77a
...@@ -49,6 +49,7 @@ struct RefUpdateResult ...@@ -49,6 +49,7 @@ struct RefUpdateResult
bool mbRangeSizeModified; bool mbRangeSizeModified;
RefUpdateResult(); RefUpdateResult();
RefUpdateResult(const RefUpdateResult& r);
}; };
} }
......
...@@ -2310,18 +2310,13 @@ bool ScFormulaCell::UpdateReferenceOnShift( ...@@ -2310,18 +2310,13 @@ bool ScFormulaCell::UpdateReferenceOnShift(
EndListeningTo(pDocument, pOldCode.get(), aOldPos); EndListeningTo(pDocument, pOldCode.get(), aOldPos);
} }
bool bNeedDirty = false;
// NeedDirty for changes except for Copy and Move/Insert without RelNames // NeedDirty for changes except for Copy and Move/Insert without RelNames
if (bRangeModified || bColRowNameCompile || bool bNeedDirty = (bRangeModified || bValChanged || bColRowNameCompile || bOnRefMove);
(bValChanged && (bHasRelName || bInDeleteUndo || bRefSizeChanged)) || bOnRefMove)
bNeedDirty = true;
if (pUndoDoc && (bValChanged || bOnRefMove)) if (pUndoDoc && (bValChanged || bOnRefMove))
setOldCodeToUndo(pUndoDoc, aUndoPos, pOldCode.get(), eTempGrammar, cMatrixFlag); setOldCodeToUndo(pUndoDoc, aUndoPos, pOldCode.get(), eTempGrammar, cMatrixFlag);
bValChanged = false; if ( ( bCompile = (bCompile || bRangeModified || bColRowNameCompile) ) != 0 )
if ( ( bCompile = (bCompile || bValChanged || bRangeModified || bColRowNameCompile) ) != 0 )
{ {
CompileTokenArray( bNewListening ); // no Listening CompileTokenArray( bNewListening ); // no Listening
bNeedDirty = true; bNeedDirty = true;
...@@ -2539,7 +2534,6 @@ bool ScFormulaCell::UpdateReferenceOnCopy( ...@@ -2539,7 +2534,6 @@ bool ScFormulaCell::UpdateReferenceOnCopy(
bOnRefMove = (bValChanged || (aPos != aOldPos)); bOnRefMove = (bValChanged || (aPos != aOldPos));
bool bColRowNameCompile = false; bool bColRowNameCompile = false;
bool bHasRelName = false;
bool bNewListening = false; bool bNewListening = false;
bool bInDeleteUndo = false; bool bInDeleteUndo = false;
...@@ -2553,8 +2547,6 @@ bool ScFormulaCell::UpdateReferenceOnCopy( ...@@ -2553,8 +2547,6 @@ bool ScFormulaCell::UpdateReferenceOnCopy(
ScChangeTrack* pChangeTrack = pDocument->GetChangeTrack(); ScChangeTrack* pChangeTrack = pDocument->GetChangeTrack();
bInDeleteUndo = (pChangeTrack && pChangeTrack->IsInDeleteUndo()); bInDeleteUndo = (pChangeTrack && pChangeTrack->IsInDeleteUndo());
// RelNameRefs are always moved
bHasRelName = HasRelNameReference();
// Reference changed and new listening needed? // Reference changed and new listening needed?
// Except in Insert/Delete without specialties. // Except in Insert/Delete without specialties.
bNewListening = bNewListening =
......
...@@ -20,6 +20,8 @@ bool RefUpdateContext::hasDelta() const ...@@ -20,6 +20,8 @@ bool RefUpdateContext::hasDelta() const
} }
RefUpdateResult::RefUpdateResult() : mbValueChanged(false), mbRangeSizeModified(false) {} RefUpdateResult::RefUpdateResult() : mbValueChanged(false), mbRangeSizeModified(false) {}
RefUpdateResult::RefUpdateResult(const RefUpdateResult& r) :
mbValueChanged(r.mbValueChanged), mbRangeSizeModified(r.mbRangeSizeModified) {}
} }
......
...@@ -2250,6 +2250,12 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon ...@@ -2250,6 +2250,12 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon
if (rCxt.maRange.In(aAbs)) if (rCxt.maRange.In(aAbs))
aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta); aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta);
else if (rCxt.maRange.Intersects(aAbs))
{
// Part of the referenced range is being shifted. This
// will change the values of the range.
aRes.mbValueChanged = true;
}
rRef.SetRange(aAbs, aNewPos); rRef.SetRange(aAbs, aNewPos);
} }
......
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