Kaydet (Commit) a9c94aac authored tarafından Eike Rathke's avatar Eike Rathke Kaydeden (comit) Andras Timar

adjust also RPN reference tokens, tdf#91842 and probably others

Similar to beb5879f8fea231a037acf010812df2dffbe302d it is not sufficient
to adjust only the parsed tokens, generated RPN tokens need to be
adjusted as well.

Quite likely also other Adjust...() functions have to handle this, need
to investigate.

Change-Id: I5de4e2238703b3ce134f7d46a87bd7a4fb940cff
(cherry picked from commit 47f002cb)
üst d0d07b07
...@@ -2895,64 +2895,71 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove( ...@@ -2895,64 +2895,71 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
bool b3DFlag = rOldPos.Tab() != rNewPos.Tab() || rCxt.mnTabDelta; bool b3DFlag = rOldPos.Tab() != rNewPos.Tab() || rCxt.mnTabDelta;
FormulaToken** p = pCode; TokenPointers aPtrs( pCode, nLen, pRPN, nRPN);
FormulaToken** pEnd = p + static_cast<size_t>(nLen); for (size_t j=0; j<2; ++j)
for (; p != pEnd; ++p)
{ {
switch ((*p)->GetType()) FormulaToken** p = aPtrs.maPointerRange[j].mpStart;
FormulaToken** pEnd = aPtrs.maPointerRange[j].mpStop;
for (; p != pEnd; ++p)
{ {
case svSingleRef: if (TokenPointers::skipToken(j,p))
{ continue;
formula::FormulaToken* pToken = *p;
ScSingleRefData& rRef = *pToken->GetSingleRef();
ScAddress aAbs = rRef.toAbs(rOldPos);
if (aOldRange.In(aAbs))
{
aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta);
aRes.mbReferenceModified = true;
}
rRef.SetAddress(aAbs, rNewPos); switch ((*p)->GetType())
if (b3DFlag)
rRef.SetFlag3D(b3DFlag);
}
break;
case svDoubleRef:
{ {
formula::FormulaToken* pToken = *p; case svSingleRef:
ScComplexRefData& rRef = *pToken->GetDoubleRef(); {
ScRange aAbs = rRef.toAbs(rOldPos); formula::FormulaToken* pToken = *p;
if (aOldRange.In(aAbs)) ScSingleRefData& rRef = *pToken->GetSingleRef();
{ ScAddress aAbs = rRef.toAbs(rOldPos);
aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta); if (aOldRange.In(aAbs))
aRes.mbReferenceModified = true; {
} aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta);
aRes.mbReferenceModified = true;
}
rRef.SetRange(aAbs, rNewPos); rRef.SetAddress(aAbs, rNewPos);
if (b3DFlag) if (b3DFlag)
rRef.Ref1.SetFlag3D(true); rRef.SetFlag3D(b3DFlag);
} }
break; break;
case svIndex: case svDoubleRef:
{ {
switch ((*p)->GetOpCode()) formula::FormulaToken* pToken = *p;
{ ScComplexRefData& rRef = *pToken->GetDoubleRef();
case ocName: ScRange aAbs = rRef.toAbs(rOldPos);
if (isNameModified(rCxt.maUpdatedNames, rOldPos.Tab(), **p)) if (aOldRange.In(aAbs))
aRes.mbNameModified = true; {
break; aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta);
case ocDBArea: aRes.mbReferenceModified = true;
case ocTableRef: }
if (isDBDataModified(rCxt.mrDoc, **p))
aRes.mbNameModified = true; rRef.SetRange(aAbs, rNewPos);
break; if (b3DFlag)
default: rRef.Ref1.SetFlag3D(true);
; // nothing }
} break;
case svIndex:
{
switch ((*p)->GetOpCode())
{
case ocName:
if (isNameModified(rCxt.maUpdatedNames, rOldPos.Tab(), **p))
aRes.mbNameModified = true;
break;
case ocDBArea:
case ocTableRef:
if (isDBDataModified(rCxt.mrDoc, **p))
aRes.mbNameModified = true;
break;
default:
; // nothing
}
}
break;
default:
;
} }
break;
default:
;
} }
} }
......
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