diff options
author | Eike Rathke <erack@redhat.com> | 2015-06-11 18:17:18 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-06-11 18:51:12 +0200 |
commit | 47f002cbbf9593ab0097e178732e51b365b42732 (patch) | |
tree | 96ffdcacede36033e0297844603b105c54a1da81 /sc | |
parent | 88f94fa76ffbfc3abba885480d7d2d2e05107d0a (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
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/tool/token.cxx | 111 |
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: - ; } } |