diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-07-15 22:51:29 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-07-24 23:29:22 -0400 |
commit | c54616f62bc70a9d39abf8837a9d7c3031c80a41 (patch) | |
tree | ee05fa09b4d5769a9e4c0e056df3617907c46a7d | |
parent | f9856df0c9f16cd80a3a6f93f744d4df44457611 (diff) |
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
-rw-r--r-- | sc/inc/address.hxx | 8 | ||||
-rw-r--r-- | sc/inc/refdata.hxx | 1 | ||||
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 202 | ||||
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 8 | ||||
-rw-r--r-- | sc/source/core/tool/interpr4.cxx | 7 | ||||
-rw-r--r-- | sc/source/core/tool/refdata.cxx | 18 | ||||
-rw-r--r-- | sc/source/filter/excel/xeformula.cxx | 27 | ||||
-rw-r--r-- | sc/source/ui/miscdlgs/anyrefdg.cxx | 7 |
8 files changed, 147 insertions, 131 deletions
diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx index 2f5956546393..84c62cb57fa1 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 0eef078103e6..d79590cf8988 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 1fd1cf6ef3e3..597028b152ef 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 e01b512aa77b..6b17449a1400 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -7431,10 +7431,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 49ee0f52b39d..08a607109156 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -1432,8 +1432,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); @@ -1531,9 +1530,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 fa479d04a441..aaca90361d7b 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 7065d10db88d..97a11cb71dad 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 f060cc7ce8a4..69f6f535cd3c 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++); |