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 19:21:19 +0200
commit3b751dee4f3447236f0c71b66063697560047de1 (patch)
tree3ff5a7a115681aacbe1d50909f61ff0511679814
parent73107eb3375f1671f549f0467be2812df9223848 (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 (cherry picked from commit 47f002cbbf9593ab0097e178732e51b365b42732)
-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 4e20d93d8195..a30112eea25c 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:
- ;
}
}