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

There isn't much we have to do for copy.

Change-Id: I4d297f15e8030fdf068c7e3102f9d03aff401cf9
üst 6dda773b
...@@ -2504,85 +2504,32 @@ bool ScFormulaCell::UpdateReferenceOnCopy( ...@@ -2504,85 +2504,32 @@ bool ScFormulaCell::UpdateReferenceOnCopy(
// on reference update. Bail out. // on reference update. Bail out.
return false; return false;
bool bCellStateChanged = false;
boost::scoped_ptr<ScTokenArray> pOldCode; boost::scoped_ptr<ScTokenArray> pOldCode;
if (pUndoDoc) if (pUndoDoc)
pOldCode.reset(pCode->Clone()); pOldCode.reset(pCode->Clone());
bool bValChanged = false;
bool bRangeModified = false; // any range, not only shared formula
bool bRefSizeChanged = false;
if (bHasRefs)
{
// Update cell or range references.
ScCompiler aComp(pDocument, aPos, *pCode);
aComp.SetGrammar(pDocument->GetGrammar());
aComp.UpdateReference(
URM_COPY, aOldPos, rCxt.maRange, rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta,
bValChanged, bRefSizeChanged);
bRangeModified = aComp.HasModifiedRange();
}
bCellStateChanged |= bValChanged;
if (bOnRefMove) if (bOnRefMove)
// Cell may reference itself, e.g. ocColumn, ocRow without parameter // Cell may reference itself, e.g. ocColumn, ocRow without parameter
bOnRefMove = (bValChanged || (aPos != aOldPos)); bOnRefMove = (aPos != aOldPos);
bool bColRowNameCompile = false;
bool bNewListening = false;
bool bInDeleteUndo = false;
if (bHasRefs)
{
// Upon Insert ColRowNames have to be recompiled in case the
// insertion occurs right in front of the range.
if (bHasColRowNames)
bColRowNameCompile = checkCompileColRowName(rCxt, *pDocument, *pCode, aOldPos, aPos, bValChanged);
ScChangeTrack* pChangeTrack = pDocument->GetChangeTrack();
bInDeleteUndo = (pChangeTrack && pChangeTrack->IsInDeleteUndo());
// Reference changed and new listening needed? bool bNeedDirty = bOnRefMove;
// Except in Insert/Delete without specialties.
bNewListening =
(bRangeModified || bColRowNameCompile || (bValChanged && (bInDeleteUndo || bRefSizeChanged)));
if ( bNewListening ) if (pUndoDoc && bOnRefMove)
EndListeningTo(pDocument, pOldCode.get(), aOldPos);
}
bool bNeedDirty = false;
// NeedDirty for changes except for Copy and Move/Insert without RelNames
if ( bRangeModified || bColRowNameCompile || bOnRefMove)
bNeedDirty = true;
if (pUndoDoc && (bValChanged || bOnRefMove))
setOldCodeToUndo(pUndoDoc, aUndoPos, pOldCode.get(), eTempGrammar, cMatrixFlag); setOldCodeToUndo(pUndoDoc, aUndoPos, pOldCode.get(), eTempGrammar, cMatrixFlag);
bValChanged = false; if (bCompile)
if ( ( bCompile = (bCompile || bValChanged || bRangeModified || bColRowNameCompile) ) != 0 )
{ {
CompileTokenArray( bNewListening ); // no Listening CompileTokenArray(false); // no Listening
bNeedDirty = true; bNeedDirty = true;
} }
if ( !bInDeleteUndo )
{ // In ChangeTrack Delete-Reject listeners are established in
// InsertCol/InsertRow
if ( bNewListening )
StartListeningTo( pDocument );
}
if (bNeedDirty) if (bNeedDirty)
{ // Cut off references, invalid or similar? { // Cut off references, invalid or similar?
sc::AutoCalcSwitch(*pDocument, false); sc::AutoCalcSwitch(*pDocument, false);
SetDirty(); SetDirty();
} }
return bCellStateChanged; return false;
} }
bool ScFormulaCell::UpdateReference( bool ScFormulaCell::UpdateReference(
......
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