sc/inc/calcmacros.hxx | 2 sc/inc/tokenarray.hxx | 2 sc/qa/unit/ucalc.cxx | 4 - sc/qa/unit/ucalc_formula.cxx | 37 ++++++++++++++--- sc/source/core/data/conditio.cxx | 32 +++++++-------- sc/source/core/data/documen4.cxx | 2 sc/source/core/data/formulacell.cxx | 41 ++++++------------- sc/source/core/tool/compiler.cxx | 6 +- sc/source/core/tool/token.cxx | 66 ++++++++++++++++++++++++++++++-- sc/source/filter/excel/excform.cxx | 32 +++++---------- sc/source/filter/excel/excform8.cxx | 32 +++++---------- sc/source/filter/excel/xeformula.cxx | 26 +++++++----- sc/source/filter/excel/xelink.cxx | 12 ++--- sc/source/filter/lotus/lotform.cxx | 4 - sc/source/filter/lotus/tool.cxx | 6 -- sc/source/ui/unoobj/tokenuno.cxx | 72 +++++++++++++++++++++++++++-------- 16 files changed, 234 insertions(+), 142 deletions(-)
New commits: commit 7f78d759afc1cd05f25b37ee994b649351dad9dc Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Thu Jul 25 15:59:00 2013 -0400 Re-work reference update on sheet insertion & fix one bug on sheet deletion. Change-Id: I1405eb54c3c530e2c22be1f1d7728fa0d84ad447 diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx index 2ae6c90..1e8ced1 100644 --- a/sc/inc/tokenarray.hxx +++ b/sc/inc/tokenarray.hxx @@ -143,6 +143,8 @@ public: */ bool AdjustReferenceOnDeletedTab( SCTAB nDelPos, SCTAB nSheets, const ScAddress& rOldPos ); + bool AdjustReferenceOnInsertedTab( SCTAB nInsPos, SCTAB nSheets, const ScAddress& rOldPos ); + #if DEBUG_FORMULA_COMPILER void Dump() const; #endif diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index 6407b72..531d1d3 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -765,12 +765,12 @@ void Test::testFormulaRefUpdateSheets() // Set formulas to B2 and B3 on sheet Sheet2. m_pDoc->SetString(ScAddress(1,1,1), "=SUM(Sheet1.B2:C3)"); - m_pDoc->SetString(ScAddress(1,2,1), "=SUM(Sheet1.$B$2:$C$3)"); + m_pDoc->SetString(ScAddress(1,2,1), "=SUM($Sheet1.$B$2:$C$3)"); if (!checkFormula(*m_pDoc, ScAddress(1,1,1), "SUM(Sheet1.B2:C3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); - if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM(Sheet1.$B$2:$C$3)")) + if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM($Sheet1.$B$2:$C$3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); // Swap the sheets. @@ -783,7 +783,7 @@ void Test::testFormulaRefUpdateSheets() if (!checkFormula(*m_pDoc, ScAddress(1,1,0), "SUM(Sheet1.B2:C3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); - if (!checkFormula(*m_pDoc, ScAddress(1,2,0), "SUM(Sheet1.$B$2:$C$3)")) + if (!checkFormula(*m_pDoc, ScAddress(1,2,0), "SUM($Sheet1.$B$2:$C$3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); // Swap back. @@ -796,7 +796,7 @@ void Test::testFormulaRefUpdateSheets() if (!checkFormula(*m_pDoc, ScAddress(1,1,1), "SUM(Sheet1.B2:C3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); - if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM(Sheet1.$B$2:$C$3)")) + if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM($Sheet1.$B$2:$C$3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); // Insert a new sheet between the two. @@ -810,7 +810,7 @@ void Test::testFormulaRefUpdateSheets() if (!checkFormula(*m_pDoc, ScAddress(1,1,2), "SUM(Sheet1.B2:C3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); - if (!checkFormula(*m_pDoc, ScAddress(1,2,2), "SUM(Sheet1.$B$2:$C$3)")) + if (!checkFormula(*m_pDoc, ScAddress(1,2,2), "SUM($Sheet1.$B$2:$C$3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); // Delete the temporary sheet. @@ -822,7 +822,30 @@ void Test::testFormulaRefUpdateSheets() if (!checkFormula(*m_pDoc, ScAddress(1,1,1), "SUM(Sheet1.B2:C3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); - if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM(Sheet1.$B$2:$C$3)")) + if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM($Sheet1.$B$2:$C$3)")) + CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); + + // Insert a new sheet before the first one. + m_pDoc->InsertTab(0, "Temp"); + + m_pDoc->GetName(1, aName); + CPPUNIT_ASSERT_EQUAL(OUString("Sheet1"), aName); + m_pDoc->GetName(2, aName); + CPPUNIT_ASSERT_EQUAL(OUString("Sheet2"), aName); + + if (!checkFormula(*m_pDoc, ScAddress(1,1,2), "SUM(Sheet1.B2:C3)")) + CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); + + if (!checkFormula(*m_pDoc, ScAddress(1,2,2), "SUM($Sheet1.$B$2:$C$3)")) + CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); + + // Delete the temporary sheet. + m_pDoc->DeleteTab(0); + + if (!checkFormula(*m_pDoc, ScAddress(1,1,1), "SUM(Sheet1.B2:C3)")) + CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); + + if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM($Sheet1.$B$2:$C$3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); // Delete Sheet1. @@ -833,7 +856,7 @@ void Test::testFormulaRefUpdateSheets() if (!checkFormula(*m_pDoc, ScAddress(1,1,0), "SUM(#REF!.B2:C3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B2."); - if (!checkFormula(*m_pDoc, ScAddress(1,2,0), "SUM(#REF!.$B$2:$C$3)")) + if (!checkFormula(*m_pDoc, ScAddress(1,2,0), "SUM($#REF!.$B$2:$C$3)")) CPPUNIT_FAIL("Wrong formula in Sheet2.B3."); m_pDoc->DeleteTab(0); diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index 694b81d..c6fb301 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -2555,37 +2555,24 @@ bool ScFormulaCell::UpdateReference( void ScFormulaCell::UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets) { - bool bPosChanged = ( aPos.Tab() >= nTable ? true : false ); + bool bPosChanged = (nTable <= aPos.Tab()); pCode->Reset(); - if( pCode->GetNextReferenceRPN() && !pDocument->IsClipOrUndo() ) + if (pDocument->IsClipOrUndo() || !pCode->GetNextReferenceRPN()) { - EndListeningTo( pDocument ); - // IncTab _after_ EndListeningTo and _before_ Compiler UpdateInsertTab! - if ( bPosChanged ) + if (bPosChanged) aPos.IncTab(nNewSheets); - ScRangeData* pRangeData; - ScCompiler aComp(pDocument, aPos, *pCode); - aComp.SetGrammar(pDocument->GetGrammar()); - pRangeData = aComp.UpdateInsertTab( nTable, false, nNewSheets ); - if (pRangeData) // Exchange Shared Formula with real Formula - { - bool bRefChanged; - pDocument->RemoveFromFormulaTree( this ); // update formula count - delete pCode; - pCode = new ScTokenArray( *pRangeData->GetCode() ); - ScCompiler aComp2(pDocument, aPos, *pCode); - aComp2.SetGrammar(pDocument->GetGrammar()); - aComp2.MoveRelWrap(pRangeData->GetMaxCol(), pRangeData->GetMaxRow()); - aComp2.UpdateInsertTab( nTable, false, nNewSheets ); - // If the shared formula contained a named range/formula containing - // an absolute reference to a sheet, those have to be readjusted. - aComp2.UpdateDeleteTab( nTable, false, true, bRefChanged, nNewSheets ); - bCompile = true; - } - // no StartListeningTo because pTab[nTab] does not exsist! + + return; } - else if ( bPosChanged ) - aPos.IncTab(); + + EndListeningTo( pDocument ); + ScAddress aOldPos = aPos; + // IncTab _after_ EndListeningTo and _before_ Compiler UpdateInsertTab! + if (bPosChanged) + aPos.IncTab(nNewSheets); + + pCode->AdjustReferenceOnInsertedTab(nTable, nNewSheets, aOldPos); + // no StartListeningTo because the new sheets have not been inserted yet. } bool ScFormulaCell::UpdateDeleteTab(SCTAB nTable, bool /*bIsMove*/, SCTAB nSheets) diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 18a16cd..77793da 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -771,7 +771,7 @@ struct ConventionOOO_A1 : public Convention_A1 { if( rRef.IsFlag3D() || bForceTab ) { - if (!ValidTab(rAbsRef.Tab())) + if (!ValidTab(rAbsRef.Tab()) || rRef.IsTabDeleted()) { if (!rRef.IsTabRel()) rBuffer.append(sal_Unicode('$')); diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 53172ce..e5381aa 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -2536,7 +2536,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove( namespace { -bool adjustSingleRef( ScSingleRefData& rRef, SCTAB nDelPos, SCTAB nSheets, const ScAddress& rOldPos, const ScAddress& rNewPos ) +bool adjustSingleRefOnDeletedTab( ScSingleRefData& rRef, SCTAB nDelPos, SCTAB nSheets, const ScAddress& rOldPos, const ScAddress& rNewPos ) { ScAddress aAbs = rRef.toAbs(rOldPos); if (nDelPos <= aAbs.Tab() && aAbs.Tab() < nDelPos + nSheets) @@ -2562,6 +2562,26 @@ bool adjustSingleRef( ScSingleRefData& rRef, SCTAB nDelPos, SCTAB nSheets, const return false; } +bool adjustSingleRefOnInsertedTab( ScSingleRefData& rRef, SCTAB nInsPos, SCTAB nSheets, const ScAddress& rOldPos, const ScAddress& rNewPos ) +{ + ScAddress aAbs = rRef.toAbs(rOldPos); + if (nInsPos <= aAbs.Tab()) + { + // Reference sheet needs to be adjusted. + aAbs.IncTab(nSheets); + rRef.SetAddress(aAbs, rNewPos); + return true; + } + else if (rOldPos.Tab() != rNewPos.Tab()) + { + // Cell itself has moved. + rRef.SetAddress(aAbs, rNewPos); + return true; + } + + return false; +} + } bool ScTokenArray::AdjustReferenceOnDeletedTab( SCTAB nDelPos, SCTAB nSheets, const ScAddress& rOldPos ) @@ -2581,7 +2601,45 @@ bool ScTokenArray::AdjustReferenceOnDeletedTab( SCTAB nDelPos, SCTAB nSheets, co { ScToken* pToken = static_cast<ScToken*>(*p); ScSingleRefData& rRef = pToken->GetSingleRef(); - if (adjustSingleRef(rRef, nDelPos, nSheets, rOldPos, aNewPos)) + if (adjustSingleRefOnDeletedTab(rRef, nDelPos, nSheets, rOldPos, aNewPos)) + bRefChanged = true; + } + break; + case svDoubleRef: + { + ScToken* pToken = static_cast<ScToken*>(*p); + ScComplexRefData& rRef = pToken->GetDoubleRef(); + if (adjustSingleRefOnDeletedTab(rRef.Ref1, nDelPos, nSheets, rOldPos, aNewPos)) + bRefChanged = true; + if (adjustSingleRefOnDeletedTab(rRef.Ref2, nDelPos, nSheets, rOldPos, aNewPos)) + bRefChanged = true; + } + break; + default: + ; + } + } + return bRefChanged; +} + +bool ScTokenArray::AdjustReferenceOnInsertedTab( SCTAB nInsPos, SCTAB nSheets, const ScAddress& rOldPos ) +{ + bool bRefChanged = false; + ScAddress aNewPos = rOldPos; + if (nInsPos <= rOldPos.Tab()) + aNewPos.IncTab(nSheets); + + FormulaToken** p = pCode; + FormulaToken** pEnd = p + static_cast<size_t>(nLen); + for (; p != pEnd; ++p) + { + switch ((*p)->GetType()) + { + case svSingleRef: + { + ScToken* pToken = static_cast<ScToken*>(*p); + ScSingleRefData& rRef = pToken->GetSingleRef(); + if (adjustSingleRefOnInsertedTab(rRef, nInsPos, nSheets, rOldPos, aNewPos)) bRefChanged = true; } break; @@ -2589,9 +2647,9 @@ bool ScTokenArray::AdjustReferenceOnDeletedTab( SCTAB nDelPos, SCTAB nSheets, co { ScToken* pToken = static_cast<ScToken*>(*p); ScComplexRefData& rRef = pToken->GetDoubleRef(); - if (adjustSingleRef(rRef.Ref1, nDelPos, nSheets, rOldPos, aNewPos)) + if (adjustSingleRefOnInsertedTab(rRef.Ref1, nInsPos, nSheets, rOldPos, aNewPos)) bRefChanged = true; - if (adjustSingleRef(rRef.Ref2, nDelPos, nSheets, rOldPos, aNewPos)) + if (adjustSingleRefOnInsertedTab(rRef.Ref2, nInsPos, nSheets, rOldPos, aNewPos)) bRefChanged = true; } break; commit efd3828fe240064145035c403cf71a172ffbef9c Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Thu Jul 25 14:36:07 2013 -0400 More on removing direct access to reference position members. Change-Id: I7ca5cd0aefbcbda5d89116aca90e974b4bed6ca0 diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index 7d081bc..fee03b5 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -872,13 +872,13 @@ bool checkRelativeRefToken(ScDocument& rDoc, const ScAddress& rPos, SCsCOL nRelC return false; ScSingleRefData& rRef = pToken->GetSingleRef(); - if (!rRef.IsColRel() || rRef.nRelCol != nRelCol) + if (!rRef.IsColRel() || rRef.Col() != nRelCol) { cerr << "Unexpected relative column address." << endl; return false; } - if (!rRef.IsRowRel() || rRef.nRelRow != nRelRow) + if (!rRef.IsRowRel() || rRef.Row() != nRelRow) { cerr << "Unexpected relative row address." << endl; return false; diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx index fe438af..9f1db33 100644 --- a/sc/source/core/data/conditio.cxx +++ b/sc/source/core/data/conditio.cxx @@ -493,7 +493,7 @@ void ScConditionEntry::SetFormula2( const ScTokenArray& rArray ) } } -static void lcl_CondUpdateInsertTab( ScTokenArray& rCode, SCTAB nInsTab, SCTAB nPosTab, bool& rChanged, SCTAB nTabs ) +static void lcl_CondUpdateInsertTab( ScTokenArray& rCode, SCTAB nInsTab, bool& rChanged, SCTAB nTabs ) { // Insert table: only update absolute table references. // (Similar to ScCompiler::UpdateInsertTab with bIsName=true, result is the same as for named ranges) @@ -504,19 +504,17 @@ static void lcl_CondUpdateInsertTab( ScTokenArray& rCode, SCTAB nInsTab, SCTAB n while( p ) { ScSingleRefData& rRef1 = p->GetSingleRef(); - if ( !rRef1.IsTabRel() && nInsTab <= rRef1.nTab ) + if (!rRef1.IsTabRel() && nInsTab <= rRef1.Tab()) { - rRef1.nTab += nTabs; - rRef1.nRelTab = rRef1.nTab - nPosTab; + rRef1.SetAbsTab(rRef1.Tab() + nTabs); rChanged = true; } if( p->GetType() == svDoubleRef ) { ScSingleRefData& rRef2 = p->GetDoubleRef().Ref2; - if ( !rRef2.IsTabRel() && nInsTab <= rRef2.nTab ) + if (!rRef2.IsTabRel() && nInsTab <= rRef2.Tab()) { - rRef2.nTab += nTabs; - rRef2.nRelTab = rRef2.nTab - nPosTab; + rRef2.SetAbsTab(rRef2.Tab() + nTabs); rChanged = true; } } @@ -543,7 +541,7 @@ void ScConditionEntry::UpdateReference( UpdateRefMode eUpdateRefMode, { bool bChanged1 = false; if ( bInsertTab ) - lcl_CondUpdateInsertTab( *pFormula1, rRange.aStart.Tab(), aOldSrcPos.Tab(), bChanged1, nDz ); + lcl_CondUpdateInsertTab( *pFormula1, rRange.aStart.Tab(), bChanged1, nDz ); else { ScCompiler aComp( mpDoc, aSrcPos, *pFormula1 ); @@ -565,7 +563,7 @@ void ScConditionEntry::UpdateReference( UpdateRefMode eUpdateRefMode, { bool bChanged2 = false; if ( bInsertTab ) - lcl_CondUpdateInsertTab( *pFormula2, rRange.aStart.Tab(), aOldSrcPos.Tab(), bChanged2, nDz ); + lcl_CondUpdateInsertTab( *pFormula2, rRange.aStart.Tab(), bChanged2, nDz ); else { ScCompiler aComp( mpDoc, aSrcPos, *pFormula2); @@ -1398,17 +1396,17 @@ void ScConditionEntry::SourceChanged( const ScAddress& rChanged ) nCol2 = MAXCOL; } if ( aProv.Ref1.IsRowRel() ) - nRow2 = rChanged.Row() - aProv.Ref1.nRelRow; + nRow2 = rChanged.Row() - aProv.Ref1.Row(); else { - bHit &= ( rChanged.Row() >= aProv.Ref1.nRow ); + bHit &= ( rChanged.Row() >= aProv.Ref1.Row() ); nRow2 = MAXROW; } if ( aProv.Ref1.IsTabRel() ) - nTab2 = rChanged.Tab() - aProv.Ref1.nRelTab; + nTab2 = rChanged.Tab() - aProv.Ref1.Tab(); else { - bHit &= ( rChanged.Tab() >= aProv.Ref1.nTab ); + bHit &= (rChanged.Tab() >= aProv.Ref1.Tab()); nTab2 = MAXTAB; } @@ -1420,17 +1418,17 @@ void ScConditionEntry::SourceChanged( const ScAddress& rChanged ) nCol1 = 0; } if ( aProv.Ref2.IsRowRel() ) - nRow1 = rChanged.Row() - aProv.Ref2.nRelRow; + nRow1 = rChanged.Row() - aProv.Ref2.Row(); else { - bHit &= ( rChanged.Row() <= aProv.Ref2.nRow ); + bHit &= (rChanged.Row() <= aProv.Ref2.Row()); nRow1 = 0; } if ( aProv.Ref2.IsTabRel() ) - nTab1 = rChanged.Tab() - aProv.Ref2.nRelTab; + nTab1 = rChanged.Tab() - aProv.Ref2.Tab(); else { - bHit &= ( rChanged.Tab() <= aProv.Ref2.nTab ); + bHit &= (rChanged.Tab() <= aProv.Ref2.Tab()); nTab1 = 0; } diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 54f4325..9499fa0 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -176,7 +176,7 @@ void ScDocument::InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, if (nTab != nTab1) { - aRefData.nRelTab = nTab - aBasePos.Tab(); + aRefData.SetRelTab(nTab - aBasePos.Tab()); t->GetSingleRef() = aRefData; } diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index cfee0cd..18a16cd 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -1461,9 +1461,9 @@ r1c1_add_row( OUStringBuffer &rBuf, const ScSingleRefData& rRef, const ScAddress rBuf.append( sal_Unicode( 'R' ) ); if( rRef.IsRowRel() ) { - if (rRef.nRelRow != 0) + if (rRef.Row() != 0) { - rBuf.append("[").append( OUString::number( rRef.nRelRow ) ).append("]"); + rBuf.append("[").append( OUString::number(rRef.Row()) ).append("]"); } } else diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx index 1080b4b..c5aaf3c 100644 --- a/sc/source/filter/excel/excform.cxx +++ b/sc/source/filter/excel/excform.cxx @@ -521,8 +521,7 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, s aIn >> nUINT16 >> nByte; aSRD.nCol = static_cast<SCsCOL>(nByte); aSRD.nRow = nUINT16 & 0x3FFF; - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName ); ExcRelToScRel( nUINT16, nByte, aSRD, bRangeName ); @@ -553,9 +552,8 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, s aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast; - rSRef1.nRelTab = rSRef2.nRelTab = 0; - rSRef1.SetTabRel( sal_True ); - rSRef2.SetTabRel( sal_True ); + rSRef1.SetRelTab(0); + rSRef2.SetRelTab(0); rSRef1.SetFlag3D( bRangeName ); rSRef2.SetFlag3D( bRangeName ); @@ -603,8 +601,7 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, s { aIn >> nUINT16 >> nByte; // >> Attribute, Row >> Col - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName ); ExcRelToScRel( nUINT16, nByte, aSRD, bRNorSF ); @@ -619,9 +616,8 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pErgebnis, XclImpStream& aIn, s sal_uInt16 nRowFirst, nRowLast; sal_uInt8 nColFirst, nColLast; - aCRD.Ref1.nRelTab = aCRD.Ref2.nRelTab = 0; - aCRD.Ref1.SetTabRel( sal_True ); - aCRD.Ref2.SetTabRel( sal_True ); + aCRD.Ref1.SetRelTab(0); + aCRD.Ref2.SetRelTab(0); aCRD.Ref1.SetFlag3D( bRangeName ); aCRD.Ref2.SetFlag3D( bRangeName ); @@ -1036,8 +1032,7 @@ ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal aIn >> nUINT16 >> nByte; aSRD.nCol = static_cast<SCsCOL>(nByte); aSRD.nRow = nUINT16 & 0x3FFF; - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName ); ExcRelToScRel( nUINT16, nByte, aSRD, bRangeName ); @@ -1055,9 +1050,8 @@ ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast; - rSRef1.nRelTab = rSRef2.nRelTab = 0; - rSRef1.SetTabRel( sal_True ); - rSRef2.SetTabRel( sal_True ); + rSRef1.SetRelTab(0); + rSRef2.SetRelTab(0); rSRef1.SetFlag3D( bRangeName ); rSRef2.SetFlag3D( bRangeName ); @@ -1100,8 +1094,7 @@ ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal { aIn >> nUINT16 >> nByte; // >> Attribute, Row >> Col - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName ); ExcRelToScRel( nUINT16, nByte, aSRD, bRNorSF ); @@ -1116,9 +1109,8 @@ ConvErr ExcelToSc::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sal sal_uInt16 nRowFirst, nRowLast; sal_uInt8 nColFirst, nColLast; - aCRD.Ref1.nRelTab = aCRD.Ref2.nRelTab = 0; - aCRD.Ref1.SetTabRel( sal_True ); - aCRD.Ref2.SetTabRel( sal_True ); + aCRD.Ref1.SetRelTab(0); + aCRD.Ref2.SetRelTab(0); aCRD.Ref1.SetFlag3D( bRangeName ); aCRD.Ref2.SetFlag3D( bRangeName ); diff --git a/sc/source/filter/excel/excform8.cxx b/sc/source/filter/excel/excform8.cxx index 4810a7e..7241901 100644 --- a/sc/source/filter/excel/excform8.cxx +++ b/sc/source/filter/excel/excform8.cxx @@ -500,8 +500,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, aSRD.nCol = static_cast<SCCOL>(nCol); aSRD.nRow = nRow & 0x3FFF; - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName && !bCondFormat ); ExcRelToScRel8( nRow, nCol, aSRD, bRangeName ); @@ -533,9 +532,8 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast; - rSRef1.nRelTab = rSRef2.nRelTab = 0; - rSRef1.SetTabRel( sal_True ); - rSRef2.SetTabRel( sal_True ); + rSRef1.SetRelTab(0); + rSRef2.SetRelTab(0); rSRef1.SetFlag3D( bRangeName && !bCondFormat ); rSRef2.SetFlag3D( bRangeName && !bCondFormat ); @@ -592,8 +590,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, aIn >> nRow >> nCol; - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName ); ExcRelToScRel8( nRow, nCol, aSRD, bRNorSF ); @@ -608,9 +605,8 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, sal_uInt16 nRowFirst, nRowLast; sal_uInt16 nColFirst, nColLast; - aCRD.Ref1.nRelTab = aCRD.Ref2.nRelTab = 0; - aCRD.Ref1.SetTabRel( sal_True ); - aCRD.Ref2.SetTabRel( sal_True ); + aCRD.Ref1.SetRelTab(0); + aCRD.Ref2.SetRelTab(0); aCRD.Ref1.SetFlag3D( bRangeName ); aCRD.Ref2.SetFlag3D( bRangeName ); @@ -1056,8 +1052,7 @@ ConvErr ExcelToSc8::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sa aSRD.nCol = static_cast<SCCOL>(nCol); aSRD.nRow = nRow & 0x3FFF; - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName && !bCondFormat ); ExcRelToScRel8( nRow, nCol, aSRD, bRangeName ); @@ -1076,9 +1071,8 @@ ConvErr ExcelToSc8::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sa aIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast; - rSRef1.nRelTab = rSRef2.nRelTab = 0; - rSRef1.SetTabRel( sal_True ); - rSRef2.SetTabRel( sal_True ); + rSRef1.SetRelTab(0); + rSRef2.SetRelTab(0); rSRef1.SetFlag3D( bRangeName && !bCondFormat ); rSRef2.SetFlag3D( bRangeName && !bCondFormat ); @@ -1128,8 +1122,7 @@ ConvErr ExcelToSc8::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sa aIn >> nRow >> nCol; - aSRD.nRelTab = 0; - aSRD.SetTabRel( sal_True ); + aSRD.SetRelTab(0); aSRD.SetFlag3D( bRangeName ); ExcRelToScRel8( nRow, nCol, aSRD, bRNorSF ); @@ -1144,9 +1137,8 @@ ConvErr ExcelToSc8::Convert( _ScRangeListTabs& rRangeList, XclImpStream& aIn, sa sal_uInt16 nRowFirst, nRowLast; sal_uInt16 nColFirst, nColLast; - aCRD.Ref1.nRelTab = aCRD.Ref2.nRelTab = 0; - aCRD.Ref1.SetTabRel( sal_True ); - aCRD.Ref2.SetTabRel( sal_True ); + aCRD.Ref1.SetRelTab(0); + aCRD.Ref2.SetRelTab(0); aCRD.Ref1.SetFlag3D( bRangeName ); aCRD.Ref2.SetFlag3D( bRangeName ); diff --git a/sc/source/filter/excel/xeformula.cxx b/sc/source/filter/excel/xeformula.cxx index a862ae4..32d3d75 100644 --- a/sc/source/filter/excel/xeformula.cxx +++ b/sc/source/filter/excel/xeformula.cxx @@ -1801,8 +1801,17 @@ bool XclExpFmlaCompImpl::IsRef2D( const ScSingleRefData& rRefData ) const /* rRefData.IsFlag3D() determines if sheet name is always visible, even on the own sheet. If 3D references are allowed, the passed reference does not count as 2D reference. */ - return (!mxData->mpLinkMgr || !rRefData.IsFlag3D()) && !rRefData.IsTabDeleted() && - (rRefData.IsTabRel() ? (rRefData.nRelTab == 0) : (static_cast< SCTAB >( rRefData.nTab ) == GetCurrScTab())); + + if (mxData->mpLinkMgr && rRefData.IsFlag3D()) + return false; + + if (rRefData.IsTabDeleted()) + return false; + + if (rRefData.IsTabRel()) + return rRefData.Tab() == 0; + else + return rRefData.Tab() == GetCurrScTab(); } bool XclExpFmlaCompImpl::IsRef2D( const ScComplexRefData& rRefData ) const @@ -1841,16 +1850,12 @@ void XclExpFmlaCompImpl::ConvertRefData( // *** no reference position (shared, names, condfmt) - use relative values *** // convert column index (2-step-cast ScsCOL->sal_Int16->sal_uInt16 to get all bits correctly) - sal_Int16 nXclRelCol = static_cast< sal_Int16 >( rRefData.IsColRel() ? rRefData.nRelCol : rRefData.nCol ); + sal_Int16 nXclRelCol = static_cast<sal_Int16>(rRefData.Col()); rXclPos.mnCol = static_cast< sal_uInt16 >( nXclRelCol ) & mnMaxColMask; // convert row index (2-step-cast ScsROW->sal_Int16->sal_uInt16 to get all bits correctly) - sal_Int16 nXclRelRow = static_cast< sal_Int32 >( rRefData.IsRowRel() ? rRefData.nRelRow : rRefData.nRow ); + sal_Int16 nXclRelRow = static_cast<sal_Int32>(rRefData.Row()); rXclPos.mnRow = static_cast< sal_uInt32 >( nXclRelRow ) & mnMaxRowMask; - - // resolve relative tab index if possible - if( rRefData.IsTabRel() && !IsInGlobals() && (GetCurrScTab() < GetDoc().GetTableCount()) ) - rRefData.nTab = static_cast< SCsTAB >( GetCurrScTab() + rRefData.nRelTab ); } // flags for relative column and row @@ -2536,12 +2541,11 @@ void lclInitOwnTab( ScSingleRefData& rRef, const ScAddress& rScPos, SCTAB nCurrS if( b3DRefOnly ) { // no reduction to 2D reference, if global link manager is used - rRef.SetFlag3D( sal_True ); + rRef.SetFlag3D(true); } else if( rScPos.Tab() == nCurrScTab ) { - rRef.SetTabRel( sal_True ); - rRef.nRelTab = 0; + rRef.SetRelTab(0); } } diff --git a/sc/source/filter/excel/xelink.cxx b/sc/source/filter/excel/xelink.cxx index 90ea02c..8c1e16b 100644 --- a/sc/source/filter/excel/xelink.cxx +++ b/sc/source/filter/excel/xelink.cxx @@ -965,8 +965,8 @@ void XclExpExtName::WriteAddData( XclExpStream& rStrm ) bool bColRel = rRef.IsColRel(); bool bRowRel = rRef.IsRowRel(); - sal_uInt16 nCol = static_cast< sal_uInt16 >( bColRel ? rRef.nRelCol : rRef.nCol ); - sal_uInt16 nRow = static_cast< sal_uInt16 >( bRowRel ? rRef.nRelRow : rRef.nRow ); + sal_uInt16 nCol = static_cast<sal_uInt16>(rRef.Col()); + sal_uInt16 nRow = static_cast<sal_uInt16>(rRef.Row()); if (bColRel) nCol |= 0x4000; if (bRowRel) nCol |= 0x8000; @@ -996,10 +996,10 @@ void XclExpExtName::WriteAddData( XclExpStream& rStrm ) bool bCol2Rel = r2.IsColRel(); bool bRow2Rel = r2.IsRowRel(); - sal_uInt16 nCol1 = static_cast< sal_uInt16 >( bCol1Rel ? r1.nRelCol : r1.nCol ); - sal_uInt16 nCol2 = static_cast< sal_uInt16 >( bCol2Rel ? r2.nRelCol : r2.nCol ); - sal_uInt16 nRow1 = static_cast< sal_uInt16 >( bRow1Rel ? r1.nRelRow : r1.nRow ); - sal_uInt16 nRow2 = static_cast< sal_uInt16 >( bRow2Rel ? r2.nRelRow : r2.nRow ); + sal_uInt16 nCol1 = static_cast<sal_uInt16>(r1.Col()); + sal_uInt16 nCol2 = static_cast<sal_uInt16>(r2.Col()); + sal_uInt16 nRow1 = static_cast<sal_uInt16>(r1.Row()); + sal_uInt16 nRow2 = static_cast<sal_uInt16>(r2.Row()); if (bCol1Rel) nCol1 |= 0x4000; if (bRow1Rel) nCol1 |= 0x8000; if (bCol2Rel) nCol2 |= 0x4000; diff --git a/sc/source/filter/lotus/lotform.cxx b/sc/source/filter/lotus/lotform.cxx index 75460cd..ed4d076 100644 --- a/sc/source/filter/lotus/lotform.cxx +++ b/sc/source/filter/lotus/lotform.cxx @@ -395,9 +395,7 @@ ConvErr LotusToSc::Convert( const ScTokenArray*& rpErg, sal_Int32& rRest, pIndexToType = IndexToType; pIndexToToken = IndexToToken; - rR.SetTabRel( sal_True ); - rR.nTab = aEingPos.Tab(); - rR.nRelTab = 0; + rR.SetRelTab(0); rR.SetFlag3D( false ); } diff --git a/sc/source/filter/lotus/tool.cxx b/sc/source/filter/lotus/tool.cxx index d6f4fcf..020b582 100644 --- a/sc/source/filter/lotus/tool.cxx +++ b/sc/source/filter/lotus/tool.cxx @@ -424,17 +424,15 @@ LotusRangeList::LotusRangeList( void ) nIdCnt = 1; pSingRef = &aComplRef.Ref1; - pSingRef->nTab = pSingRef->nRelTab = 0; + pSingRef->SetRelTab(0); pSingRef->SetColRel( false ); pSingRef->SetRowRel( false ); - pSingRef->SetTabRel( sal_True ); pSingRef->SetFlag3D( false ); pSingRef = &aComplRef.Ref2; - pSingRef->nTab = pSingRef->nRelTab = 0; + pSingRef->SetRelTab(0); pSingRef->SetColRel( false ); pSingRef->SetRowRel( false ); - pSingRef->SetTabRel( sal_True ); pSingRef->SetFlag3D( false ); } diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx index f4d53d5..a08cd3b 100644 --- a/sc/source/ui/unoobj/tokenuno.cxx +++ b/sc/source/ui/unoobj/tokenuno.cxx @@ -288,16 +288,30 @@ SC_IMPL_DUMMY_PROPERTY_LISTENER( ScFormulaParserObj ) static void lcl_ExternalRefToApi( sheet::SingleReference& rAPI, const ScSingleRefData& rRef ) { - rAPI.Column = rRef.nCol; - rAPI.Row = rRef.nRow; + rAPI.Column = 0; + rAPI.Row = 0; rAPI.Sheet = 0; - rAPI.RelativeColumn = rRef.nRelCol; - rAPI.RelativeRow = rRef.nRelRow; + rAPI.RelativeColumn = 0; + rAPI.RelativeRow = 0; rAPI.RelativeSheet = 0; sal_Int32 nFlags = 0; - if ( rRef.IsColRel() ) nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; - if ( rRef.IsRowRel() ) nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; + if ( rRef.IsColRel() ) + { + nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; + rAPI.RelativeColumn = rRef.Col(); + } + else + rAPI.Column = rRef.Col(); + + if ( rRef.IsRowRel() ) + { + nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; + rAPI.RelativeRow = rRef.Row(); + } + else + rAPI.Row = rRef.Row(); + if ( rRef.IsColDeleted() ) nFlags |= sheet::ReferenceFlags::COLUMN_DELETED; if ( rRef.IsRowDeleted() ) nFlags |= sheet::ReferenceFlags::ROW_DELETED; if ( rRef.IsFlag3D() ) nFlags |= sheet::ReferenceFlags::SHEET_3D; @@ -307,17 +321,43 @@ static void lcl_ExternalRefToApi( sheet::SingleReference& rAPI, const ScSingleRe static void lcl_SingleRefToApi( sheet::SingleReference& rAPI, const ScSingleRefData& rRef ) { - rAPI.Column = rRef.nCol; - rAPI.Row = rRef.nRow; - rAPI.Sheet = rRef.nTab; - rAPI.RelativeColumn = rRef.nRelCol; - rAPI.RelativeRow = rRef.nRelRow; - rAPI.RelativeSheet = rRef.nRelTab; - sal_Int32 nFlags = 0; - if ( rRef.IsColRel() ) nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; - if ( rRef.IsRowRel() ) nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; - if ( rRef.IsTabRel() ) nFlags |= sheet::ReferenceFlags::SHEET_RELATIVE; + if ( rRef.IsColRel() ) + { + nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; + rAPI.RelativeColumn = rRef.Col(); + rAPI.Column = 0; + } + else + { + rAPI.RelativeColumn = 0; + rAPI.Column = rRef.Col(); + } + + if ( rRef.IsRowRel() ) + { + nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; + rAPI.RelativeRow = rRef.Row(); + rAPI.Row = 0; + } + else + { + rAPI.RelativeRow = 0; + rAPI.Row = rRef.Row(); + } + + if ( rRef.IsTabRel() ) + { + nFlags |= sheet::ReferenceFlags::SHEET_RELATIVE; + rAPI.RelativeSheet = rRef.Tab(); + rAPI.Sheet = 0; + } + else + { + rAPI.RelativeSheet = 0; + rAPI.Sheet = rRef.Tab(); + } + if ( rRef.IsColDeleted() ) nFlags |= sheet::ReferenceFlags::COLUMN_DELETED; if ( rRef.IsRowDeleted() ) nFlags |= sheet::ReferenceFlags::ROW_DELETED; if ( rRef.IsTabDeleted() ) nFlags |= sheet::ReferenceFlags::SHEET_DELETED; commit fef6d6ff18bb4b5bdf824f5547161e906035cf9e Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Thu Jul 25 09:37:54 2013 -0400 I forgot to turn this off. Change-Id: I86f60ee3ae748abd6ec2e8308ba067b836aa3ab4 diff --git a/sc/inc/calcmacros.hxx b/sc/inc/calcmacros.hxx index 21a51fb..9516522 100644 --- a/sc/inc/calcmacros.hxx +++ b/sc/inc/calcmacros.hxx @@ -12,7 +12,7 @@ #define DEBUG_COLUMN_STORAGE 0 #define DEBUG_PIVOT_TABLE 0 -#define DEBUG_FORMULA_COMPILER 1 +#define DEBUG_FORMULA_COMPILER 0 #if DEBUG_PIVOT_TABLE || DEBUG_COLUMN_STORAGE || DEBUG_FORMULA_COMPILER #include <iostream> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits