summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2021-11-12 21:59:14 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-11-14 17:49:24 +0100
commitd1635040cc4f017855f0c7805487b5b1065a7cdd (patch)
treec5cb3a2e7ada53fe186afadf6f19dded8832ca66 /sc
parentd46f415553cdcfe736728bd8de551f6a2354a834 (diff)
Resolves: tdf#145640 MoveReference...Reorder() there are RPN tokens as well
Change-Id: I03fdf8f9d94e7a499e995b900bba564cd054bd2f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125123 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins (cherry picked from commit 79589afe173ba8f17bfbbc6b38f0dfbc5fd9e0c9) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124985 Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/tool/token.cxx200
1 files changed, 106 insertions, 94 deletions
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index d8579a8a834e..75d0795182d0 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -3424,126 +3424,138 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove(
void ScTokenArray::MoveReferenceColReorder(
const ScAddress& rPos, SCTAB nTab, SCROW nRow1, SCROW nRow2, const sc::ColRowReorderMapType& rColMap )
{
- FormulaToken** p = pCode.get();
- FormulaToken** pEnd = p + static_cast<size_t>(nLen);
- for (; p != pEnd; ++p)
+ TokenPointers aPtrs( pCode.get(), nLen, pRPN, nRPN);
+ for (size_t j=0; j<2; ++j)
{
- switch ((*p)->GetType())
+ FormulaToken** pp = aPtrs.maPointerRange[j].mpStart;
+ FormulaToken** pEnd = aPtrs.maPointerRange[j].mpStop;
+ for (; pp != pEnd; ++pp)
{
- case svSingleRef:
- {
- formula::FormulaToken* pToken = *p;
- ScSingleRefData& rRef = *pToken->GetSingleRef();
- ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
+ FormulaToken* p = aPtrs.getHandledToken(j,pp);
+ if (!p)
+ continue;
- if (aAbs.Tab() == nTab && nRow1 <= aAbs.Row() && aAbs.Row() <= nRow2)
- {
- // Inside reordered row range.
- sc::ColRowReorderMapType::const_iterator it = rColMap.find(aAbs.Col());
- if (it != rColMap.end())
+ switch (p->GetType())
+ {
+ case svSingleRef:
{
- // This column is reordered.
- SCCOL nNewCol = it->second;
- aAbs.SetCol(nNewCol);
- rRef.SetAddress(*mxSheetLimits, aAbs, rPos);
+ ScSingleRefData& rRef = *p->GetSingleRef();
+ ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
+
+ if (aAbs.Tab() == nTab && nRow1 <= aAbs.Row() && aAbs.Row() <= nRow2)
+ {
+ // Inside reordered row range.
+ sc::ColRowReorderMapType::const_iterator it = rColMap.find(aAbs.Col());
+ if (it != rColMap.end())
+ {
+ // This column is reordered.
+ SCCOL nNewCol = it->second;
+ aAbs.SetCol(nNewCol);
+ rRef.SetAddress(*mxSheetLimits, aAbs, rPos);
+ }
+ }
}
- }
- }
- break;
- case svDoubleRef:
- {
- formula::FormulaToken* pToken = *p;
- ScComplexRefData& rRef = *pToken->GetDoubleRef();
- ScRange aAbs = rRef.toAbs(*mxSheetLimits, rPos);
+ break;
+ case svDoubleRef:
+ {
+ ScComplexRefData& rRef = *p->GetDoubleRef();
+ ScRange aAbs = rRef.toAbs(*mxSheetLimits, rPos);
- if (aAbs.aStart.Tab() != aAbs.aEnd.Tab())
- // Must be a single-sheet reference.
- break;
+ if (aAbs.aStart.Tab() != aAbs.aEnd.Tab())
+ // Must be a single-sheet reference.
+ break;
- if (aAbs.aStart.Col() != aAbs.aEnd.Col())
- // Whole range must fit in a single column.
- break;
+ if (aAbs.aStart.Col() != aAbs.aEnd.Col())
+ // Whole range must fit in a single column.
+ break;
- if (aAbs.aStart.Tab() == nTab && nRow1 <= aAbs.aStart.Row() && aAbs.aEnd.Row() <= nRow2)
- {
- // Inside reordered row range.
- sc::ColRowReorderMapType::const_iterator it = rColMap.find(aAbs.aStart.Col());
- if (it != rColMap.end())
- {
- // This column is reordered.
- SCCOL nNewCol = it->second;
- aAbs.aStart.SetCol(nNewCol);
- aAbs.aEnd.SetCol(nNewCol);
- rRef.SetRange(*mxSheetLimits, aAbs, rPos);
+ if (aAbs.aStart.Tab() == nTab && nRow1 <= aAbs.aStart.Row() && aAbs.aEnd.Row() <= nRow2)
+ {
+ // Inside reordered row range.
+ sc::ColRowReorderMapType::const_iterator it = rColMap.find(aAbs.aStart.Col());
+ if (it != rColMap.end())
+ {
+ // This column is reordered.
+ SCCOL nNewCol = it->second;
+ aAbs.aStart.SetCol(nNewCol);
+ aAbs.aEnd.SetCol(nNewCol);
+ rRef.SetRange(*mxSheetLimits, aAbs, rPos);
+ }
+ }
}
- }
+ break;
+ default:
+ ;
}
- break;
- default:
- ;
}
}
}
void ScTokenArray::MoveReferenceRowReorder( const ScAddress& rPos, SCTAB nTab, SCCOL nCol1, SCCOL nCol2, const sc::ColRowReorderMapType& rRowMap )
{
- FormulaToken** p = pCode.get();
- FormulaToken** pEnd = p + static_cast<size_t>(nLen);
- for (; p != pEnd; ++p)
+ TokenPointers aPtrs( pCode.get(), nLen, pRPN, nRPN);
+ for (size_t j=0; j<2; ++j)
{
- switch ((*p)->GetType())
+ FormulaToken** pp = aPtrs.maPointerRange[j].mpStart;
+ FormulaToken** pEnd = aPtrs.maPointerRange[j].mpStop;
+ for (; pp != pEnd; ++pp)
{
- case svSingleRef:
- {
- formula::FormulaToken* pToken = *p;
- ScSingleRefData& rRef = *pToken->GetSingleRef();
- ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
+ FormulaToken* p = aPtrs.getHandledToken(j,pp);
+ if (!p)
+ continue;
- if (aAbs.Tab() == nTab && nCol1 <= aAbs.Col() && aAbs.Col() <= nCol2)
- {
- // Inside reordered column range.
- sc::ColRowReorderMapType::const_iterator it = rRowMap.find(aAbs.Row());
- if (it != rRowMap.end())
+ switch (p->GetType())
+ {
+ case svSingleRef:
{
- // This column is reordered.
- SCROW nNewRow = it->second;
- aAbs.SetRow(nNewRow);
- rRef.SetAddress(*mxSheetLimits, aAbs, rPos);
+ ScSingleRefData& rRef = *p->GetSingleRef();
+ ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
+
+ if (aAbs.Tab() == nTab && nCol1 <= aAbs.Col() && aAbs.Col() <= nCol2)
+ {
+ // Inside reordered column range.
+ sc::ColRowReorderMapType::const_iterator it = rRowMap.find(aAbs.Row());
+ if (it != rRowMap.end())
+ {
+ // This column is reordered.
+ SCROW nNewRow = it->second;
+ aAbs.SetRow(nNewRow);
+ rRef.SetAddress(*mxSheetLimits, aAbs, rPos);
+ }
+ }
}
- }
- }
- break;
- case svDoubleRef:
- {
- formula::FormulaToken* pToken = *p;
- ScComplexRefData& rRef = *pToken->GetDoubleRef();
- ScRange aAbs = rRef.toAbs(*mxSheetLimits, rPos);
+ break;
+ case svDoubleRef:
+ {
+ ScComplexRefData& rRef = *p->GetDoubleRef();
+ ScRange aAbs = rRef.toAbs(*mxSheetLimits, rPos);
- if (aAbs.aStart.Tab() != aAbs.aEnd.Tab())
- // Must be a single-sheet reference.
- break;
+ if (aAbs.aStart.Tab() != aAbs.aEnd.Tab())
+ // Must be a single-sheet reference.
+ break;
- if (aAbs.aStart.Row() != aAbs.aEnd.Row())
- // Whole range must fit in a single row.
- break;
+ if (aAbs.aStart.Row() != aAbs.aEnd.Row())
+ // Whole range must fit in a single row.
+ break;
- if (aAbs.aStart.Tab() == nTab && nCol1 <= aAbs.aStart.Col() && aAbs.aEnd.Col() <= nCol2)
- {
- // Inside reordered column range.
- sc::ColRowReorderMapType::const_iterator it = rRowMap.find(aAbs.aStart.Row());
- if (it != rRowMap.end())
- {
- // This row is reordered.
- SCROW nNewRow = it->second;
- aAbs.aStart.SetRow(nNewRow);
- aAbs.aEnd.SetRow(nNewRow);
- rRef.SetRange(*mxSheetLimits, aAbs, rPos);
+ if (aAbs.aStart.Tab() == nTab && nCol1 <= aAbs.aStart.Col() && aAbs.aEnd.Col() <= nCol2)
+ {
+ // Inside reordered column range.
+ sc::ColRowReorderMapType::const_iterator it = rRowMap.find(aAbs.aStart.Row());
+ if (it != rRowMap.end())
+ {
+ // This row is reordered.
+ SCROW nNewRow = it->second;
+ aAbs.aStart.SetRow(nNewRow);
+ aAbs.aEnd.SetRow(nNewRow);
+ rRef.SetRange(*mxSheetLimits, aAbs, rPos);
+ }
+ }
}
- }
+ break;
+ default:
+ ;
}
- break;
- default:
- ;
}
}
}