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
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 9c17554..c27c964 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -3501,126 +3501,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:
            FormulaToken* p = aPtrs.getHandledToken(j,pp);
            if (!p)
                continue;

            switch (p->GetType())
            {
                formula::FormulaToken* pToken = *p;
                ScSingleRefData& rRef = *pToken->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())
                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);

                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.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())
                break;
                case svDoubleRef:
                    {
                        // This column is reordered.
                        SCCOL nNewCol = it->second;
                        aAbs.aStart.SetCol(nNewCol);
                        aAbs.aEnd.SetCol(nNewCol);
                        rRef.SetRange(*mxSheetLimits, aAbs, rPos);
                        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.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);
                            }
                        }
                    }
                }
                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:
            FormulaToken* p = aPtrs.getHandledToken(j,pp);
            if (!p)
                continue;

            switch (p->GetType())
            {
                formula::FormulaToken* pToken = *p;
                ScSingleRefData& rRef = *pToken->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())
                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);

                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.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())
                break;
                case svDoubleRef:
                    {
                        // This row is reordered.
                        SCROW nNewRow = it->second;
                        aAbs.aStart.SetRow(nNewRow);
                        aAbs.aEnd.SetRow(nNewRow);
                        rRef.SetRange(*mxSheetLimits, aAbs, rPos);
                        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.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);
                            }
                        }
                    }
                }
                break;
                default:
                    ;
            }
            break;
            default:
                ;
        }
    }
}