summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-06-11 18:17:18 +0200
committerEike Rathke <erack@redhat.com>2015-06-11 18:51:12 +0200
commit47f002cbbf9593ab0097e178732e51b365b42732 (patch)
tree96ffdcacede36033e0297844603b105c54a1da81
parent88f94fa76ffbfc3abba885480d7d2d2e05107d0a (diff)
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
-rw-r--r--sc/source/core/tool/token.cxx111
1 files changed, 59 insertions, 52 deletions
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 457f1bd33e4c..f81435230d7f 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -2895,64 +2895,71 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
bool b3DFlag = rOldPos.Tab() != rNewPos.Tab() || rCxt.mnTabDelta;
- FormulaToken** p = pCode;
- FormulaToken** pEnd = p + static_cast<size_t>(nLen);
- for (; p != pEnd; ++p)
+ TokenPointers aPtrs( pCode, nLen, pRPN, nRPN);
+ for (size_t j=0; j<2; ++j)
{
- switch ((*p)->GetType())
+ FormulaToken** p = aPtrs.maPointerRange[j].mpStart;
+ FormulaToken** pEnd = aPtrs.maPointerRange[j].mpStop;
+ for (; p != pEnd; ++p)
{
- case svSingleRef:
- {
- 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;
- }
+ if (TokenPointers::skipToken(j,p))
+ continue;
- rRef.SetAddress(aAbs, rNewPos);
- if (b3DFlag)
- rRef.SetFlag3D(b3DFlag);
- }
- break;
- case svDoubleRef:
+ switch ((*p)->GetType())
{
- formula::FormulaToken* pToken = *p;
- ScComplexRefData& rRef = *pToken->GetDoubleRef();
- ScRange aAbs = rRef.toAbs(rOldPos);
- if (aOldRange.In(aAbs))
- {
- aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta);
- aRes.mbReferenceModified = true;
- }
+ case svSingleRef:
+ {
+ 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.SetRange(aAbs, rNewPos);
- if (b3DFlag)
- rRef.Ref1.SetFlag3D(true);
- }
- 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
- }
+ rRef.SetAddress(aAbs, rNewPos);
+ if (b3DFlag)
+ rRef.SetFlag3D(b3DFlag);
+ }
+ break;
+ case svDoubleRef:
+ {
+ formula::FormulaToken* pToken = *p;
+ ScComplexRefData& rRef = *pToken->GetDoubleRef();
+ ScRange aAbs = rRef.toAbs(rOldPos);
+ if (aOldRange.In(aAbs))
+ {
+ aAbs.Move(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta);
+ aRes.mbReferenceModified = true;
+ }
+
+ rRef.SetRange(aAbs, rNewPos);
+ if (b3DFlag)
+ rRef.Ref1.SetFlag3D(true);
+ }
+ 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:
- ;
}
}