sc/inc/document.hxx | 2 sc/inc/refdata.hxx | 42 ++--- sc/source/core/data/conditio.cxx | 2 sc/source/core/data/documen4.cxx | 11 - sc/source/core/data/formulacell.cxx | 70 ++++----- sc/source/core/data/table1.cxx | 1 sc/source/core/tool/compiler.cxx | 6 sc/source/core/tool/interpr1.cxx | 12 - sc/source/core/tool/rangenam.cxx | 54 +++++-- sc/source/core/tool/refdata.cxx | 234 +++++++++++-------------------- sc/source/core/tool/reftokenhelper.cxx | 5 sc/source/core/tool/token.cxx | 15 + sc/source/filter/excel/excform.cxx | 29 +-- sc/source/filter/excel/excform8.cxx | 41 ++--- sc/source/filter/excel/xeformula.cxx | 15 + sc/source/filter/excel/xelink.cxx | 4 sc/source/filter/qpro/qproform.cxx | 2 sc/source/ui/docshell/externalrefmgr.cxx | 4 sc/source/ui/unoobj/chart2uno.cxx | 8 - sc/source/ui/unoobj/tokenuno.cxx | 4 20 files changed, 262 insertions(+), 299 deletions(-)
New commits: commit 3084d046891f78c61747ae16996c98b63dd2a10e Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Jul 30 21:54:00 2013 -0400 Now the reference object no longer stores both absolute and relative. This is exactly what we needed. Change-Id: I0e8d3064d1ea52c8d502d89f322b41435284d717 diff --git a/sc/inc/refdata.hxx b/sc/inc/refdata.hxx index 0d077ce..2d94299 100644 --- a/sc/inc/refdata.hxx +++ b/sc/inc/refdata.hxx @@ -29,12 +29,9 @@ struct SC_DLLPUBLIC ScSingleRefData { private: - SCsCOL nCol; ///< Absolute values - SCsROW nRow; - SCsTAB nTab; - SCsCOL nRelCol; ///< Values relative to the position - SCsROW nRelRow; - SCsTAB nRelTab; + SCCOL mnCol; + SCROW mnRow; + SCTAB mnTab; union { diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx index dec9683..d830be9 100644 --- a/sc/source/core/tool/refdata.cxx +++ b/sc/source/core/tool/refdata.cxx @@ -27,9 +27,9 @@ void ScSingleRefData::InitAddress( const ScAddress& rAdr ) void ScSingleRefData::InitAddress( SCCOL nColP, SCROW nRowP, SCTAB nTabP ) { InitFlags(); - nCol = nColP; - nRow = nRowP; - nTab = nTabP; + mnCol = nColP; + mnRow = nRowP; + mnTab = nTabP; } void ScSingleRefData::InitAddressRel( const ScAddress& rAdr, const ScAddress& rPos ) @@ -48,66 +48,57 @@ sal_uInt8 ScSingleRefData::FlagValue() const void ScSingleRefData::SetAbsCol( SCCOL nVal ) { Flags.bColRel = false; - nCol = nVal; + mnCol = nVal; } void ScSingleRefData::SetRelCol( SCCOL nVal ) { Flags.bColRel = true; - nRelCol = nVal; + mnCol = nVal; } void ScSingleRefData::IncCol( SCCOL nInc ) { - if (Flags.bColRel) - nRelCol += nInc; - else - nCol += nInc; + mnCol += nInc; } void ScSingleRefData::SetAbsRow( SCROW nVal ) { Flags.bRowRel = false; - nRow = nVal; + mnRow = nVal; } void ScSingleRefData::SetRelRow( SCROW nVal ) { Flags.bRowRel = true; - nRelRow = nVal; + mnRow = nVal; } void ScSingleRefData::IncRow( SCROW nInc ) { - if (Flags.bRowRel) - nRelRow += nInc; - else - nRow += nInc; + mnRow += nInc; } void ScSingleRefData::SetAbsTab( SCTAB nVal ) { Flags.bTabRel = false; - nTab = nVal; + mnTab = nVal; } void ScSingleRefData::SetRelTab( SCTAB nVal ) { Flags.bTabRel = true; - nRelTab = nVal; + mnTab = nVal; } void ScSingleRefData::IncTab( SCTAB nInc ) { - if (Flags.bTabRel) - nRelTab += nInc; - else - nTab += nInc; + mnTab += nInc; } void ScSingleRefData::SetColDeleted( bool bVal ) { - Flags.bColDeleted = (bVal ? true : false ); + Flags.bColDeleted = bVal; } bool ScSingleRefData::IsColDeleted() const @@ -117,7 +108,7 @@ bool ScSingleRefData::IsColDeleted() const void ScSingleRefData::SetRowDeleted( bool bVal ) { - Flags.bRowDeleted = (bVal ? true : false ); + Flags.bRowDeleted = bVal; } bool ScSingleRefData::IsRowDeleted() const @@ -127,7 +118,7 @@ bool ScSingleRefData::IsRowDeleted() const void ScSingleRefData::SetTabDeleted( bool bVal ) { - Flags.bTabDeleted = (bVal ? true : false ); + Flags.bTabDeleted = bVal; } bool ScSingleRefData::IsTabDeleted() const @@ -149,12 +140,12 @@ bool ScSingleRefData::ColValid() const { if (Flags.bColRel) { - if (nRelCol < -MAXCOL || MAXCOL < nRelCol) + if (mnCol < -MAXCOL || MAXCOL < mnCol) return false; } else { - if (nCol < 0 || MAXCOL < nCol) + if (mnCol < 0 || MAXCOL < mnCol) return false; } @@ -165,12 +156,12 @@ bool ScSingleRefData::RowValid() const { if (Flags.bRowRel) { - if (nRelRow < -MAXROW || MAXROW < nRelRow) + if (mnRow < -MAXROW || MAXROW < mnRow) return false; } else { - if (nRow < 0 || MAXROW < nRow) + if (mnRow < 0 || MAXROW < mnRow) return false; } @@ -181,12 +172,12 @@ bool ScSingleRefData::TabValid() const { if (Flags.bTabRel) { - if (nRelTab < -MAXTAB || MAXTAB < nRelTab) + if (mnTab < -MAXTAB || MAXTAB < mnTab) return false; } else { - if (nTab < 0 || MAXTAB < nTab) + if (mnTab < 0 || MAXTAB < mnTab) return false; } @@ -195,14 +186,14 @@ bool ScSingleRefData::TabValid() const bool ScSingleRefData::ValidExternal() const { - return ColValid() && RowValid() && nTab == -1; + return ColValid() && RowValid() && mnTab == -1; } ScAddress ScSingleRefData::toAbs( const ScAddress& rPos ) const { - SCCOL nRetCol = Flags.bColRel ? nRelCol + rPos.Col() : nCol; - SCROW nRetRow = Flags.bRowRel ? nRelRow + rPos.Row() : nRow; - SCTAB nRetTab = Flags.bTabRel ? nRelTab + rPos.Tab() : nTab; + SCCOL nRetCol = Flags.bColRel ? mnCol + rPos.Col() : mnCol; + SCROW nRetRow = Flags.bRowRel ? mnRow + rPos.Row() : mnRow; + SCTAB nRetTab = Flags.bTabRel ? mnTab + rPos.Tab() : mnTab; ScAddress aAbs(ScAddress::INITIALIZE_INVALID); @@ -221,48 +212,45 @@ ScAddress ScSingleRefData::toAbs( const ScAddress& rPos ) const void ScSingleRefData::SetAddress( const ScAddress& rAddr, const ScAddress& rPos ) { if (Flags.bColRel) - nRelCol = rAddr.Col() - rPos.Col(); + mnCol = rAddr.Col() - rPos.Col(); else - nCol = rAddr.Col(); + mnCol = rAddr.Col(); if (Flags.bRowRel) - nRelRow = rAddr.Row() - rPos.Row(); + mnRow = rAddr.Row() - rPos.Row(); else - nRow = rAddr.Row(); + mnRow = rAddr.Row(); if (Flags.bTabRel) - nRelTab = rAddr.Tab() - rPos.Tab(); + mnTab = rAddr.Tab() - rPos.Tab(); else - nTab = rAddr.Tab(); + mnTab = rAddr.Tab(); } SCROW ScSingleRefData::Row() const { if (Flags.bRowDeleted) return -1; - return Flags.bRowRel ? nRelRow : nRow; + return mnRow; } SCCOL ScSingleRefData::Col() const { if (Flags.bColDeleted) return -1; - return Flags.bColRel ? nRelCol : nCol; + return mnCol; } SCTAB ScSingleRefData::Tab() const { if (Flags.bTabDeleted) return -1; - return Flags.bTabRel ? nRelTab : nTab; + return mnTab; } bool ScSingleRefData::operator==( const ScSingleRefData& r ) const { - return mnFlagValue == r.mnFlagValue && - (Flags.bColRel ? nRelCol == r.nRelCol : nCol == r.nCol) && - (Flags.bRowRel ? nRelRow == r.nRelRow : nRow == r.nRow) && - (Flags.bTabRel ? nRelTab == r.nRelTab : nTab == r.nTab); + return mnFlagValue == r.mnFlagValue && mnCol == r.mnCol && mnRow == r.mnRow && mnTab == r.mnTab; } bool ScSingleRefData::operator!=( const ScSingleRefData& r ) const @@ -283,8 +271,7 @@ void ScSingleRefData::Dump( int nIndent ) const cout << aIndent << "deleted column: " << (IsColDeleted()?"yes":"no") << " row : " << (IsRowDeleted()?"yes":"no") << " sheet: " << (IsTabDeleted()?"yes":"no") << endl; - cout << aIndent << "absolute pos column: " << nCol << " row: " << nRow << " sheet: " << nTab << endl; - cout << aIndent << "relative pos column: " << nRelCol << " row: " << nRelRow << " sheet: " << nRelTab << endl; + cout << aIndent << "column: " << mnCol << " row: " << mnRow << " sheet: " << mnTab << endl; cout << aIndent << "3d ref: " << (IsFlag3D()?"yes":"no") << endl; } #endif commit 47636ee905da7c0b61470ccd343cf57a2b6a5e1a Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Jul 30 21:36:50 2013 -0400 Clean this up a bit. Change-Id: Ia984c17eda507dc625e2b038818abd2d4e9e5103 diff --git a/sc/inc/refdata.hxx b/sc/inc/refdata.hxx index 10c7a63..0d077ce 100644 --- a/sc/inc/refdata.hxx +++ b/sc/inc/refdata.hxx @@ -62,12 +62,12 @@ public: void InitAddressRel( const ScAddress& rAdr, const ScAddress& rPos ); sal_uInt8 FlagValue() const; - inline void SetColRel( bool bVal ) { Flags.bColRel = (bVal ? true : false ); } - inline bool IsColRel() const{ return Flags.bColRel; } - inline void SetRowRel( bool bVal ) { Flags.bRowRel = (bVal ? true : false ); } - inline bool IsRowRel() const { return Flags.bRowRel; } - inline void SetTabRel( bool bVal ) { Flags.bTabRel = (bVal ? true : false ); } - inline bool IsTabRel() const { return Flags.bTabRel; } + void SetColRel( bool bVal ) { Flags.bColRel = bVal; } + bool IsColRel() const { return Flags.bColRel; } + void SetRowRel( bool bVal ) { Flags.bRowRel = bVal; } + bool IsRowRel() const { return Flags.bRowRel; } + void SetTabRel( bool bVal ) { Flags.bTabRel = bVal; } + bool IsTabRel() const { return Flags.bTabRel; } void SetAbsCol( SCCOL nVal ); void SetRelCol( SCCOL nVal ); @@ -87,10 +87,10 @@ public: bool IsTabDeleted() const; bool IsDeleted() const; - inline void SetFlag3D( bool bVal ) { Flags.bFlag3D = (bVal ? true : false ); } - inline bool IsFlag3D() const { return Flags.bFlag3D; } - inline void SetRelName( bool bVal ) { Flags.bRelName = (bVal ? true : false ); } - inline bool IsRelName() const { return Flags.bRelName; } + void SetFlag3D( bool bVal ) { Flags.bFlag3D = bVal; } + bool IsFlag3D() const { return Flags.bFlag3D; } + void SetRelName( bool bVal ) { Flags.bRelName = bVal; } + bool IsRelName() const { return Flags.bRelName; } bool Valid() const; bool ColValid() const; @@ -105,8 +105,8 @@ public: SCCOL Col() const; SCTAB Tab() const; - bool operator==( const ScSingleRefData& ) const; - bool operator!=( const ScSingleRefData& ) const; + bool operator==( const ScSingleRefData& ) const; + bool operator!=( const ScSingleRefData& ) const; #if DEBUG_FORMULA_COMPILER void Dump( int nIndent = 0 ) const; commit 01c1638f30069d29574b70a5dbbea30e4846c256 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Jul 30 21:27:21 2013 -0400 Now nobody accesses reference members directly. Make them private. Change-Id: If4499dbee52532cc8a95c380bbe840719fe9279b diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index ea2d65f..9c30744 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -647,7 +647,7 @@ public: SC_DLLPUBLIC ScExternalRefManager* GetExternalRefManager() const; bool IsInExternalReferenceMarking() const; void MarkUsedExternalReferences(); - bool MarkUsedExternalReferences( ScTokenArray & rArr ); + bool MarkUsedExternalReferences( ScTokenArray& rArr, const ScAddress& rPos ); /** Returns the pool containing external formula parsers. Creates the pool on first call. */ diff --git a/sc/inc/refdata.hxx b/sc/inc/refdata.hxx index 653d1a0..10c7a63 100644 --- a/sc/inc/refdata.hxx +++ b/sc/inc/refdata.hxx @@ -28,6 +28,7 @@ /// Single reference (one address) into the sheet struct SC_DLLPUBLIC ScSingleRefData { +private: SCsCOL nCol; ///< Absolute values SCsROW nRow; SCsTAB nTab; @@ -51,6 +52,7 @@ struct SC_DLLPUBLIC ScSingleRefData } Flags; }; +public: /// No default ctor, because used in ScRawToken union, set InitFlags! inline void InitFlags() { mnFlagValue = 0; } ///< all FALSE /// InitAddress: InitFlags and set address @@ -58,6 +60,8 @@ struct SC_DLLPUBLIC ScSingleRefData void InitAddress( SCCOL nCol, SCROW nRow, SCTAB nTab ); /// InitAddressRel: InitFlags and set address, everything relative to rPos void InitAddressRel( const ScAddress& rAdr, const ScAddress& rPos ); + sal_uInt8 FlagValue() const; + inline void SetColRel( bool bVal ) { Flags.bColRel = (bVal ? true : false ); } inline bool IsColRel() const{ return Flags.bColRel; } inline void SetRowRel( bool bVal ) { Flags.bRowRel = (bVal ? true : false ); } @@ -89,6 +93,9 @@ struct SC_DLLPUBLIC ScSingleRefData inline bool IsRelName() const { return Flags.bRelName; } bool Valid() const; + bool ColValid() const; + bool RowValid() const; + bool TabValid() const; /// In external references nTab is -1 bool ValidExternal() const; @@ -141,8 +148,6 @@ struct ScComplexRefData SC_DLLPUBLIC ScRange toAbs( const ScAddress& rPos ) const; void SetRange( const ScRange& rRange, const ScAddress& rPos ); - /// Absolute references have to be up-to-date when calling this! - void PutInOrder(); inline bool operator==( const ScComplexRefData& r ) const { return Ref1 == r.Ref1 && Ref2 == r.Ref2; } /** Enlarge range if reference passed is not within existing range. diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx index c0939ff..993058e 100644 --- a/sc/source/core/data/conditio.cxx +++ b/sc/source/core/data/conditio.cxx @@ -1476,7 +1476,7 @@ bool ScConditionEntry::MarkUsedExternalReferences() const { ScTokenArray* pFormula = nPass ? pFormula2 : pFormula1; if (pFormula) - bAllMarked = mpDoc->MarkUsedExternalReferences( *pFormula); + bAllMarked = mpDoc->MarkUsedExternalReferences(*pFormula, aSrcPos); } return bAllMarked; } diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 38f012a..6abc607 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -295,7 +295,7 @@ void ScDocument::InsertTableOp(const ScTabOpParam& rParam, // Mehrfachopera namespace { -bool setCacheTableReferenced(ScToken& rToken, ScExternalRefManager& rRefMgr) +bool setCacheTableReferenced(ScToken& rToken, ScExternalRefManager& rRefMgr, const ScAddress& rPos) { switch (rToken.GetType()) { @@ -305,7 +305,8 @@ bool setCacheTableReferenced(ScToken& rToken, ScExternalRefManager& rRefMgr) case svExternalDoubleRef: { const ScComplexRefData& rRef = rToken.GetDoubleRef(); - size_t nSheets = rRef.Ref2.nTab - rRef.Ref1.nTab + 1; + ScRange aAbs = rRef.toAbs(rPos); + size_t nSheets = aAbs.aEnd.Tab() - aAbs.aStart.Tab() + 1; return rRefMgr.setCacheTableReferenced( rToken.GetIndex(), rToken.GetString(), nSheets); } @@ -322,7 +323,7 @@ bool setCacheTableReferenced(ScToken& rToken, ScExternalRefManager& rRefMgr) } -bool ScDocument::MarkUsedExternalReferences( ScTokenArray & rArr ) +bool ScDocument::MarkUsedExternalReferences( ScTokenArray& rArr, const ScAddress& rPos ) { if (!rArr.GetLen()) return false; @@ -338,7 +339,7 @@ bool ScDocument::MarkUsedExternalReferences( ScTokenArray & rArr ) if (!pRefMgr) pRefMgr = GetExternalRefManager(); - bAllMarked = setCacheTableReferenced(*t, *pRefMgr); + bAllMarked = setCacheTableReferenced(*t, *pRefMgr, rPos); } else if (t->GetType() == svIndex) { @@ -357,7 +358,7 @@ bool ScDocument::MarkUsedExternalReferences( ScTokenArray & rArr ) if (!pRefMgr) pRefMgr = GetExternalRefManager(); - bAllMarked = setCacheTableReferenced(*t, *pRefMgr); + bAllMarked = setCacheTableReferenced(*t, *pRefMgr, rPos); } } } diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index baec27d..0ad7cb6 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -913,7 +913,7 @@ void ScFormulaCell::CalcAfterLoad() bool ScFormulaCell::MarkUsedExternalReferences() { - return pCode && pDocument->MarkUsedExternalReferences( *pCode); + return pCode && pDocument->MarkUsedExternalReferences(*pCode, aPos); } @@ -2630,56 +2630,56 @@ void ScFormulaCell::UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt, SCTAB nTab void ScFormulaCell::UpdateInsertTabAbs(SCTAB nTable) { - if( !pDocument->IsClipOrUndo() ) + if (pDocument->IsClipOrUndo()) + return; + + pCode->Reset(); + ScToken* p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); + while (p) { - pCode->Reset(); - ScToken* p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); - while( p ) + ScSingleRefData& rRef1 = p->GetSingleRef(); + if (!rRef1.IsTabRel() && nTable <= rRef1.Tab()) + rRef1.IncTab(1); + if (p->GetType() == formula::svDoubleRef) { - ScSingleRefData& rRef1 = p->GetSingleRef(); - if( !rRef1.IsTabRel() && (SCsTAB) nTable <= rRef1.nTab ) - rRef1.nTab++; - if( p->GetType() == formula::svDoubleRef ) - { - ScSingleRefData& rRef2 = p->GetDoubleRef().Ref2; - if( !rRef2.IsTabRel() && (SCsTAB) nTable <= rRef2.nTab ) - rRef2.nTab++; - } - p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); + ScSingleRefData& rRef2 = p->GetDoubleRef().Ref2; + if (!rRef2.IsTabRel() && nTable <= rRef2.Tab()) + rRef2.IncTab(1); } + p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); } } bool ScFormulaCell::TestTabRefAbs(SCTAB nTable) { + if (pDocument->IsClipOrUndo()) + return false; + bool bRet = false; - if( !pDocument->IsClipOrUndo() ) + pCode->Reset(); + ScToken* p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); + while (p) { - pCode->Reset(); - ScToken* p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); - while( p ) + ScSingleRefData& rRef1 = p->GetSingleRef(); + if (!rRef1.IsTabRel()) { - ScSingleRefData& rRef1 = p->GetSingleRef(); - if( !rRef1.IsTabRel() ) + if (nTable != rRef1.Tab()) + bRet = true; + else if (nTable != aPos.Tab()) + rRef1.SetAbsTab(aPos.Tab()); + } + if (p->GetType() == formula::svDoubleRef) + { + ScSingleRefData& rRef2 = p->GetDoubleRef().Ref2; + if (!rRef2.IsTabRel()) { - if( (SCsTAB) nTable != rRef1.nTab ) + if(nTable != rRef2.Tab()) bRet = true; else if (nTable != aPos.Tab()) - rRef1.nTab = aPos.Tab(); - } - if( p->GetType() == formula::svDoubleRef ) - { - ScSingleRefData& rRef2 = p->GetDoubleRef().Ref2; - if( !rRef2.IsTabRel() ) - { - if( (SCsTAB) nTable != rRef2.nTab ) - bRet = true; - else if (nTable != aPos.Tab()) - rRef2.nTab = aPos.Tab(); - } + rRef2.SetAbsTab(aPos.Tab()); } - p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); } + p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); } return bRet; } diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx index b3d1d28..5f409ba 100644 --- a/sc/source/core/data/table1.cxx +++ b/sc/source/core/data/table1.cxx @@ -1464,7 +1464,6 @@ void ScTable::UpdateReference( iMax = MAXCOL; } - ScRange aRange = rCxt.maRange; UpdateRefMode eUpdateRefMode = rCxt.meMode; SCCOL nDx = rCxt.mnColDelta; SCROW nDy = rCxt.mnRowDelta; diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 55668cc..4d140ba 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -1068,8 +1068,8 @@ struct ConventionXL rDocName.Erase(); OUString aTmp; - if (rRef.IsTabDeleted() || - !rComp.GetDoc()->GetName( rRef.nTab, aTmp )) + ScAddress aAbs = rRef.toAbs(rComp.GetPos()); + if (rRef.IsTabDeleted() || !rComp.GetDoc()->GetName(aAbs.Tab(), aTmp)) { rTabName = ScGlobal::GetRscString( STR_NO_REF_TABLE ); return false; @@ -1320,7 +1320,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL return; } - if( aRef.Ref1.nRow == 0 && aRef.Ref2.nRow >= MAXROW ) + if (aAbs1.Row() == 0 && aAbs2.Row() >= MAXROW) { if (!aRef.Ref1.IsColRel()) rBuf.append(sal_Unicode( '$' )); diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index f9c3a4c..4fc860c 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -2571,14 +2571,14 @@ void ScInterpreter::ScCellExternal() SCCOL nCol; SCROW nRow; SCTAB nTab; - aRef.nTab = 0; // external ref has a tab index of -1, which SingleRefToVars() don't like. + aRef.SetAbsTab(0); // external ref has a tab index of -1, which SingleRefToVars() don't like. SingleRefToVars(aRef, nCol, nRow, nTab); if (nGlobalError) { PushIllegalParameter(); return; } - aRef.nTab = -1; // revert the value. + aRef.SetAbsTab(-1); // revert the value. ScCellKeywordTranslator::transKeyword(aInfoType, ScGlobal::GetLocale(), ocCell); ScExternalRefManager* pRefMgr = pDok->GetExternalRefManager(); @@ -4047,8 +4047,9 @@ void ScInterpreter::ScRows() String aTabName; ScComplexRefData aRef; PopExternalDoubleRef( nFileId, aTabName, aRef); - nVal += static_cast<sal_uLong>(aRef.Ref2.nTab - aRef.Ref1.nTab + 1) * - static_cast<sal_uLong>(aRef.Ref2.nRow - aRef.Ref1.nRow + 1); + ScRange aAbs = aRef.toAbs(aPos); + nVal += static_cast<sal_uLong>(aAbs.aEnd.Tab() - aAbs.aStart.Tab() + 1) * + static_cast<sal_uLong>(aAbs.aEnd.Row() - aAbs.aStart.Row() + 1); } break; default: @@ -4100,7 +4101,8 @@ void ScInterpreter::ScTables() String aTabName; ScComplexRefData aRef; PopExternalDoubleRef( nFileId, aTabName, aRef); - nVal += static_cast<sal_uLong>(aRef.Ref2.nTab - aRef.Ref1.nTab + 1); + ScRange aAbs = aRef.toAbs(aPos); + nVal += static_cast<sal_uLong>(aAbs.aEnd.Tab() - aAbs.aStart.Tab() + 1); } break; default: diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx index aae97ed..5df9813 100644 --- a/sc/source/core/tool/rangenam.cxx +++ b/sc/source/core/tool/rangenam.cxx @@ -548,22 +548,24 @@ void ScRangeData::ValidateTabRefs() while ( ( t = static_cast<ScToken*>(pCode->GetNextReference()) ) != NULL ) { ScSingleRefData& rRef1 = t->GetSingleRef(); + ScAddress aAbs = rRef1.toAbs(aPos); if ( rRef1.IsTabRel() && !rRef1.IsTabDeleted() ) { - if ( rRef1.nTab < nMinTab ) - nMinTab = rRef1.nTab; - if ( rRef1.nTab > nMaxTab ) - nMaxTab = rRef1.nTab; + if (aAbs.Tab() < nMinTab) + nMinTab = aAbs.Tab(); + if (aAbs.Tab() > nMaxTab) + nMaxTab = aAbs.Tab(); } if ( t->GetType() == svDoubleRef ) { ScSingleRefData& rRef2 = t->GetDoubleRef().Ref2; + aAbs = rRef2.toAbs(aPos); if ( rRef2.IsTabRel() && !rRef2.IsTabDeleted() ) { - if ( rRef2.nTab < nMinTab ) - nMinTab = rRef2.nTab; - if ( rRef2.nTab > nMaxTab ) - nMaxTab = rRef2.nTab; + if (aAbs.Tab() < nMinTab) + nMinTab = aAbs.Tab(); + if (aAbs.Tab() > nMaxTab) + nMaxTab = aAbs.Tab(); } } } @@ -575,19 +577,41 @@ void ScRangeData::ValidateTabRefs() // The formulas that use the name are not changed by this SCTAB nMove = nMinTab; + ScAddress aOldPos = aPos; aPos.SetTab( aPos.Tab() - nMove ); pCode->Reset(); while ( ( t = static_cast<ScToken*>(pCode->GetNextReference()) ) != NULL ) { - ScSingleRefData& rRef1 = t->GetSingleRef(); - if ( rRef1.IsTabRel() && !rRef1.IsTabDeleted() ) - rRef1.nTab = sal::static_int_cast<SCsTAB>( rRef1.nTab - nMove ); - if ( t->GetType() == svDoubleRef ) + switch (t->GetType()) { - ScSingleRefData& rRef2 = t->GetDoubleRef().Ref2; - if ( rRef2.IsTabRel() && !rRef2.IsTabDeleted() ) - rRef2.nTab = sal::static_int_cast<SCsTAB>( rRef2.nTab - nMove ); + case svSingleRef: + { + ScSingleRefData& rRef = t->GetSingleRef(); + if (!rRef.IsTabDeleted()) + { + ScAddress aAbs = rRef.toAbs(aOldPos); + rRef.SetAddress(aAbs, aPos); + } + } + break; + case svDoubleRef: + { + ScComplexRefData& rRef = t->GetDoubleRef(); + if (!rRef.Ref1.IsTabDeleted()) + { + ScAddress aAbs = rRef.Ref1.toAbs(aOldPos); + rRef.Ref1.SetAddress(aAbs, aPos); + } + if (!rRef.Ref2.IsTabDeleted()) + { + ScAddress aAbs = rRef.Ref2.toAbs(aOldPos); + rRef.Ref2.SetAddress(aAbs, aPos); + } + } + break; + default: + ; } } } diff --git a/sc/source/core/tool/refdata.cxx b/sc/source/core/tool/refdata.cxx index 5969c88..dec9683 100644 --- a/sc/source/core/tool/refdata.cxx +++ b/sc/source/core/tool/refdata.cxx @@ -40,6 +40,11 @@ void ScSingleRefData::InitAddressRel( const ScAddress& rAdr, const ScAddress& rP SetAddress(rAdr, rPos); } +sal_uInt8 ScSingleRefData::FlagValue() const +{ + return mnFlagValue; +} + void ScSingleRefData::SetAbsCol( SCCOL nVal ) { Flags.bColRel = false; @@ -137,16 +142,60 @@ bool ScSingleRefData::IsDeleted() const bool ScSingleRefData::Valid() const { - return nCol >= 0 && nCol <= MAXCOL && - nRow >= 0 && nRow <= MAXROW && - nTab >= 0 && nTab <= MAXTAB; + return ColValid() && RowValid() && TabValid(); +} + +bool ScSingleRefData::ColValid() const +{ + if (Flags.bColRel) + { + if (nRelCol < -MAXCOL || MAXCOL < nRelCol) + return false; + } + else + { + if (nCol < 0 || MAXCOL < nCol) + return false; + } + + return true; +} + +bool ScSingleRefData::RowValid() const +{ + if (Flags.bRowRel) + { + if (nRelRow < -MAXROW || MAXROW < nRelRow) + return false; + } + else + { + if (nRow < 0 || MAXROW < nRow) + return false; + } + + return true; +} + +bool ScSingleRefData::TabValid() const +{ + if (Flags.bTabRel) + { + if (nRelTab < -MAXTAB || MAXTAB < nRelTab) + return false; + } + else + { + if (nTab < 0 || MAXTAB < nTab) + return false; + } + + return true; } bool ScSingleRefData::ValidExternal() const { - return nCol >= 0 && nCol <= MAXCOL && - nRow >= 0 && nRow <= MAXROW && - nTab == -1; + return ColValid() && RowValid() && nTab == -1; } ScAddress ScSingleRefData::toAbs( const ScAddress& rPos ) const @@ -240,103 +289,6 @@ void ScSingleRefData::Dump( int nIndent ) const } #endif -static void lcl_putInOrder( ScSingleRefData & rRef1, ScSingleRefData & rRef2 ) -{ - SCCOL nCol1, nCol2; - SCROW nRow1, nRow2; - SCTAB nTab1, nTab2; - bool bTmp; - sal_uInt8 nRelState1, nRelState2; - if ( rRef1.Flags.bRelName ) - nRelState1 = - ((rRef1.Flags.bTabRel & 0x01) << 2) - | ((rRef1.Flags.bRowRel & 0x01) << 1) - | ((rRef1.Flags.bColRel & 0x01)); - else - nRelState1 = 0; - if ( rRef2.Flags.bRelName ) - nRelState2 = - ((rRef2.Flags.bTabRel & 0x01) << 2) - | ((rRef2.Flags.bRowRel & 0x01) << 1) - | ((rRef2.Flags.bColRel & 0x01)); - else - nRelState2 = 0; - if ( (nCol1 = rRef1.nCol) > (nCol2 = rRef2.nCol) ) - { - rRef1.nCol = nCol2; - rRef2.nCol = nCol1; - nCol1 = rRef1.nRelCol; - rRef1.nRelCol = rRef2.nRelCol; - rRef2.nRelCol = nCol1; - if ( rRef1.Flags.bRelName && rRef1.Flags.bColRel ) - nRelState2 |= 1; - else - nRelState2 &= ~1; - if ( rRef2.Flags.bRelName && rRef2.Flags.bColRel ) - nRelState1 |= 1; - else - nRelState1 &= ~1; - bTmp = rRef1.Flags.bColRel; - rRef1.Flags.bColRel = rRef2.Flags.bColRel; - rRef2.Flags.bColRel = bTmp; - bTmp = rRef1.Flags.bColDeleted; - rRef1.Flags.bColDeleted = rRef2.Flags.bColDeleted; - rRef2.Flags.bColDeleted = bTmp; - } - if ( (nRow1 = rRef1.nRow) > (nRow2 = rRef2.nRow) ) - { - rRef1.nRow = nRow2; - rRef2.nRow = nRow1; - nRow1 = rRef1.nRelRow; - rRef1.nRelRow = rRef2.nRelRow; - rRef2.nRelRow = nRow1; - if ( rRef1.Flags.bRelName && rRef1.Flags.bRowRel ) - nRelState2 |= 2; - else - nRelState2 &= ~2; - if ( rRef2.Flags.bRelName && rRef2.Flags.bRowRel ) - nRelState1 |= 2; - else - nRelState1 &= ~2; - bTmp = rRef1.Flags.bRowRel; - rRef1.Flags.bRowRel = rRef2.Flags.bRowRel; - rRef2.Flags.bRowRel = bTmp; - bTmp = rRef1.Flags.bRowDeleted; - rRef1.Flags.bRowDeleted = rRef2.Flags.bRowDeleted; - rRef2.Flags.bRowDeleted = bTmp; - } - if ( (nTab1 = rRef1.nTab) > (nTab2 = rRef2.nTab) ) - { - rRef1.nTab = nTab2; - rRef2.nTab = nTab1; - nTab1 = rRef1.nRelTab; - rRef1.nRelTab = rRef2.nRelTab; - rRef2.nRelTab = nTab1; - if ( rRef1.Flags.bRelName && rRef1.Flags.bTabRel ) - nRelState2 |= 4; - else - nRelState2 &= ~4; - if ( rRef2.Flags.bRelName && rRef2.Flags.bTabRel ) - nRelState1 |= 4; - else - nRelState1 &= ~4; - bTmp = rRef1.Flags.bTabRel; - rRef1.Flags.bTabRel = rRef2.Flags.bTabRel; - rRef2.Flags.bTabRel = bTmp; - bTmp = rRef1.Flags.bTabDeleted; - rRef1.Flags.bTabDeleted = rRef2.Flags.bTabDeleted; - rRef2.Flags.bTabDeleted = bTmp; - } - rRef1.Flags.bRelName = ( nRelState1 ? sal_True : false ); - rRef2.Flags.bRelName = ( nRelState2 ? sal_True : false ); -} - - -void ScComplexRefData::PutInOrder() -{ - lcl_putInOrder( Ref1, Ref2); -} - ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const ScAddress & rPos ) { ScRange aAbsRange = toAbs(rPos); @@ -383,10 +335,7 @@ bool ScComplexRefData::Valid() const bool ScComplexRefData::ValidExternal() const { - return Ref1.ValidExternal() && - Ref2.nCol >= 0 && Ref2.nCol <= MAXCOL && - Ref2.nRow >= 0 && Ref2.nRow <= MAXROW && - Ref2.nTab >= Ref1.nTab; + return Ref1.ValidExternal() && Ref2.ColValid() && Ref2.RowValid() && Ref1.Tab() <= Ref2.Tab(); } ScRange ScComplexRefData::toAbs( const ScAddress& rPos ) const diff --git a/sc/source/core/tool/reftokenhelper.cxx b/sc/source/core/tool/reftokenhelper.cxx index 6b8d288..e6687ba 100644 --- a/sc/source/core/tool/reftokenhelper.cxx +++ b/sc/source/core/tool/reftokenhelper.cxx @@ -352,11 +352,12 @@ private: if (!ScRefTokenHelper::getDoubleRefDataFromToken(aOldData, pOldToken)) continue; - if (aData.Ref1.nTab != aOldData.Ref1.nTab || aData.Ref2.nTab != aOldData.Ref2.nTab) + ScRange aOld = aOldData.toAbs(rPos), aNew = aData.toAbs(rPos); + + if (aNew.aStart.Tab() != aOld.aStart.Tab() || aNew.aEnd.Tab() != aOld.aEnd.Tab()) // Sheet ranges differ. continue; - ScRange aOld = aOldData.toAbs(rPos), aNew = aData.toAbs(rPos); if (aOld.In(aNew)) // This new range is part of an existing range. Skip it. return; diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 96e389f..83094d2 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -511,7 +511,7 @@ bool ScToken::TextEqual( const FormulaToken& _rToken ) const // memcmp doesn't work because of the alignment byte after bFlags. // After SmartRelAbs only absolute parts have to be compared. - return aRange1 == aRange2 && aTemp1.Ref1.mnFlagValue == aTemp2.Ref1.mnFlagValue && aTemp1.Ref2.mnFlagValue == aTemp2.Ref2.mnFlagValue; + return aRange1 == aRange2 && aTemp1.Ref1.FlagValue() == aTemp2.Ref1.FlagValue() && aTemp1.Ref2.FlagValue() == aTemp2.Ref2.FlagValue(); } else return *this == _rToken; // else normal operator== @@ -1226,7 +1226,8 @@ bool ScTokenArray::AddFormulaToken(const com::sun::star::sheet::FormulaToken& _a lcl_ExternalRefToCalc( aComplRef.Ref1, aApiCRef.Reference1 ); lcl_ExternalRefToCalc( aComplRef.Ref2, aApiCRef.Reference2 ); // NOTE: This assumes that cached sheets are in consecutive order! - aComplRef.Ref2.nTab = aComplRef.Ref1.nTab + static_cast<SCsTAB>(aApiCRef.Reference2.Sheet - aApiCRef.Reference1.Sheet); + aComplRef.Ref2.SetAbsTab( + aComplRef.Ref1.Tab() + static_cast<SCTAB>(aApiCRef.Reference2.Sheet - aApiCRef.Reference1.Sheet)); AddExternalDoubleReference( nFileId, aTabName, aComplRef ); } else @@ -1384,9 +1385,9 @@ size_t HashSingleRef( const ScSingleRefData& rRef ) { size_t nVal = 0; - nVal += rRef.Flags.bColRel; - nVal += (rRef.Flags.bRowRel << 1); - nVal += (rRef.Flags.bTabRel << 2); + nVal += rRef.IsColRel(); + nVal += (rRef.IsRowRel() << 1); + nVal += (rRef.IsTabRel() << 2); return nVal; } @@ -2100,7 +2101,7 @@ void ScTokenArray::ReadjustAbsolute3DReferences( const ScDocument* pOldDoc, cons { OUString aTabName; sal_uInt16 nFileId; - GetExternalTableData(pOldDoc, pNewDoc, rRef1.nTab, aTabName, nFileId); + GetExternalTableData(pOldDoc, pNewDoc, rRef1.Tab(), aTabName, nFileId); pCode[j]->DecRef(); ScExternalDoubleRefToken* pToken = new ScExternalDoubleRefToken(nFileId, aTabName, rRef); pToken->IncRef(); @@ -2119,7 +2120,7 @@ void ScTokenArray::ReadjustAbsolute3DReferences( const ScDocument* pOldDoc, cons { OUString aTabName; sal_uInt16 nFileId; - GetExternalTableData(pOldDoc, pNewDoc, rRef.nTab, aTabName, nFileId); + GetExternalTableData(pOldDoc, pNewDoc, rRef.Tab(), aTabName, nFileId); //replace with ScExternalSingleRefToken and adjust references pCode[j]->DecRef(); ScExternalSingleRefToken* pToken = new ScExternalSingleRefToken(nFileId, aTabName, rRef); diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx index 7918bad..b2a1619 100644 --- a/sc/source/filter/excel/excform.cxx +++ b/sc/source/filter/excel/excform.cxx @@ -720,9 +720,8 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, s if( nExtSheet <= 0 ) { // in current Workbook - aSRD.nTab = static_cast<SCTAB>(nTabFirst); - aSRD.SetFlag3D( sal_True ); - aSRD.SetTabRel( false ); + aSRD.SetAbsTab(nTabFirst); + aSRD.SetFlag3D(true); ExcRelToScRel( nRow, nCol, aSRD, bRangeName ); @@ -741,7 +740,7 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, s if( nTabLast != nTabFirst ) { aCRD.Ref1 = aCRD.Ref2 = aSRD; - aCRD.Ref2.nTab = static_cast<SCTAB>(nTabLast); + aCRD.Ref2.SetAbsTab(nTabLast); aCRD.Ref2.SetTabDeleted( !ValidTab(static_cast<SCTAB>(nTabLast)) ); aStack << aPool.Store( aCRD ); } @@ -789,12 +788,10 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, s ScSingleRefData& rR1 = aCRD.Ref1; ScSingleRefData& rR2 = aCRD.Ref2; - rR1.nTab = static_cast<SCTAB>(nTabFirst); - rR2.nTab = static_cast<SCTAB>(nTabLast); - rR1.SetFlag3D( sal_True ); - rR1.SetTabRel( false ); + rR1.SetAbsTab(nTabFirst); + rR2.SetAbsTab(nTabLast); + rR1.SetFlag3D(true); rR2.SetFlag3D( nTabFirst != nTabLast ); - rR2.SetTabRel( false ); ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName ); ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName ); @@ -886,7 +883,8 @@ ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal ScSingleRefData aSRD; ScComplexRefData aCRD; - aCRD.Ref1.nTab = aCRD.Ref2.nTab = aEingPos.Tab(); + aCRD.Ref1.SetAbsTab(aEingPos.Tab()); + aCRD.Ref2.SetAbsTab(aEingPos.Tab()); bExternName = false; @@ -1178,10 +1176,9 @@ ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal if( nExtSheet <= 0 ) {// in current Workbook - sal_Bool b3D = ( static_cast<SCTAB>(nTabFirst) != aEingPos.Tab() ) || bRangeName; - aSRD.nTab = static_cast<SCTAB>(nTabFirst); + bool b3D = ( static_cast<SCTAB>(nTabFirst) != aEingPos.Tab() ) || bRangeName; + aSRD.SetAbsTab(nTabFirst); aSRD.SetFlag3D( b3D ); - aSRD.SetTabRel( false ); ExcRelToScRel( nRow, nCol, aSRD, bRangeName ); @@ -1235,12 +1232,10 @@ ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal ScSingleRefData &rR1 = aCRD.Ref1; ScSingleRefData &rR2 = aCRD.Ref2; - rR1.nTab = static_cast<SCTAB>(nTabFirst); - rR2.nTab = static_cast<SCTAB>(nTabLast); + rR1.SetAbsTab(nTabFirst); + rR2.SetAbsTab(nTabLast); rR1.SetFlag3D( ( static_cast<SCTAB>(nTabFirst) != aEingPos.Tab() ) || bRangeName ); - rR1.SetTabRel( false ); rR2.SetFlag3D( ( static_cast<SCTAB>(nTabLast) != aEingPos.Tab() ) || bRangeName ); - rR2.SetTabRel( false ); ExcRelToScRel( nRowFirst, nColFirst, aCRD.Ref1, bRangeName ); ExcRelToScRel( nRowLast, nColLast, aCRD.Ref2, bRangeName ); diff --git a/sc/source/filter/excel/excform8.cxx b/sc/source/filter/excel/excform8.cxx index 7e72b04..35de70f 100644 --- a/sc/source/filter/excel/excform8.cxx +++ b/sc/source/filter/excel/excform8.cxx @@ -770,9 +770,8 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, break; } - aSRD.nTab = nTabFirst; - aSRD.SetFlag3D( sal_True ); - aSRD.SetTabRel( false ); + aSRD.SetAbsTab(nTabFirst); + aSRD.SetFlag3D(true); ExcRelToScRel8( nRw, nGrbitCol, aSRD, bRangeName ); @@ -797,7 +796,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, if (nTabLast != nTabFirst) { aCRD.Ref1 = aCRD.Ref2 = aSRD; - aCRD.Ref2.nTab = nTabLast; + aCRD.Ref2.SetAbsTab(nTabLast); aStack << aPool.StoreExtRef(aExtInfo.mnFileId, aExtInfo.maTabName, aCRD); } else @@ -811,7 +810,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, if( nTabLast != nTabFirst ) { aCRD.Ref1 = aCRD.Ref2 = aSRD; - aCRD.Ref2.nTab = nTabLast; + aCRD.Ref2.SetAbsTab(nTabLast); aCRD.Ref2.SetTabDeleted( !ValidTab(nTabLast) ); aStack << aPool.Store( aCRD ); } @@ -842,12 +841,10 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, ScSingleRefData &rR2 = aCRD.Ref2; - rR1.nTab = nTabFirst; - rR2.nTab = nTabLast; - rR1.SetFlag3D( sal_True ); - rR1.SetTabRel( false ); + rR1.SetAbsTab(nTabFirst); + rR2.SetAbsTab(nTabLast); + rR1.SetFlag3D(true); rR2.SetFlag3D( nTabFirst != nTabLast ); - rR2.SetTabRel( false ); ExcRelToScRel8( nRw1, nGrbitCol1, aCRD.Ref1, bRangeName ); ExcRelToScRel8( nRw2, nGrbitCol2, aCRD.Ref2, bRangeName ); @@ -1178,9 +1175,8 @@ ConvErr ExcelToSc8::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sa SCTAB nFirstScTab, nLastScTab; if( rLinkMan.GetScTabRange( nFirstScTab, nLastScTab, nIxti ) ) { - aSRD.nTab = nFirstScTab; - aSRD.SetFlag3D( sal_True ); - aSRD.SetTabRel( false ); + aSRD.SetAbsTab(nFirstScTab); + aSRD.SetFlag3D(true); ExcRelToScRel8( nRw, nGrbitCol, aSRD, bRangeName ); @@ -1210,12 +1206,10 @@ ConvErr ExcelToSc8::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sa ScSingleRefData &rR1 = aCRD.Ref1; ScSingleRefData &rR2 = aCRD.Ref2; - rR1.nTab = nFirstScTab; - rR2.nTab = nLastScTab; - rR1.SetFlag3D( sal_True ); - rR1.SetTabRel( false ); + rR1.SetAbsTab(nFirstScTab); + rR2.SetAbsTab(nLastScTab); + rR1.SetFlag3D(true); rR2.SetFlag3D( nFirstScTab != nLastScTab ); - rR2.SetTabRel( false ); ExcRelToScRel8( nRw1, nGrbitCol1, aCRD.Ref1, bRangeName ); ExcRelToScRel8( nRw2, nGrbitCol2, aCRD.Ref2, bRangeName ); @@ -1336,9 +1330,8 @@ ConvErr ExcelToSc8::ConvertExternName( const ScTokenArray*& rpArray, XclImpStrea break; } - aSRD.nTab = nExtTab1; + aSRD.SetAbsTab(nExtTab1); aSRD.SetFlag3D(true); - aSRD.SetTabRel(false); ExcRelToScRel8(nRow, nGrbitCol, aSRD, true); aCRD.Ref1 = aCRD.Ref2 = aSRD; String aTabName = rTabNames[nExtTab1]; @@ -1351,7 +1344,7 @@ ConvErr ExcelToSc8::ConvertExternName( const ScTokenArray*& rpArray, XclImpStrea else { // area reference - aCRD.Ref2.nTab = nExtTab2; + aCRD.Ref2.SetAbsTab(nExtTab2); aStack << aPool.StoreExtRef(nFileId, aTabName, aCRD); } } @@ -1364,14 +1357,12 @@ ConvErr ExcelToSc8::ConvertExternName( const ScTokenArray*& rpArray, XclImpStrea ScSingleRefData& rR1 = aCRD.Ref1; ScSingleRefData& rR2 = aCRD.Ref2; - rR1.nTab = nExtTab1; + rR1.SetAbsTab(nExtTab1); rR1.SetFlag3D(true); - rR1.SetTabRel(false); ExcRelToScRel8(nRow1, nGrbitCol1, rR1, true); - rR2.nTab = nExtTab2; + rR2.SetAbsTab(nExtTab2); rR2.SetFlag3D(true); - rR2.SetTabRel(false); ExcRelToScRel8(nRow2, nGrbitCol2, rR2, true); String aTabName = rTabNames[nExtTab1]; diff --git a/sc/source/filter/excel/xeformula.cxx b/sc/source/filter/excel/xeformula.cxx index a803002..7db3bb5 100644 --- a/sc/source/filter/excel/xeformula.cxx +++ b/sc/source/filter/excel/xeformula.cxx @@ -1792,8 +1792,17 @@ inline bool lclIsRefDel2D( const ScComplexRefData& rRefData ) SCTAB XclExpFmlaCompImpl::GetScTab( const ScSingleRefData& rRefData ) const { - bool bInvTab = rRefData.IsTabDeleted() || (!mxData->mpScBasePos && IsInGlobals() && rRefData.IsTabRel()); - return bInvTab ? SCTAB_INVALID : static_cast< SCTAB >( rRefData.nTab ); + if (rRefData.IsTabDeleted()) + return SCTAB_INVALID; + + if (!rRefData.IsTabRel()) + // absolute address + return rRefData.Tab(); + + if (!mxData->mpScBasePos) + return SCTAB_INVALID; + + return rRefData.toAbs(*mxData->mpScBasePos).Tab(); } bool XclExpFmlaCompImpl::IsRef2D( const ScSingleRefData& rRefData ) const @@ -2050,7 +2059,7 @@ void XclExpFmlaCompImpl::ProcessExternalRangeRef( const XclExpScToken& rTokData // 1-based EXTERNSHEET index and 0-based Excel sheet indexes sal_uInt16 nExtSheet, nFirstSBTab, nLastSBTab; - sal_uInt16 nTabSpan = static_cast< sal_uInt16 >( aRefData.Ref2.nTab - aRefData.Ref1.nTab + 1 ); + sal_uInt16 nTabSpan = static_cast<sal_uInt16>(aRefData.Ref2.Tab() - aRefData.Ref1.Tab() + 1); mxData->mpLinkMgr->FindExtSheet( nFileId, rTabName, nTabSpan, nExtSheet, nFirstSBTab, nLastSBTab, GetNewRefLogEntry() ); // write the token sal_uInt8 nBaseId = lclIsRefDel2D( aRefData ) ? EXC_TOKID_AREAERR3D : EXC_TOKID_AREA3D; diff --git a/sc/source/filter/excel/xelink.cxx b/sc/source/filter/excel/xelink.cxx index 2c00f9f..c1cd9a4 100644 --- a/sc/source/filter/excel/xelink.cxx +++ b/sc/source/filter/excel/xelink.cxx @@ -989,8 +989,8 @@ void XclExpExtName::WriteAddData( XclExpStream& rStrm ) if (r1.IsTabRel() || r2.IsTabRel()) break; - sal_uInt16 nTab1 = r1.nTab; - sal_uInt16 nTab2 = r2.nTab; + sal_uInt16 nTab1 = r1.Tab(); + sal_uInt16 nTab2 = r2.Tab(); bool bCol1Rel = r1.IsColRel(); bool bRow1Rel = r1.IsRowRel(); bool bCol2Rel = r2.IsColRel(); diff --git a/sc/source/filter/qpro/qproform.cxx b/sc/source/filter/qpro/qproform.cxx index 024a2a7..65984ef 100644 --- a/sc/source/filter/qpro/qproform.cxx +++ b/sc/source/filter/qpro/qproform.cxx @@ -308,7 +308,7 @@ ConvErr QProToSc::Convert( const ScTokenArray*& pArray, sal_uInt16 /*nLen*/, con maIn >> nCol >> nPage >> nRelBits; ReadSRD( aCRD.Ref2, nPage, nCol, nRelBits ); // Sheet name of second corner is not displayed if identical - if (aCRD.Ref1.IsFlag3D() && aCRD.Ref1.nTab == aCRD.Ref2.nTab && + if (aCRD.Ref1.IsFlag3D() && aCRD.Ref1.Tab() == aCRD.Ref2.Tab() && aCRD.Ref1.IsTabRel() == aCRD.Ref2.IsTabRel()) aCRD.Ref2.SetFlag3D( false); aStack << aPool.Store( aCRD ); diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 87a9b16..47871f0 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -1981,7 +1981,7 @@ ScExternalRefCache::TokenArrayRef ScExternalRefManager::getRangeNameTokensFromSr { const ScSingleRefData& rRef = static_cast<const ScToken*>(pToken)->GetSingleRef(); OUString aTabName; - pSrcDoc->GetName(rRef.nTab, aTabName); + pSrcDoc->GetName(rRef.Tab(), aTabName); ScExternalSingleRefToken aNewToken(nFileId, aTabName, static_cast<const ScToken*>(pToken)->GetSingleRef()); pNew->AddToken(aNewToken); bTokenAdded = true; @@ -1991,7 +1991,7 @@ ScExternalRefCache::TokenArrayRef ScExternalRefManager::getRangeNameTokensFromSr { const ScSingleRefData& rRef = static_cast<const ScToken*>(pToken)->GetSingleRef(); OUString aTabName; - pSrcDoc->GetName(rRef.nTab, aTabName); + pSrcDoc->GetName(rRef.Tab(), aTabName); ScExternalDoubleRefToken aNewToken(nFileId, aTabName, static_cast<const ScToken*>(pToken)->GetDoubleRef()); pNew->AddToken(aNewToken); bTokenAdded = true; diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index 628c5c9..14ea95c 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -557,8 +557,8 @@ void Chart2Positioner::glueState() if (n2 > nEndCol) nEndCol = static_cast<SCCOL>(n2); - n1 = aData.Ref1.nRow; - n2 = aData.Ref2.nRow; + n1 = aData.Ref1.Row(); + n2 = aData.Ref2.Row(); if (n1 > MAXROW) n1 = MAXROW; if (n2 > MAXROW) @@ -1619,7 +1619,7 @@ public: return; const ScSingleRefData& r = pToken->GetSingleRef(); - mpTabNumList->push_back(r.nTab); + mpTabNumList->push_back(r.Tab()); } void getList(list<SCTAB>& rList) @@ -1684,7 +1684,7 @@ void RangeAnalyzer::initRangeAnalyzer( const vector<ScTokenRef>& rTokens ) if (eVar == svDoubleRef || eVar == svExternalDoubleRef) { const ScComplexRefData& r = aRefToken->GetDoubleRef(); - if (r.Ref1.nTab == r.Ref2.nTab) + if (r.Ref1.Tab() == r.Ref2.Tab()) { mnColumnCount = std::max<SCCOL>(mnColumnCount, static_cast<SCCOL>(abs(r.Ref2.Col() - r.Ref1.Col())+1)); mnRowCount = std::max<SCROW>(mnRowCount, static_cast<SCROW>(abs(r.Ref2.Row() - r.Ref1.Row())+1)); diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx index a08cd3b..4271ce8 100644 --- a/sc/source/ui/unoobj/tokenuno.cxx +++ b/sc/source/ui/unoobj/tokenuno.cxx @@ -459,7 +459,9 @@ bool ScTokenConversion::ConvertToTokenSequence( ScDocument& rDoc, rDoc.GetExternalRefManager()->getCacheTable( rToken.GetIndex(), rToken.GetString(), false, &nCacheId ); aComplRef.Reference1.Sheet = static_cast< sal_Int32 >( nCacheId ); // NOTE: This assumes that cached sheets are in consecutive order! - aComplRef.Reference2.Sheet = aComplRef.Reference1.Sheet + (static_cast<const ScToken&>(rToken).GetSingleRef2().nTab - static_cast<const ScToken&>(rToken).GetSingleRef().nTab); + aComplRef.Reference2.Sheet = + aComplRef.Reference1.Sheet + + (static_cast<const ScToken&>(rToken).GetSingleRef2().Tab() - static_cast<const ScToken&>(rToken).GetSingleRef().Tab()); sheet::ExternalReference aExtRef; aExtRef.Index = rToken.GetIndex(); aExtRef.Reference <<= aComplRef; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits