diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-12-13 20:45:33 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-12-14 06:57:53 +0100 |
commit | 5bcdbf03012e9d2754c3eb166bd5a01201406d9b (patch) | |
tree | c910eac80023f9cb1c0f943c8edad1928977968f /sc/source/core/tool/compiler.cxx | |
parent | 113444f59dc7690850919155b9b164b1a686bbe7 (diff) |
sc: rowcol: tdf#50916 convert Valid* methods
which means we end up passing around ScDocument*
__everywhere__
Change-Id: I44d235ca5e9d57519f068b6880ee7d66f3ceb529
Reviewed-on: https://gerrit.libreoffice.org/83548
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sc/source/core/tool/compiler.cxx')
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 197 |
1 files changed, 103 insertions, 94 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 7f1460db8f51..f5d30d2e8f36 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -710,8 +710,8 @@ namespace { struct Convention_A1 : public ScCompiler::Convention { explicit Convention_A1( FormulaGrammar::AddressConvention eConv ) : ScCompiler::Convention( eConv ) { } - static void MakeColStr( OUStringBuffer& rBuffer, SCCOL nCol ); - static void MakeRowStr( OUStringBuffer& rBuffer, SCROW nRow ); + static void MakeColStr( ScSheetLimits& rLimits, OUStringBuffer& rBuffer, SCCOL nCol ); + static void MakeRowStr( ScSheetLimits& rLimits, OUStringBuffer& rBuffer, SCROW nRow ); ParseResult parseAnyToken( const OUString& rFormula, sal_Int32 nSrcPos, @@ -741,17 +741,17 @@ struct Convention_A1 : public ScCompiler::Convention } -void Convention_A1::MakeColStr( OUStringBuffer& rBuffer, SCCOL nCol ) +void Convention_A1::MakeColStr( ScSheetLimits& rLimits, OUStringBuffer& rBuffer, SCCOL nCol ) { - if ( !ValidCol( nCol) ) + if ( !rLimits.ValidCol(nCol) ) rBuffer.append(ScResId(STR_NO_REF_TABLE)); else ::ScColToAlpha( rBuffer, nCol); } -void Convention_A1::MakeRowStr( OUStringBuffer& rBuffer, SCROW nRow ) +void Convention_A1::MakeRowStr( ScSheetLimits& rLimits, OUStringBuffer& rBuffer, SCROW nRow ) { - if ( !ValidRow(nRow) ) + if ( !rLimits.ValidRow(nRow) ) rBuffer.append(ScResId(STR_NO_REF_TABLE)); else rBuffer.append(sal_Int32(nRow + 1)); @@ -781,7 +781,7 @@ struct ConventionOOO_A1 : public Convention_A1 }; static void MakeOneRefStrImpl( - OUStringBuffer& rBuffer, + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const OUString& rErrRef, const std::vector<OUString>& rTabNames, const ScSingleRefData& rRef, const ScAddress& rAbsRef, bool bForceTab, bool bODF, SingletonDisplay eSingletonDisplay ) @@ -815,20 +815,20 @@ struct ConventionOOO_A1 : public Convention_A1 { if (!rRef.IsColRel()) rBuffer.append('$'); - if (!ValidCol(rAbsRef.Col()) || rRef.IsColDeleted()) + if (!rLimits.ValidCol(rAbsRef.Col()) || rRef.IsColDeleted()) rBuffer.append(rErrRef); else - MakeColStr(rBuffer, rAbsRef.Col()); + MakeColStr(rLimits, rBuffer, rAbsRef.Col()); } if (eSingletonDisplay != SINGLETON_COL) { if (!rRef.IsRowRel()) rBuffer.append('$'); - if (!ValidRow(rAbsRef.Row()) || rRef.IsRowDeleted()) + if (!rLimits.ValidRow(rAbsRef.Row()) || rRef.IsRowDeleted()) rBuffer.append(rErrRef); else - MakeRowStr(rBuffer, rAbsRef.Row()); + MakeRowStr(rLimits, rBuffer, rAbsRef.Row()); } } @@ -836,8 +836,8 @@ struct ConventionOOO_A1 : public Convention_A1 const ScComplexRefData& rRef, bool bFromRangeName ) { // If any part is error, display as such. - if (!ValidCol(rAbs1.Col()) || rRef.Ref1.IsColDeleted() || !ValidRow(rAbs1.Row()) || rRef.Ref1.IsRowDeleted() || - !ValidCol(rAbs2.Col()) || rRef.Ref2.IsColDeleted() || !ValidRow(rAbs2.Row()) || rRef.Ref2.IsRowDeleted()) + if (!rLimits.ValidCol(rAbs1.Col()) || rRef.Ref1.IsColDeleted() || !rLimits.ValidRow(rAbs1.Row()) || rRef.Ref1.IsRowDeleted() || + !rLimits.ValidCol(rAbs2.Col()) || rRef.Ref2.IsColDeleted() || !rLimits.ValidRow(rAbs2.Row()) || rRef.Ref2.IsRowDeleted()) return SINGLETON_NONE; // A:A or $A:$A or A:$A or $A:A @@ -875,17 +875,17 @@ struct ConventionOOO_A1 : public Convention_A1 { // In case absolute/relative positions weren't separately available: // transform relative to absolute! - ScAddress aAbs1 = rRef.Ref1.toAbs(rPos), aAbs2; + ScAddress aAbs1 = rRef.Ref1.toAbs(rLimits, rPos), aAbs2; if( !bSingleRef ) - aAbs2 = rRef.Ref2.toAbs(rPos); + aAbs2 = rRef.Ref2.toAbs(rLimits, rPos); SingletonDisplay eSingleton = bSingleRef ? SINGLETON_NONE : getSingletonDisplay( rLimits, aAbs1, aAbs2, rRef, bFromRangeName); - MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, false, false, eSingleton); + MakeOneRefStrImpl(rLimits, rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, false, false, eSingleton); if (!bSingleRef) { rBuffer.append(':'); - MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), false, + MakeOneRefStrImpl(rLimits, rBuffer, rErrRef, rTabNames, rRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), false, eSingleton); } } @@ -917,10 +917,11 @@ struct ConventionOOO_A1 : public Convention_A1 } static bool makeExternalSingleRefStr( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const OUString& rFileName, const OUString& rTabName, const ScSingleRefData& rRef, const ScAddress& rPos, bool bDisplayTabName, bool bEncodeUrl ) { - ScAddress aAbsRef = rRef.toAbs(rPos); + ScAddress aAbsRef = rRef.toAbs(rLimits, rPos); if (bDisplayTabName) { OUString aFile; @@ -940,15 +941,16 @@ struct ConventionOOO_A1 : public Convention_A1 if (!rRef.IsColRel()) rBuffer.append('$'); - MakeColStr( rBuffer, aAbsRef.Col()); + MakeColStr( rLimits, rBuffer, aAbsRef.Col()); if (!rRef.IsRowRel()) rBuffer.append('$'); - MakeRowStr( rBuffer, aAbsRef.Row()); + MakeRowStr( rLimits, rBuffer, aAbsRef.Row()); return true; } static void makeExternalRefStrImpl( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, const OUString& rFileName, const OUString& rTabName, const ScSingleRefData& rRef, bool bODF ) { @@ -956,24 +958,26 @@ struct ConventionOOO_A1 : public Convention_A1 rBuffer.append( '['); bool bEncodeUrl = bODF; - makeExternalSingleRefStr(rBuffer, rFileName, rTabName, rRef, rPos, true, bEncodeUrl); + makeExternalSingleRefStr(rLimits, rBuffer, rFileName, rTabName, rRef, rPos, true, bEncodeUrl); if (bODF) rBuffer.append( ']'); } virtual void makeExternalRefStr( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName, const OUString& rTabName, const ScSingleRefData& rRef ) const override { - makeExternalRefStrImpl(rBuffer, rPos, rFileName, rTabName, rRef, false); + makeExternalRefStrImpl(rLimits, rBuffer, rPos, rFileName, rTabName, rRef, false); } static void makeExternalRefStrImpl( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, const OUString& rFileName, const std::vector<OUString>& rTabNames, const OUString& rTabName, const ScComplexRefData& rRef, bool bODF ) { - ScRange aAbsRange = rRef.toAbs(rPos); + ScRange aAbsRange = rRef.toAbs(rLimits, rPos); if (bODF) rBuffer.append( '['); @@ -982,7 +986,7 @@ struct ConventionOOO_A1 : public Convention_A1 do { - if (!makeExternalSingleRefStr(rBuffer, rFileName, rTabName, rRef.Ref1, rPos, true, bEncodeUrl)) + if (!makeExternalSingleRefStr(rLimits, rBuffer, rFileName, rTabName, rRef.Ref1, rPos, true, bEncodeUrl)) break; rBuffer.append(':'); @@ -1000,7 +1004,7 @@ struct ConventionOOO_A1 : public Convention_A1 } else if (bODF) rBuffer.append( '.'); // need at least the sheet separator in ODF - makeExternalSingleRefStr( + makeExternalSingleRefStr(rLimits, rBuffer, rFileName, aLastTabName, rRef.Ref2, rPos, bDisplayTabName, bEncodeUrl); } while (false); @@ -1009,12 +1013,12 @@ struct ConventionOOO_A1 : public Convention_A1 } virtual void makeExternalRefStr( - ScSheetLimits&, + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName, const std::vector<OUString>& rTabNames, const OUString& rTabName, const ScComplexRefData& rRef ) const override { - makeExternalRefStrImpl(rBuffer, rPos, rFileName, rTabNames, rTabName, rRef, false); + makeExternalRefStrImpl(rLimits, rBuffer, rPos, rFileName, rTabNames, rTabName, rRef, false); } }; @@ -1035,12 +1039,12 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1 rBuffer.append('['); // In case absolute/relative positions weren't separately available: // transform relative to absolute! - ScAddress aAbs1 = rRef.Ref1.toAbs(rPos), aAbs2; + ScAddress aAbs1 = rRef.Ref1.toAbs(rLimits, rPos), aAbs2; if( !bSingleRef ) - aAbs2 = rRef.Ref2.toAbs(rPos); + aAbs2 = rRef.Ref2.toAbs(rLimits, rPos); - if (FormulaGrammar::isODFF(eGram) && (rRef.Ref1.IsDeleted() || !ValidAddress(aAbs1) || - (!bSingleRef && (rRef.Ref2.IsDeleted() || !ValidAddress(aAbs2))))) + if (FormulaGrammar::isODFF(eGram) && (rRef.Ref1.IsDeleted() || !rLimits.ValidAddress(aAbs1) || + (!bSingleRef && (rRef.Ref2.IsDeleted() || !rLimits.ValidAddress(aAbs2))))) { rBuffer.append(rErrRef); // For ODFF write [#REF!], but not for PODF so apps reading ODF @@ -1051,11 +1055,11 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1 { SingletonDisplay eSingleton = bSingleRef ? SINGLETON_NONE : getSingletonDisplay( rLimits, aAbs1, aAbs2, rRef, bFromRangeName); - MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, false, true, eSingleton); + MakeOneRefStrImpl(rLimits, rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, false, true, eSingleton); if (!bSingleRef) { rBuffer.append(':'); - MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), true, + MakeOneRefStrImpl(rLimits, rBuffer, rErrRef, rTabNames, rRef.Ref2, aAbs2, aAbs1.Tab() != aAbs2.Tab(), true, eSingleton); } } @@ -1069,19 +1073,20 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1 } virtual void makeExternalRefStr( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName, const OUString& rTabName, const ScSingleRefData& rRef ) const override { - makeExternalRefStrImpl(rBuffer, rPos, rFileName, rTabName, rRef, true); + makeExternalRefStrImpl(rLimits, rBuffer, rPos, rFileName, rTabName, rRef, true); } virtual void makeExternalRefStr( - ScSheetLimits& , + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName, const std::vector<OUString>& rTabNames, const OUString& rTabName, const ScComplexRefData& rRef ) const override { - makeExternalRefStrImpl(rBuffer, rPos, rFileName, rTabNames, rTabName, rRef, true); + makeExternalRefStrImpl(rLimits, rBuffer, rPos, rFileName, rTabNames, rTabName, rRef, true); } }; @@ -1092,10 +1097,11 @@ struct ConventionXL } static void GetTab( + ScSheetLimits& rLimits, const ScAddress& rPos, const std::vector<OUString>& rTabNames, const ScSingleRefData& rRef, OUString& rTabName ) { - ScAddress aAbs = rRef.toAbs(rPos); + ScAddress aAbs = rRef.toAbs(rLimits, rPos); if (rRef.IsTabDeleted() || static_cast<size_t>(aAbs.Tab()) >= rTabNames.size()) { rTabName = ScResId( STR_NO_REF_TABLE ); @@ -1104,7 +1110,7 @@ struct ConventionXL rTabName = rTabNames[aAbs.Tab()]; } - static void MakeTabStr( OUStringBuffer& rBuf, + static void MakeTabStr( ScSheetLimits& rLimits, OUStringBuffer& rBuf, const ScAddress& rPos, const std::vector<OUString>& rTabNames, const ScComplexRefData& rRef, @@ -1114,11 +1120,11 @@ struct ConventionXL { OUString aStartTabName, aEndTabName; - GetTab(rPos, rTabNames, rRef.Ref1, aStartTabName); + GetTab(rLimits, rPos, rTabNames, rRef.Ref1, aStartTabName); if( !bSingleRef && rRef.Ref2.IsFlag3D() ) { - GetTab(rPos, rTabNames, rRef.Ref2, aEndTabName); + GetTab(rLimits, rPos, rTabNames, rRef.Ref2, aEndTabName); } rBuf.append( aStartTabName ); @@ -1260,14 +1266,14 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL ConventionXL_A1() : Convention_A1( FormulaGrammar::CONV_XL_A1 ) { } explicit ConventionXL_A1( FormulaGrammar::AddressConvention eConv ) : Convention_A1( eConv ) { } - static void makeSingleCellStr( OUStringBuffer& rBuf, const ScSingleRefData& rRef, const ScAddress& rAbs ) + static void makeSingleCellStr( ScSheetLimits& rLimits, OUStringBuffer& rBuf, const ScSingleRefData& rRef, const ScAddress& rAbs ) { if (!rRef.IsColRel()) rBuf.append('$'); - MakeColStr(rBuf, rAbs.Col()); + MakeColStr(rLimits, rBuf, rAbs.Col()); if (!rRef.IsRowRel()) rBuf.append('$'); - MakeRowStr(rBuf, rAbs.Row()); + MakeRowStr(rLimits, rBuf, rAbs.Row()); } virtual void makeRefStr( @@ -1284,11 +1290,11 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL // Play fast and loose with invalid refs. There is not much point in producing // Foo!A1:#REF! versus #REF! at this point - ScAddress aAbs1 = aRef.Ref1.toAbs(rPos), aAbs2; + ScAddress aAbs1 = aRef.Ref1.toAbs(rLimits, rPos), aAbs2; - MakeTabStr(rBuf, rPos, rTabNames, aRef, bSingleRef); + MakeTabStr(rLimits, rBuf, rPos, rTabNames, aRef, bSingleRef); - if (!ValidAddress(aAbs1)) + if (!rLimits.ValidAddress(aAbs1)) { rBuf.append(rErrRef); return; @@ -1296,8 +1302,8 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL if( !bSingleRef ) { - aAbs2 = aRef.Ref2.toAbs(rPos); - if (!ValidAddress(aAbs2)) + aAbs2 = aRef.Ref2.toAbs(rLimits, rPos); + if (!rLimits.ValidAddress(aAbs2)) { rBuf.append(rErrRef); return; @@ -1307,11 +1313,11 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL { if (!aRef.Ref1.IsRowRel()) rBuf.append( '$' ); - MakeRowStr(rBuf, aAbs1.Row()); + MakeRowStr(rLimits, rBuf, aAbs1.Row()); rBuf.append( ':' ); if (!aRef.Ref2.IsRowRel()) rBuf.append( '$' ); - MakeRowStr(rBuf, aAbs2.Row()); + MakeRowStr(rLimits, rBuf, aAbs2.Row()); return; } @@ -1319,20 +1325,20 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL { if (!aRef.Ref1.IsColRel()) rBuf.append( '$' ); - MakeColStr(rBuf, aAbs1.Col()); + MakeColStr(rLimits, rBuf, aAbs1.Col()); rBuf.append( ':' ); if (!aRef.Ref2.IsColRel()) rBuf.append( '$' ); - MakeColStr(rBuf, aAbs2.Col()); + MakeColStr(rLimits, rBuf, aAbs2.Col()); return; } } - makeSingleCellStr(rBuf, aRef.Ref1, aAbs1); + makeSingleCellStr(rLimits, rBuf, aRef.Ref1, aAbs1); if (!bSingleRef) { rBuf.append( ':' ); - makeSingleCellStr(rBuf, aRef.Ref2, aAbs2); + makeSingleCellStr(rLimits, rBuf, aRef.Ref2, aAbs2); } } @@ -1377,6 +1383,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL } virtual void makeExternalRefStr( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName, const OUString& rTabName, const ScSingleRefData& rRef ) const override { @@ -1390,26 +1397,26 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL ScRangeStringConverter::AppendTableName(rBuffer, rTabName); rBuffer.append('!'); - makeSingleCellStr(rBuffer, rRef, rRef.toAbs(rPos)); + makeSingleCellStr(rLimits, rBuffer, rRef, rRef.toAbs(rLimits, rPos)); } virtual void makeExternalRefStr( - ScSheetLimits&, + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName, const std::vector<OUString>& rTabNames, const OUString& rTabName, const ScComplexRefData& rRef ) const override { - ScRange aAbsRef = rRef.toAbs(rPos); + ScRange aAbsRef = rRef.toAbs(rLimits, rPos); ConventionXL::makeExternalDocStr(rBuffer, rFileName); ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, rTabNames, aAbsRef); rBuffer.append('!'); - makeSingleCellStr(rBuffer, rRef.Ref1, aAbsRef.aStart); + makeSingleCellStr(rLimits, rBuffer, rRef.Ref1, aAbsRef.aStart); if (aAbsRef.aStart != aAbsRef.aEnd) { rBuffer.append(':'); - makeSingleCellStr(rBuffer, rRef.Ref2, aAbsRef.aEnd); + makeSingleCellStr(rLimits, rBuffer, rRef.Ref2, aAbsRef.aEnd); } } }; @@ -1487,6 +1494,7 @@ struct ConventionXL_OOX : public ConventionXL_A1 } virtual void makeExternalRefStr( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 nFileId, const OUString& /*rFileName*/, const OUString& rTabName, const ScSingleRefData& rRef ) const override { @@ -1509,11 +1517,11 @@ struct ConventionXL_OOX : public ConventionXL_A1 } rBuffer.append('!'); - makeSingleCellStr(rBuffer, rRef, rRef.toAbs(rPos)); + makeSingleCellStr(rLimits, rBuffer, rRef, rRef.toAbs(rLimits, rPos)); } virtual void makeExternalRefStr( - ScSheetLimits& , + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 nFileId, const OUString& /*rFileName*/, const std::vector<OUString>& rTabNames, const OUString& rTabName, const ScComplexRefData& rRef ) const override @@ -1524,7 +1532,7 @@ struct ConventionXL_OOX : public ConventionXL_A1 // sheet names as well. The [N] having to be within the quoted sheet // name is ugly enough... - ScRange aAbsRef = rRef.toAbs(rPos); + ScRange aAbsRef = rRef.toAbs(rLimits, rPos); OUStringBuffer aBuf; ConventionXL::makeExternalTabNameRange( aBuf, rTabName, rTabNames, aAbsRef); @@ -1541,11 +1549,11 @@ struct ConventionXL_OOX : public ConventionXL_A1 } rBuffer.append('!'); - makeSingleCellStr(rBuffer, rRef.Ref1, aAbsRef.aStart); + makeSingleCellStr(rLimits, rBuffer, rRef.Ref1, aAbsRef.aStart); if (aAbsRef.aStart != aAbsRef.aEnd) { rBuffer.append(':'); - makeSingleCellStr(rBuffer, rRef.Ref2, aAbsRef.aEnd); + makeSingleCellStr(rLimits, rBuffer, rRef.Ref2, aAbsRef.aEnd); } } @@ -1600,14 +1608,14 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL bool bSingleRef, bool /*bFromRangeName*/ ) const override { - ScRange aAbsRef = rRef.toAbs(rPos); + ScRange aAbsRef = rRef.toAbs(rLimits, rPos); ScComplexRefData aRef( rRef ); - MakeTabStr(rBuf, rPos, rTabNames, aRef, bSingleRef); + MakeTabStr(rLimits, rBuf, rPos, rTabNames, aRef, bSingleRef); // Play fast and loose with invalid refs. There is not much point in producing // Foo!A1:#REF! versus #REF! at this point - if (!ValidCol(aAbsRef.aStart.Col()) || !ValidRow(aAbsRef.aStart.Row())) + if (!rLimits.ValidCol(aAbsRef.aStart.Col()) || !rLimits.ValidRow(aAbsRef.aStart.Row())) { rBuf.append(rErrRef); return; @@ -1615,7 +1623,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL if( !bSingleRef ) { - if (!ValidCol(aAbsRef.aEnd.Col()) || !ValidRow(aAbsRef.aEnd.Row())) + if (!rLimits.ValidCol(aAbsRef.aEnd.Col()) || !rLimits.ValidRow(aAbsRef.aEnd.Row())) { rBuf.append(rErrRef); return; @@ -1699,6 +1707,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL } virtual void makeExternalRefStr( + ScSheetLimits& rLimits, OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName, const OUString& rTabName, const ScSingleRefData& rRef ) const override { @@ -1708,7 +1717,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL // whole file path with [] because the file name can contain any // characters. - ScAddress aAbsRef = rRef.toAbs(rPos); + ScAddress aAbsRef = rRef.toAbs(rLimits, rPos); ConventionXL::makeExternalDocStr(rBuffer, rFileName); ScRangeStringConverter::AppendTableName(rBuffer, rTabName); rBuffer.append('!'); @@ -1723,13 +1732,13 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL const std::vector<OUString>& rTabNames, const OUString& rTabName, const ScComplexRefData& rRef ) const override { - ScRange aAbsRef = rRef.toAbs(rPos); + ScRange aAbsRef = rRef.toAbs(rLimits, rPos); ConventionXL::makeExternalDocStr(rBuffer, rFileName); ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, rTabNames, aAbsRef); rBuffer.append('!'); - if (!ValidCol(aAbsRef.aEnd.Col()) || !ValidRow(aAbsRef.aEnd.Row())) + if (!rLimits.ValidCol(aAbsRef.aEnd.Col()) || !rLimits.ValidRow(aAbsRef.aEnd.Row())) { rBuffer.append(ScResId(STR_NO_REF_TABLE)); return; @@ -3183,7 +3192,7 @@ bool ScCompiler::IsDoubleReference( const OUString& rName, const OUString* pErrR if ( !(nFlags & ScRefFlags::TAB2_VALID) ) aRef.Ref2.SetTabDeleted( true ); // #REF! aRef.Ref2.SetFlag3D( ( nFlags & ScRefFlags::TAB2_3D ) != ScRefFlags::ZERO ); - aRef.SetRange(aRange, aPos); + aRef.SetRange(pDoc->GetSheetLimits(), aRange, aPos); if (aExtInfo.mbExternal) { ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager(); @@ -3249,7 +3258,7 @@ bool ScCompiler::IsSingleReference( const OUString& rName, const OUString* pErrR aRef.SetTabDeleted(true); nFlags |= ScRefFlags::VALID; } - aRef.SetAddress(aAddr, aPos); + aRef.SetAddress(pDoc->GetSheetLimits(), aAddr, aPos); if (aExtInfo.mbExternal) { @@ -3583,7 +3592,7 @@ bool ScCompiler::IsColRowName( const OUString& rName ) aRef.SetColRel( true ); // ColName else aRef.SetRowRel( true ); // RowName - aRef.SetAddress(aIter.GetPos(), aPos); + aRef.SetAddress(pDoc->GetSheetLimits(), aIter.GetPos(), aPos); bInList = bFound = true; } } @@ -3765,7 +3774,7 @@ bool ScCompiler::IsColRowName( const OUString& rName ) aRef.SetRowRel( true ); // RowName else aRef.SetColRel( true ); // ColName - aRef.SetAddress(aAdr, aPos); + aRef.SetAddress(pDoc->GetSheetLimits(), aAdr, aPos); } } if ( bFound ) @@ -5011,7 +5020,7 @@ void ScCompiler::CreateStringFromExternal( OUStringBuffer& rBuffer, const Formul rBuffer.append(pConv->makeExternalNameStr( nFileId, *pFileName, t->GetString().getString())); break; case svExternalSingleRef: - pConv->makeExternalRefStr( + pConv->makeExternalRefStr(pDoc->GetSheetLimits(), rBuffer, GetPos(), nFileId, *pFileName, t->GetString().getString(), *t->GetSingleRef()); break; @@ -5118,7 +5127,7 @@ void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const Formu aRef.Ref1 = aRef.Ref2 = rRef; if ( eOp == ocColRowName ) { - ScAddress aAbs = rRef.toAbs(aPos); + ScAddress aAbs = rRef.toAbs(pDoc, aPos); if (pDoc->HasStringData(aAbs.Col(), aAbs.Row(), aAbs.Tab())) { OUString aStr = pDoc->GetString(aAbs, mpInterpreterContext); @@ -5135,7 +5144,7 @@ void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const Formu else if (pArr && (p = maArrIterator.PeekPrevNoSpaces()) && p->GetOpCode() == ocTableRefOpen) { OUString aStr; - ScAddress aAbs = rRef.toAbs(aPos); + ScAddress aAbs = rRef.toAbs(pDoc, aPos); const ScDBData* pData = pDoc->GetDBAtCursor( aAbs.Col(), aAbs.Row(), aAbs.Tab(), ScDBDataPortion::AREA); SAL_WARN_IF( !pData, "sc.core", "ScCompiler::CreateStringFromSingleRef - TableRef without ScDBData: " << aAbs.Format( ScRefFlags::VALID | ScRefFlags::TAB_3D, pDoc)); @@ -5323,8 +5332,8 @@ void ScCompiler::fillAddInToken(::std::vector< css::sheet::FormulaOpCodeMapEntry bool ScCompiler::HandleColRowName() { ScSingleRefData& rRef = *mpToken->GetSingleRef(); - const ScAddress aAbs = rRef.toAbs(aPos); - if (!ValidAddress(aAbs)) + const ScAddress aAbs = rRef.toAbs(pDoc, aPos); + if (!pDoc->ValidAddress(aAbs)) { SetError( FormulaError::NoRef ); return true; @@ -5497,7 +5506,7 @@ bool ScCompiler::HandleColRowName() aRefData.SetColRel( true ); else aRefData.SetRowRel( true ); - aRefData.SetAddress(aRange.aStart, aPos); + aRefData.SetAddress(pDoc->GetSheetLimits(), aRange.aStart, aPos); pNew->AddSingleReference( aRefData ); } else @@ -5514,7 +5523,7 @@ bool ScCompiler::HandleColRowName() aRefData.Ref1.SetRowRel( true ); aRefData.Ref2.SetRowRel( true ); } - aRefData.SetRange(aRange, aPos); + aRefData.SetRange(pDoc->GetSheetLimits(), aRange, aPos); if ( bInList ) pNew->AddDoubleReference( aRefData ); else @@ -5543,7 +5552,7 @@ bool ScCompiler::HandleDbData() ScRange aRange; pDBData->GetArea(aRange); aRange.aEnd.SetTab(aRange.aStart.Tab()); - aRefData.SetRange(aRange, aPos); + aRefData.SetRange(pDoc->GetSheetLimits(), aRange, aPos); ScTokenArray* pNew = new ScTokenArray(pDoc); pNew->AddDoubleReference( aRefData ); PushTokenArray( pNew, true ); @@ -5760,7 +5769,7 @@ bool ScCompiler::HandleTableRef() { case svSingleRef: { - aColRange.aStart = aColRange.aEnd = mpToken->GetSingleRef()->toAbs( aPos); + aColRange.aStart = aColRange.aEnd = mpToken->GetSingleRef()->toAbs(pDoc, aPos); if ( GetTokenIfOpCode( ocTableRefClose) && (nLevel--) && GetTokenIfOpCode( ocRange) && GetTokenIfOpCode( ocTableRefOpen) && (++nLevel) && @@ -5770,7 +5779,7 @@ bool ScCompiler::HandleTableRef() aColRange = ScRange( ScAddress::INITIALIZE_INVALID); else { - aColRange.aEnd = mpToken->GetSingleRef()->toAbs( aPos); + aColRange.aEnd = mpToken->GetSingleRef()->toAbs(pDoc, aPos); aColRange.PutInOrder(); bCol2Rel = mpToken->GetSingleRef()->IsColRel(); bCol2RelName = mpToken->GetSingleRef()->IsRelName(); @@ -5807,13 +5816,13 @@ bool ScCompiler::HandleTableRef() aRefData.SetFlag3D( true); if (nError != FormulaError::NONE) { - aRefData.SetAddress( aRange.aStart, aRange.aStart); + aRefData.SetAddress( pDoc->GetSheetLimits(), aRange.aStart, aRange.aStart); pTR->SetAreaRefRPN( new ScSingleRefToken(pDoc->GetSheetLimits(), aRefData)); // set reference at TableRef pNew->Add( new FormulaErrorToken( nError)); // set error in RPN } else { - aRefData.SetAddress( aRange.aStart, aPos); + aRefData.SetAddress( pDoc->GetSheetLimits(), aRange.aStart, aPos); pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData)); } } @@ -5836,13 +5845,13 @@ bool ScCompiler::HandleTableRef() aRefData.Ref1.SetFlag3D( true); if (nError != FormulaError::NONE) { - aRefData.SetRange( aRange, aRange.aStart); + aRefData.SetRange( pDoc->GetSheetLimits(), aRange, aRange.aStart); pTR->SetAreaRefRPN( new ScDoubleRefToken(pDoc->GetSheetLimits(), aRefData)); // set reference at TableRef pNew->Add( new FormulaErrorToken( nError)); // set error in RPN } else { - aRefData.SetRange( aRange, aPos); + aRefData.SetRange( pDoc->GetSheetLimits(), aRange, aPos); pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData)); } } @@ -6078,7 +6087,7 @@ void ScCompiler::ReplaceDoubleRefII(FormulaToken** ppDoubleRefTok) if (!rRange.Ref1.IsRowRel() && !rRange.Ref2.IsRowRel()) return; - ScRange aAbsRange = rRange.toAbs(aPos); + ScRange aAbsRange = rRange.toAbs(pDoc, aPos); if (aAbsRange.aStart == aAbsRange.aEnd) return; // Nothing to do (trivial case). @@ -6092,7 +6101,7 @@ void ScCompiler::ReplaceDoubleRefII(FormulaToken** ppDoubleRefTok) aSingleRef.SetColRel(rRange.Ref1.IsColRel()); aSingleRef.SetRowRel(true); aSingleRef.SetTabRel(rRange.Ref1.IsTabRel()); - aSingleRef.SetAddress(aAddr, aPos); + aSingleRef.SetAddress(pDoc->GetSheetLimits(), aAddr, aPos); // Replace the original doubleref token with computed singleref token FormulaToken* pNewSingleRefTok = new ScSingleRefToken(pDoc->GetSheetLimits(), aSingleRef); @@ -6168,7 +6177,7 @@ static void lcl_GetColRowDeltas(const ScRange& rRange, SCCOL& rXDelta, SCROW& rY bool ScCompiler::AdjustSumRangeShape(const ScComplexRefData& rBaseRange, ScComplexRefData& rSumRange) { - ScRange aAbs = rSumRange.toAbs(aPos); + ScRange aAbs = rSumRange.toAbs(pDoc, aPos); // Current sum-range end col/row SCCOL nEndCol = aAbs.aEnd.Col(); @@ -6177,7 +6186,7 @@ bool ScCompiler::AdjustSumRangeShape(const ScComplexRefData& rBaseRange, ScCompl // Current behaviour is, we will get a #NAME? for the below case, so bail out. // Note that sum-range's End[Col,Row] are same as Start[Col,Row] if the original formula // has a single-ref as the sum-range. - if (!ValidCol(nEndCol) || !ValidRow(nEndRow)) + if (!pDoc->ValidCol(nEndCol) || !pDoc->ValidRow(nEndRow)) return false; SCCOL nXDeltaSum = 0; @@ -6185,7 +6194,7 @@ bool ScCompiler::AdjustSumRangeShape(const ScComplexRefData& rBaseRange, ScCompl lcl_GetColRowDeltas(aAbs, nXDeltaSum, nYDeltaSum); - aAbs = rBaseRange.toAbs(aPos); + aAbs = rBaseRange.toAbs(pDoc, aPos); SCCOL nXDelta = 0; SCROW nYDelta = 0; |