sc/inc/address.hxx | 8 + sc/inc/refdata.hxx | 1 sc/qa/unit/ucalc_formula.cxx | 3 sc/source/core/tool/compiler.cxx | 202 ++++++++++++++++------------------- sc/source/core/tool/interpr1.cxx | 8 - sc/source/core/tool/interpr4.cxx | 7 - sc/source/core/tool/refdata.cxx | 18 +++ sc/source/filter/excel/xeformula.cxx | 27 ++-- sc/source/ui/miscdlgs/anyrefdg.cxx | 7 - 9 files changed, 150 insertions(+), 131 deletions(-)
New commits: commit 7acfbfbbade70a05c8ffa02fe84c1e00f7cfb480 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 15 23:02:02 2013 -0400 Test all 3 UI grammars. Change-Id: I82a3a5ada193415c8b70bf2c2bfefc49fbcd7981 diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index 5d1d082..7b029de 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -116,6 +116,9 @@ void Test::testFormulaCompiler() const char* pOutput; FormulaGrammar::Grammar eOutputGram; } aTests[] = { { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "[.B1]-[.$C2]+[.D$3]-[.$E$4]", FormulaGrammar::GRAM_ODFF }, + { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE }, + { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE_XL_A1 }, + { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "RC[1]-R[1]C3+R3C[3]-R4C5", FormulaGrammar::GRAM_NATIVE_XL_R1C1 }, }; for (size_t i = 0, n = SAL_N_ELEMENTS(aTests); i < n; ++i) commit 1eb04087c64fc0c2aadff740819f3e4135b19b2b Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 15 22:51:29 2013 -0400 Start replacing CalcAbsIfRel() with toAbs(). To avoid changing the state of reference just to get absolute reference position with respect to the base position. I'm not finished with it yet. Change-Id: I4a9db6dbf74aefb0a77de927a933cf4dab94bfd5 diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx index 2f59565..84c62cb 100644 --- a/sc/inc/address.hxx +++ b/sc/inc/address.hxx @@ -420,6 +420,10 @@ struct ScAddressEqualFunctor } }; +inline bool ValidAddress( const ScAddress& rAddr ) +{ + return ValidCol(rAddr.Col()) && ValidRow(rAddr.Row()) && ValidTab(rAddr.Tab()); +} // === ScRange =============================================================== @@ -616,6 +620,10 @@ struct ScRangeEqualFunctor } }; +inline bool ValidRange( const ScRange& rRange ) +{ + return ValidAddress(rRange.aStart) && ValidAddress(rRange.aEnd); +} // === ScRangePair =========================================================== diff --git a/sc/inc/refdata.hxx b/sc/inc/refdata.hxx index 0eef078..d79590c 100644 --- a/sc/inc/refdata.hxx +++ b/sc/inc/refdata.hxx @@ -82,6 +82,7 @@ struct SC_DLLPUBLIC ScSingleRefData inline bool ValidExternal() const; ScAddress toAbs( const ScAddress& rPos ) const; + void SetAddress( const ScAddress& rAddr, const ScAddress& rPos ); void CalcRelFromAbs( const ScAddress& rPos ); void CalcAbsIfRel( const ScAddress& rPos ); diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 1fd1cf6..597028b 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -657,9 +657,9 @@ static OUString lcl_makeExternalNameStr(const OUString& rFile, const OUString& r } static bool lcl_getLastTabName( OUString& rTabName2, const OUString& rTabName1, - const vector<OUString>& rTabNames, const ScComplexRefData& rRef ) + const vector<OUString>& rTabNames, const ScRange& rRef ) { - SCsTAB nTabSpan = rRef.Ref2.nTab - rRef.Ref1.nTab; + SCsTAB nTabSpan = rRef.aEnd.Tab() - rRef.aStart.Tab(); if (nTabSpan > 0) { size_t nCount = rTabNames.size(); @@ -764,15 +764,14 @@ struct ConventionOOO_A1 : public Convention_A1 } - void MakeOneRefStrImpl( OUStringBuffer& rBuffer, - const ScCompiler& rComp, - const ScSingleRefData& rRef, - bool bForceTab, - bool bODF ) const + void MakeOneRefStrImpl( + OUStringBuffer& rBuffer, const ScCompiler& rComp, + const ScSingleRefData& rRef, const ScAddress& rAbsRef, + bool bForceTab, bool bODF ) const { if( rRef.IsFlag3D() || bForceTab ) { - if (rRef.IsTabDeleted()) + if (!ValidTab(rAbsRef.Tab())) { if (!rRef.IsTabRel()) rBuffer.append(sal_Unicode('$')); @@ -782,7 +781,7 @@ struct ConventionOOO_A1 : public Convention_A1 else { String aDoc; - String aRefStr( MakeTabStr( rComp, rRef.nTab, aDoc ) ); + String aRefStr(MakeTabStr(rComp, rAbsRef.Tab(), aDoc)); rBuffer.append(aDoc); if (!rRef.IsTabRel()) rBuffer.append(sal_Unicode('$')); @@ -793,16 +792,16 @@ struct ConventionOOO_A1 : public Convention_A1 rBuffer.append(sal_Unicode('.')); if (!rRef.IsColRel()) rBuffer.append(sal_Unicode('$')); - if ( rRef.IsColDeleted() ) + if (!ValidCol(rAbsRef.Col())) rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef)); else - MakeColStr(rBuffer, rRef.nCol ); + MakeColStr(rBuffer, rAbsRef.Col()); if (!rRef.IsRowRel()) rBuffer.append(sal_Unicode('$')); - if ( rRef.IsRowDeleted() ) + if (!ValidRow(rAbsRef.Row())) rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef)); else - MakeRowStr( rBuffer, rRef.nRow ); + MakeRowStr(rBuffer, rAbsRef.Row()); } @@ -817,23 +816,24 @@ struct ConventionOOO_A1 : public Convention_A1 ScComplexRefData aRef( rRef ); // In case absolute/relative positions weren't separately available: // transform relative to absolute! - aRef.Ref1.CalcAbsIfRel( rComp.GetPos() ); + ScAddress aAbs1 = aRef.Ref1.toAbs(rComp.GetPos()), aAbs2; if( !bSingleRef ) - aRef.Ref2.CalcAbsIfRel( rComp.GetPos() ); - if (bODF && FormulaGrammar::isODFF( rComp.GetGrammar()) && - (aRef.Ref1.IsColDeleted() || aRef.Ref1.IsRowDeleted() || aRef.Ref1.IsTabDeleted() || - aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted() || aRef.Ref2.IsTabDeleted())) + aAbs2 = aRef.Ref2.toAbs(rComp.GetPos()); + + if (bODF && FormulaGrammar::isODFF( rComp.GetGrammar()) && (!ValidAddress(aAbs1) || !ValidAddress(aAbs2))) + { rBuffer.append( rComp.GetCurrentOpCodeMap()->getSymbol( ocErrRef)); // For ODFF write [#REF!], but not for PODF so apps reading ODF // 1.0/1.1 may have a better chance if they implemented the old // form. + } else { - MakeOneRefStrImpl( rBuffer, rComp, aRef.Ref1, false, bODF); + MakeOneRefStrImpl(rBuffer, rComp, aRef.Ref1, aAbs1, false, bODF); if (!bSingleRef) { rBuffer.append(sal_Unicode(':')); - MakeOneRefStrImpl( rBuffer, rComp, aRef.Ref2, (aRef.Ref2.nTab != aRef.Ref1.nTab), bODF); + MakeOneRefStrImpl(rBuffer, rComp, aRef.Ref2, aAbs2, (aRef.Ref2.nTab != aRef.Ref1.nTab), bODF); } } if (bODF) @@ -874,10 +874,12 @@ struct ConventionOOO_A1 : public Convention_A1 return lcl_makeExternalNameStr( rFile, rName, sal_Unicode('#'), false); } - bool makeExternalSingleRefStr( OUStringBuffer& rBuffer, sal_uInt16 nFileId, - const String& rTabName, const ScSingleRefData& rRef, - ScExternalRefManager* pRefMgr, bool bDisplayTabName, bool bEncodeUrl ) const + bool makeExternalSingleRefStr( + OUStringBuffer& rBuffer, sal_uInt16 nFileId, + const String& rTabName, const ScSingleRefData& rRef, const ScAddress& rPos, + ScExternalRefManager* pRefMgr, bool bDisplayTabName, bool bEncodeUrl ) const { + ScAddress aAbsRef = rRef.toAbs(rPos); if (bDisplayTabName) { OUString aFile; @@ -904,10 +906,10 @@ struct ConventionOOO_A1 : public Convention_A1 if (!rRef.IsColRel()) rBuffer.append(sal_Unicode('$')); - MakeColStr( rBuffer, rRef.nCol); + MakeColStr( rBuffer, aAbsRef.Col()); if (!rRef.IsRowRel()) rBuffer.append(sal_Unicode('$')); - MakeRowStr( rBuffer, rRef.nRow); + MakeRowStr( rBuffer, aAbsRef.Row()); return true; } @@ -916,9 +918,6 @@ struct ConventionOOO_A1 : public Convention_A1 sal_uInt16 nFileId, const String& rTabName, const ScSingleRefData& rRef, ScExternalRefManager* pRefMgr, bool bODF ) const { - ScSingleRefData aRef(rRef); - aRef.CalcAbsIfRel(rCompiler.GetPos()); - if (bODF) rBuffer.append( sal_Unicode('[')); @@ -937,7 +936,7 @@ struct ConventionOOO_A1 : public Convention_A1 default: ; } - makeExternalSingleRefStr(rBuffer, nFileId, rTabName, aRef, pRefMgr, true, bEncodeUrl); + makeExternalSingleRefStr(rBuffer, nFileId, rTabName, rRef, rCompiler.GetPos(), pRefMgr, true, bEncodeUrl); if (bODF) rBuffer.append( sal_Unicode(']')); } @@ -953,8 +952,7 @@ struct ConventionOOO_A1 : public Convention_A1 sal_uInt16 nFileId, const String& rTabName, const ScComplexRefData& rRef, ScExternalRefManager* pRefMgr, bool bODF ) const { - ScComplexRefData aRef(rRef); - aRef.CalcAbsIfRel(rCompiler.GetPos()); + ScRange aAbsRange = rRef.toAbs(rCompiler.GetPos()); if (bODF) rBuffer.append( sal_Unicode('[')); @@ -977,13 +975,13 @@ struct ConventionOOO_A1 : public Convention_A1 do { - if (!makeExternalSingleRefStr(rBuffer, nFileId, rTabName, aRef.Ref1, pRefMgr, true, bEncodeUrl)) + if (!makeExternalSingleRefStr(rBuffer, nFileId, rTabName, rRef.Ref1, rCompiler.GetPos(), pRefMgr, true, bEncodeUrl)) break; rBuffer.append(sal_Unicode(':')); OUString aLastTabName; - bool bDisplayTabName = (aRef.Ref1.nTab != aRef.Ref2.nTab); + bool bDisplayTabName = (aAbsRange.aStart.Tab() != aAbsRange.aEnd.Tab()); if (bDisplayTabName) { // Get the name of the last table. @@ -994,7 +992,7 @@ struct ConventionOOO_A1 : public Convention_A1 OSL_TRACE( "ConventionOOO_A1::makeExternalRefStrImpl: no sheet names for document ID %d", nFileId); } - if (!lcl_getLastTabName(aLastTabName, rTabName, aTabNames, aRef)) + if (!lcl_getLastTabName(aLastTabName, rTabName, aTabNames, aAbsRange)) { OSL_FAIL( "ConventionOOO_A1::makeExternalRefStrImpl: sheet name not found"); // aLastTabName contains #REF!, proceed. @@ -1003,7 +1001,7 @@ struct ConventionOOO_A1 : public Convention_A1 else if (bODF) rBuffer.append( sal_Unicode('.')); // need at least the sheet separator in ODF makeExternalSingleRefStr( rBuffer, nFileId, aLastTabName, - aRef.Ref2, pRefMgr, bDisplayTabName, bEncodeUrl); + rRef.Ref2, rCompiler.GetPos(), pRefMgr, bDisplayTabName, bEncodeUrl); } while (0); if (bODF) rBuffer.append( sal_Unicode(']')); @@ -1196,7 +1194,7 @@ struct ConventionXL static void makeExternalTabNameRange( OUStringBuffer& rBuf, const OUString& rTabName, const vector<OUString>& rTabNames, - const ScComplexRefData& rRef ) + const ScRange& rRef ) { OUString aLastTabName; if (!lcl_getLastTabName(aLastTabName, rTabName, rTabNames, rRef)) @@ -1272,14 +1270,14 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL ConventionXL_A1() : Convention_A1( FormulaGrammar::CONV_XL_A1 ) { } ConventionXL_A1( FormulaGrammar::AddressConvention eConv ) : Convention_A1( eConv ) { } - void makeSingleCellStr( OUStringBuffer& rBuf, const ScSingleRefData& rRef ) const + void makeSingleCellStr( OUStringBuffer& rBuf, const ScSingleRefData& rRef, const ScAddress& rAbs ) const { if (!rRef.IsColRel()) rBuf.append(sal_Unicode('$')); - MakeColStr(rBuf, rRef.nCol); + MakeColStr(rBuf, rAbs.Col()); if (!rRef.IsRowRel()) rBuf.append(sal_Unicode('$')); - MakeRowStr(rBuf, rRef.nRow); + MakeRowStr(rBuf, rAbs.Row()); } void MakeRefStr( OUStringBuffer& rBuf, @@ -1291,11 +1289,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 - aRef.Ref1.CalcAbsIfRel( rComp.GetPos() ); + ScAddress aAbs1 = aRef.Ref1.toAbs(rComp.GetPos()), aAbs2; MakeDocStr( rBuf, rComp, aRef, bSingleRef ); - if( aRef.Ref1.IsColDeleted() || aRef.Ref1.IsRowDeleted() ) + if (!ValidAddress(aAbs1)) { rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE)); return; @@ -1303,22 +1301,22 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL if( !bSingleRef ) { - aRef.Ref2.CalcAbsIfRel( rComp.GetPos() ); - if( aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted() ) + aAbs2 = aRef.Ref2.toAbs(rComp.GetPos()); + if (!ValidAddress(aAbs2)) { rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE)); return; } - if( aRef.Ref1.nCol == 0 && aRef.Ref2.nCol >= MAXCOL ) + if (aAbs1.Col() == 0 && aAbs2.Col() >= MAXCOL) { if (!aRef.Ref1.IsRowRel()) rBuf.append(sal_Unicode( '$' )); - MakeRowStr( rBuf, aRef.Ref1.nRow ); + MakeRowStr(rBuf, aAbs1.Row()); rBuf.append(sal_Unicode( ':' )); if (!aRef.Ref2.IsRowRel()) rBuf.append(sal_Unicode( '$' )); - MakeRowStr( rBuf, aRef.Ref2.nRow ); + MakeRowStr(rBuf, aAbs2.Row()); return; } @@ -1326,20 +1324,20 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL { if (!aRef.Ref1.IsColRel()) rBuf.append(sal_Unicode( '$' )); - MakeColStr(rBuf, aRef.Ref1.nCol ); + MakeColStr(rBuf, aAbs1.Col()); rBuf.append(sal_Unicode( ':' )); if (!aRef.Ref2.IsColRel()) rBuf.append(sal_Unicode( '$' )); - MakeColStr(rBuf, aRef.Ref2.nCol ); + MakeColStr(rBuf, aAbs2.Col()); return; } } - makeSingleCellStr(rBuf, aRef.Ref1); + makeSingleCellStr(rBuf, aRef.Ref1, aAbs1); if (!bSingleRef) { rBuf.append(sal_Unicode( ':' )); - makeSingleCellStr(rBuf, aRef.Ref2); + makeSingleCellStr(rBuf, aRef.Ref2, aAbs2); } } @@ -1392,15 +1390,12 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL if (!pFullName) return; - ScSingleRefData aRef(rRef); - aRef.CalcAbsIfRel(rCompiler.GetPos()); - ConventionXL::makeExternalDocStr( rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS); ScRangeStringConverter::AppendTableName(rBuffer, rTabName); rBuffer.append(sal_Unicode('!')); - makeSingleCellStr(rBuffer, aRef); + makeSingleCellStr(rBuffer, rRef, rRef.toAbs(rCompiler.GetPos())); } virtual void makeExternalRefStr( OUStringBuffer& rBuffer, const ScCompiler& rCompiler, @@ -1416,19 +1411,18 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL if (aTabNames.empty()) return; - ScComplexRefData aRef(rRef); - aRef.CalcAbsIfRel(rCompiler.GetPos()); + ScRange aAbsRef = rRef.toAbs(rCompiler.GetPos()); ConventionXL::makeExternalDocStr( rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS); - ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aRef); + ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aAbsRef); rBuffer.append(sal_Unicode('!')); - makeSingleCellStr(rBuffer, aRef.Ref1); - if (aRef.Ref1 != aRef.Ref2) + makeSingleCellStr(rBuffer, rRef.Ref1, aAbsRef.aStart); + if (aAbsRef.aStart != aAbsRef.aEnd) { rBuffer.append(sal_Unicode(':')); - makeSingleCellStr(rBuffer, aRef.Ref2); + makeSingleCellStr(rBuffer, rRef.Ref2, aAbsRef.aEnd); } } }; @@ -1449,7 +1443,7 @@ const ScCompiler::Convention * const ScCompiler::pConvXL_OOX = &ConvXL_OOX; //----------------------------------------------------------------------------- static void -r1c1_add_col( OUStringBuffer &rBuf, const ScSingleRefData& rRef ) +r1c1_add_col( OUStringBuffer &rBuf, const ScSingleRefData& rRef, const ScAddress& rAbsRef ) { rBuf.append( sal_Unicode( 'C' ) ); if( rRef.IsColRel() ) @@ -1458,10 +1452,10 @@ r1c1_add_col( OUStringBuffer &rBuf, const ScSingleRefData& rRef ) rBuf.append("[").append( OUString::number( rRef.nRelCol ) ).append("]"); } else - rBuf.append( OUString::number( rRef.nCol + 1 ) ); + rBuf.append( OUString::number( rAbsRef.Col() + 1 ) ); } static void -r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef ) +r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef, const ScAddress& rAbsRef ) { rBuf.append( sal_Unicode( 'R' ) ); if( rRef.IsRowRel() ) @@ -1472,7 +1466,7 @@ r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef ) } } else - rBuf.append( OUString::number( rRef.nRow + 1 ) ); + rBuf.append( OUString::number( rAbsRef.Row() + 1 ) ); } struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL @@ -1483,14 +1477,14 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL const ScComplexRefData& rRef, bool bSingleRef ) const { + ScRange aAbsRef = rRef.toAbs(rComp.GetPos()); ScComplexRefData aRef( rRef ); MakeDocStr( rBuf, rComp, aRef, bSingleRef ); // Play fast and loose with invalid refs. There is not much point in producing // Foo!A1:#REF! versus #REF! at this point - aRef.Ref1.CalcAbsIfRel( rComp.GetPos() ); - if( aRef.Ref1.IsColDeleted() || aRef.Ref1.IsRowDeleted() ) + if (!ValidCol(aAbsRef.aStart.Col()) || !ValidRow(aAbsRef.aStart.Row())) { rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE)); return; @@ -1498,45 +1492,45 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL if( !bSingleRef ) { - aRef.Ref2.CalcAbsIfRel( rComp.GetPos() ); - if( aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted() ) + if (!ValidCol(aAbsRef.aEnd.Col()) || !ValidRow(aAbsRef.aEnd.Row())) { rBuf.append(ScGlobal::GetRscString(STR_NO_REF_TABLE)); return; } - if( aRef.Ref1.nCol == 0 && aRef.Ref2.nCol >= MAXCOL ) + if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= MAXCOL) { - r1c1_add_row( rBuf, rRef.Ref1 ); - if( rRef.Ref1.nRow != rRef.Ref2.nRow || - rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel() ) { + r1c1_add_row(rBuf, rRef.Ref1, aAbsRef.aStart); + if (aAbsRef.aStart.Row() != aAbsRef.aEnd.Row() || + rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel() ) + { rBuf.append (sal_Unicode ( ':' ) ); - r1c1_add_row( rBuf, rRef.Ref2 ); + r1c1_add_row(rBuf, rRef.Ref2, aAbsRef.aEnd); } return; } - if( aRef.Ref1.nRow == 0 && aRef.Ref2.nRow >= MAXROW ) + if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= MAXROW) { - r1c1_add_col( rBuf, rRef.Ref1 ); - if( rRef.Ref1.nCol != rRef.Ref2.nCol || - rRef.Ref1.IsColRel() != rRef.Ref2.IsColRel() ) + r1c1_add_col(rBuf, rRef.Ref1, aAbsRef.aStart); + if (aAbsRef.aStart.Col() != aAbsRef.aEnd.Col() || + rRef.Ref1.IsColRel() != rRef.Ref2.IsColRel()) { rBuf.append (sal_Unicode ( ':' ) ); - r1c1_add_col( rBuf, rRef.Ref2 ); + r1c1_add_col(rBuf, rRef.Ref2, aAbsRef.aEnd); } return; } } - r1c1_add_row( rBuf, rRef.Ref1 ); - r1c1_add_col( rBuf, rRef.Ref1 ); + r1c1_add_row(rBuf, rRef.Ref1, aAbsRef.aStart); + r1c1_add_col(rBuf, rRef.Ref1, aAbsRef.aStart); if (!bSingleRef) { rBuf.append (sal_Unicode ( ':' ) ); - r1c1_add_row( rBuf, rRef.Ref2 ); - r1c1_add_col( rBuf, rRef.Ref2 ); + r1c1_add_row(rBuf, rRef.Ref2, aAbsRef.aEnd); + r1c1_add_col(rBuf, rRef.Ref2, aAbsRef.aEnd); } } @@ -1592,16 +1586,15 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL if (!pFullName) return; - ScSingleRefData aRef(rRef); - aRef.CalcAbsIfRel(rCompiler.GetPos()); + ScAddress aAbsRef = rRef.toAbs(rCompiler.GetPos()); ConventionXL::makeExternalDocStr( rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS); ScRangeStringConverter::AppendTableName(rBuffer, rTabName); rBuffer.append(sal_Unicode('!')); - r1c1_add_row(rBuffer, aRef); - r1c1_add_col(rBuffer, aRef); + r1c1_add_row(rBuffer, rRef, aAbsRef); + r1c1_add_col(rBuffer, rRef, aAbsRef); } virtual void makeExternalRefStr( OUStringBuffer& rBuffer, const ScCompiler& rCompiler, @@ -1617,47 +1610,46 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL if (aTabNames.empty()) return; - ScComplexRefData aRef(rRef); - aRef.CalcAbsIfRel(rCompiler.GetPos()); + ScRange aAbsRef = rRef.toAbs(rCompiler.GetPos()); ConventionXL::makeExternalDocStr( rBuffer, *pFullName, rCompiler.GetEncodeUrlMode() == ScCompiler::ENCODE_ALWAYS); - ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aRef); + ConventionXL::makeExternalTabNameRange(rBuffer, rTabName, aTabNames, aAbsRef); rBuffer.append(sal_Unicode('!')); - if (aRef.Ref2.IsColDeleted() || aRef.Ref2.IsRowDeleted()) + if (!ValidCol(aAbsRef.aEnd.Col()) || !ValidRow(aAbsRef.aEnd.Row())) { rBuffer.append(ScGlobal::GetRscString(STR_NO_REF_TABLE)); return; } - if (aRef.Ref1.nCol == 0 && aRef.Ref2.nCol >= MAXCOL) + if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= MAXCOL) { - r1c1_add_row(rBuffer, rRef.Ref1); - if (rRef.Ref1.nRow != rRef.Ref2.nRow || rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel()) + r1c1_add_row(rBuffer, rRef.Ref1, aAbsRef.aStart); + if (aAbsRef.aStart.Row() != aAbsRef.aEnd.Row() || rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel()) { rBuffer.append (sal_Unicode(':')); - r1c1_add_row(rBuffer, rRef.Ref2); + r1c1_add_row(rBuffer, rRef.Ref2, aAbsRef.aEnd); } return; } - if (aRef.Ref1.nRow == 0 && aRef.Ref2.nRow >= MAXROW) + if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= MAXROW) { - r1c1_add_col(rBuffer, aRef.Ref1); - if (aRef.Ref1.nCol != aRef.Ref2.nCol || aRef.Ref1.IsColRel() != aRef.Ref2.IsColRel()) + r1c1_add_col(rBuffer, rRef.Ref1, aAbsRef.aStart); + if (aAbsRef.aStart.Col() != aAbsRef.aEnd.Col() || rRef.Ref1.IsColRel() != rRef.Ref2.IsColRel()) { rBuffer.append (sal_Unicode(':')); - r1c1_add_col(rBuffer, aRef.Ref2); + r1c1_add_col(rBuffer, rRef.Ref2, aAbsRef.aEnd); } return; } - r1c1_add_row(rBuffer, aRef.Ref1); - r1c1_add_col(rBuffer, aRef.Ref1); + r1c1_add_row(rBuffer, rRef.Ref1, aAbsRef.aStart); + r1c1_add_col(rBuffer, rRef.Ref1, aAbsRef.aStart); rBuffer.append (sal_Unicode (':')); - r1c1_add_row(rBuffer, aRef.Ref2); - r1c1_add_col(rBuffer, aRef.Ref2); + r1c1_add_row(rBuffer, rRef.Ref2, aAbsRef.aEnd); + r1c1_add_col(rBuffer, rRef.Ref2, aAbsRef.aEnd); } virtual sal_uLong getCharTableFlags( sal_Unicode c, sal_Unicode cLast ) const @@ -4209,8 +4201,10 @@ ScRangeData* ScCompiler::UpdateReference(UpdateRefMode eUpdateRefMode, while( (t = static_cast<ScToken*>(pArr->GetNextColRowName())) != NULL ) { ScSingleRefData& rRef = t->GetSingleRef(); - rRef.CalcAbsIfRel( rOldPos ); - ScAddress aNewRef( rRef.nCol + nDx, rRef.nRow + nDy, rRef.nTab + nDz ); + ScAddress aNewRef = rRef.toAbs(rOldPos); + aNewRef.IncCol(nDx); + aNewRef.IncRow(nDy); + aNewRef.IncTab(nDz); if ( r.In( aNewRef ) ) { // yes, this is URM_MOVE if ( ScRefUpdate::Update( pDoc, URM_MOVE, aPos, diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 6164e89..209c5ac 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -7559,10 +7559,10 @@ void ScInterpreter::ScOffset() String aTabName; ScSingleRefData aRef; PopExternalSingleRef(nFileId, aTabName, aRef); - aRef.CalcAbsIfRel(aPos); - nCol1 = aRef.nCol; - nRow1 = aRef.nRow; - nTab1 = aRef.nTab; + ScAddress aAbsRef = aRef.toAbs(aPos); + nCol1 = aAbsRef.Col(); + nRow1 = aAbsRef.Row(); + nTab1 = aAbsRef.Tab(); if (nParamCount == 3 || (nColNew < 0 && nRowNew < 0)) { diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 8688b12..d45cc2a 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -1462,8 +1462,7 @@ void ScInterpreter::PopExternalSingleRef( return; } - rRef.CalcAbsIfRel(aPos); - ScAddress aAddr(rRef.nCol, rRef.nRow, rRef.nTab); + ScAddress aAddr = rRef.toAbs(aPos); ScExternalRefCache::CellFormat aFmt; ScExternalRefCache::TokenRef xNew = pRefMgr->getSingleRefToken( rFileId, rTabName, aAddr, &aPos, NULL, &aFmt); @@ -1561,9 +1560,7 @@ void ScInterpreter::GetExternalDoubleRef( } ScComplexRefData aData(rData); - aData.CalcAbsIfRel(aPos); - ScRange aRange(aData.Ref1.nCol, aData.Ref1.nRow, aData.Ref1.nTab, - aData.Ref2.nCol, aData.Ref2.nRow, aData.Ref2.nTab); + ScRange aRange = aData.toAbs(aPos); ScExternalRefCache::TokenArrayRef pArray = pRefMgr->getDoubleRefTokens( nFileId, rTabName, aRange, &aPos); diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx index fa479d0..aaca903 100644 --- a/sc/source/core/tool/refdata.cxx +++ b/sc/source/core/tool/refdata.cxx @@ -43,6 +43,24 @@ ScAddress ScSingleRefData::toAbs( const ScAddress& rPos ) const return ScAddress(nRetCol, nRetRow, nRetTab); } +void ScSingleRefData::SetAddress( const ScAddress& rAddr, const ScAddress& rPos ) +{ + if (Flags.bColRel) + nRelCol = rAddr.Col() - rPos.Col(); + else + nCol = rAddr.Col(); + + if (Flags.bRowRel) + nRelRow = rAddr.Row() - rPos.Row(); + else + nRow = rAddr.Row(); + + if (Flags.bTabRel) + nRelTab = rAddr.Tab() - rPos.Tab(); + else + nTab = rAddr.Tab(); +} + void ScSingleRefData::CalcAbsIfRel( const ScAddress& rPos ) { if ( Flags.bColRel ) diff --git a/sc/source/filter/excel/xeformula.cxx b/sc/source/filter/excel/xeformula.cxx index 7065d10..97a11cb 100644 --- a/sc/source/filter/excel/xeformula.cxx +++ b/sc/source/filter/excel/xeformula.cxx @@ -1817,23 +1817,24 @@ void XclExpFmlaCompImpl::ConvertRefData( if( mxData->mpScBasePos ) { // *** reference position exists (cell, matrix) - convert to absolute *** - rRefData.CalcAbsIfRel( *mxData->mpScBasePos ); + ScAddress aAbs = rRefData.toAbs(*mxData->mpScBasePos); // convert column index - SCsCOL& rnScCol = rRefData.nCol; - if( bTruncMaxCol && (rnScCol == mnMaxScCol) ) - rnScCol = mnMaxAbsCol; - else if( (rnScCol < 0) || (rnScCol > mnMaxAbsCol) ) - rRefData.SetColDeleted( sal_True ); - rXclPos.mnCol = static_cast< sal_uInt16 >( rnScCol ) & mnMaxColMask; + if (bTruncMaxCol && (aAbs.Col() == mnMaxScCol)) + aAbs.SetCol(mnMaxAbsCol); + else if ((aAbs.Col() < 0) || (aAbs.Col() > mnMaxAbsCol)) + rRefData.SetColDeleted(true); + rXclPos.mnCol = static_cast<sal_uInt16>(aAbs.Col()) & mnMaxColMask; // convert row index - SCsROW& rnScRow = rRefData.nRow; - if( bTruncMaxRow && (rnScRow == mnMaxScRow) ) - rnScRow = mnMaxAbsRow; - else if( (rnScRow < 0) || (rnScRow > mnMaxAbsRow) ) - rRefData.SetRowDeleted( sal_True ); - rXclPos.mnRow = static_cast< sal_uInt32 >( rnScRow ) & mnMaxRowMask; + if (bTruncMaxRow && (aAbs.Row() == mnMaxScRow)) + aAbs.SetRow(mnMaxAbsRow); + else if ((aAbs.Row() < 0) || (aAbs.Row() > mnMaxAbsRow)) + rRefData.SetRowDeleted(true); + rXclPos.mnRow = static_cast<sal_uInt32>(aAbs.Row()) & mnMaxRowMask; + + // Update the reference. + rRefData.SetAddress(aAbs, *mxData->mpScBasePos); } else { diff --git a/sc/source/ui/miscdlgs/anyrefdg.cxx b/sc/source/ui/miscdlgs/anyrefdg.cxx index ab3b534..8a3b5e3 100644 --- a/sc/source/ui/miscdlgs/anyrefdg.cxx +++ b/sc/source/ui/miscdlgs/anyrefdg.cxx @@ -210,15 +210,12 @@ void ScFormulaReferenceHelper::ShowFormulaReference( const XubString& rStr ) if(bDoubleRef) { ScComplexRefData aRef( pToken->GetDoubleRef() ); - aRef.CalcAbsIfRel( aPos ); - aRange.aStart.Set( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab ); - aRange.aEnd.Set( aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab ); + aRange = aRef.toAbs(aPos); } else { ScSingleRefData aRef( pToken->GetSingleRef() ); - aRef.CalcAbsIfRel( aPos ); - aRange.aStart.Set( aRef.nCol, aRef.nRow, aRef.nTab ); + aRange.aStart = aRef.toAbs(aPos); aRange.aEnd = aRange.aStart; } ColorData aColName=ScRangeFindList::GetColorName(nIndex++); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits