sc/inc/dociter.hxx | 2 sc/source/core/data/dociter.cxx | 26 +++++ sc/source/core/inc/interpre.hxx | 3 sc/source/core/tool/interpr4.cxx | 173 +++++++++++++++++++++++++++------------ sc/source/core/tool/interpr5.cxx | 12 +- sc/source/ui/view/viewfun4.cxx | 41 ++++----- 6 files changed, 180 insertions(+), 77 deletions(-)
New commits: commit 194196cfdb25d8bd741d87aa4d3dc717bd3c3834 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Mar 25 10:37:25 2013 -0400 Add variant of GetCellValue() that takes ScCellIterator instead of ScBaseCell. And hopefully we can eventually remove the original one that takes ScBaseCell somehow... Change-Id: I162c8072aa2c699abfd3eb202b90a6331123eb1b diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index 906f4d6..760a0c7 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -51,6 +51,7 @@ struct ScComplexRefData; class ScToken; class ScJumpMatrix; +class ScCellIterator; #define MAXSTACK (4096 / sizeof(formula::FormulaToken*)) @@ -186,7 +187,9 @@ bool IsTableOpInRange( const ScRange& ); sal_uLong GetCellNumberFormat( const ScAddress&, const ScBaseCell* ); double ConvertStringToValue( const String& ); double GetCellValue( const ScAddress&, const ScBaseCell* ); +double GetCellValue( ScCellIterator& rIter ); double GetCellValueOrZero( const ScAddress&, const ScBaseCell* ); +double GetCellValueOrZero( ScCellIterator& rIter ); double GetValueCellValue( const ScAddress&, const ScValueCell* ); ScBaseCell* GetCell( const ScAddress& rPos ); void GetCellString( String& rStr, const ScBaseCell* pCell ); diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 752c595..bfd9494 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -470,77 +470,152 @@ double ScInterpreter::GetCellValue( const ScAddress& rPos, const ScBaseCell* pCe return nVal; } +double ScInterpreter::GetCellValue( ScCellIterator& rIter ) +{ + sal_uInt16 nErr = nGlobalError; + nGlobalError = 0; + double nVal = GetCellValueOrZero(rIter); + if ( !nGlobalError || nGlobalError == errCellNoValue ) + nGlobalError = nErr; + return nVal; +} double ScInterpreter::GetCellValueOrZero( const ScAddress& rPos, const ScBaseCell* pCell ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetCellValueOrZero" ); double fValue = 0.0; - if (pCell) + if (!pCell) + return fValue; + + CellType eType = pCell->GetCellType(); + switch (eType) { - CellType eType = pCell->GetCellType(); - switch ( eType ) + case CELLTYPE_FORMULA: { - case CELLTYPE_FORMULA: + ScFormulaCell* pFCell = (ScFormulaCell*) pCell; + sal_uInt16 nErr = pFCell->GetErrCode(); + if( !nErr ) { - ScFormulaCell* pFCell = (ScFormulaCell*) pCell; - sal_uInt16 nErr = pFCell->GetErrCode(); - if( !nErr ) + if (pFCell->IsValue()) { - if (pFCell->IsValue()) - { - fValue = pFCell->GetValue(); - pDok->GetNumberFormatInfo( nCurFmtType, nCurFmtIndex, - rPos, pFCell ); - } - else - { - String aStr = pFCell->GetString(); - fValue = ConvertStringToValue( aStr ); - } + fValue = pFCell->GetValue(); + pDok->GetNumberFormatInfo( nCurFmtType, nCurFmtIndex, + rPos, pFCell ); } else { - fValue = 0.0; - SetError(nErr); + String aStr = pFCell->GetString(); + fValue = ConvertStringToValue( aStr ); } } - break; - case CELLTYPE_VALUE: + else { - fValue = ((ScValueCell*)pCell)->GetValue(); - nCurFmtIndex = pDok->GetNumberFormat( rPos ); - nCurFmtType = pFormatter->GetType( nCurFmtIndex ); - if ( bCalcAsShown && fValue != 0.0 ) - fValue = pDok->RoundValueAsShown( fValue, nCurFmtIndex ); + fValue = 0.0; + SetError(nErr); } - break; - case CELLTYPE_STRING: - case CELLTYPE_EDIT: + } + break; + case CELLTYPE_VALUE: + { + fValue = ((ScValueCell*)pCell)->GetValue(); + nCurFmtIndex = pDok->GetNumberFormat( rPos ); + nCurFmtType = pFormatter->GetType( nCurFmtIndex ); + if ( bCalcAsShown && fValue != 0.0 ) + fValue = pDok->RoundValueAsShown( fValue, nCurFmtIndex ); + } + break; + case CELLTYPE_STRING: + case CELLTYPE_EDIT: + { + // SUM(A1:A2) differs from A1+A2. No good. But people insist on + // it ... #i5658# + String aStr; + if ( eType == CELLTYPE_STRING ) + aStr = ((ScStringCell*)pCell)->GetString(); + else + aStr = ((ScEditCell*)pCell)->GetString(); + fValue = ConvertStringToValue( aStr ); + } + break; + case CELLTYPE_NONE: + case CELLTYPE_NOTE: + fValue = 0.0; // empty or broadcaster cell + break; +#if OSL_DEBUG_LEVEL > 0 + case CELLTYPE_DESTROYED: +#endif + SetError(errCellNoValue); + fValue = 0.0; + break; + } + + return fValue; +} + +double ScInterpreter::GetCellValueOrZero( ScCellIterator& rIter ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetCellValueOrZero" ); + double fValue = 0.0; + + CellType eType = rIter.getType(); + const ScAddress& rPos = rIter.GetPos(); + switch (eType) + { + case CELLTYPE_FORMULA: + { + ScFormulaCell* pFCell = rIter.getFormulaCell(); + sal_uInt16 nErr = pFCell->GetErrCode(); + if( !nErr ) { - // SUM(A1:A2) differs from A1+A2. No good. But people insist on - // it ... #i5658# - String aStr; - if ( eType == CELLTYPE_STRING ) - aStr = ((ScStringCell*)pCell)->GetString(); + if (pFCell->IsValue()) + { + fValue = pFCell->GetValue(); + pDok->GetNumberFormatInfo( nCurFmtType, nCurFmtIndex, + rPos, pFCell ); + } else - aStr = ((ScEditCell*)pCell)->GetString(); - fValue = ConvertStringToValue( aStr ); + { + String aStr = pFCell->GetString(); + fValue = ConvertStringToValue( aStr ); + } } - break; - case CELLTYPE_NONE: - case CELLTYPE_NOTE: - fValue = 0.0; // empty or broadcaster cell - break; -#if OSL_DEBUG_LEVEL > 0 - case CELLTYPE_DESTROYED: -#endif - SetError(errCellNoValue); + else + { fValue = 0.0; - break; + SetError(nErr); + } + } + break; + case CELLTYPE_VALUE: + { + fValue = rIter.getValue(); + nCurFmtIndex = pDok->GetNumberFormat( rPos ); + nCurFmtType = pFormatter->GetType( nCurFmtIndex ); + if ( bCalcAsShown && fValue != 0.0 ) + fValue = pDok->RoundValueAsShown( fValue, nCurFmtIndex ); + } + break; + case CELLTYPE_STRING: + case CELLTYPE_EDIT: + { + // SUM(A1:A2) differs from A1+A2. No good. But people insist on + // it ... #i5658# + OUString aStr = rIter.getString(); + fValue = ConvertStringToValue( aStr ); } + break; + case CELLTYPE_NONE: + case CELLTYPE_NOTE: + fValue = 0.0; // empty or broadcaster cell + break; +#if OSL_DEBUG_LEVEL > 0 + case CELLTYPE_DESTROYED: +#endif + SetError(errCellNoValue); + fValue = 0.0; + break; } - else - fValue = 0.0; + return fValue; } diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx index 74bccc7..28e3b97 100644 --- a/sc/source/core/tool/interpr5.cxx +++ b/sc/source/core/tool/interpr5.cxx @@ -437,10 +437,7 @@ ScMatrixRef ScInterpreter::CreateMatrixFromDoubleRef( const FormulaToken* pToken if (aCellIter.hasNumeric()) { ScAddress aAdr(nCol, nThisRow, nTab1); - - // TODO: Come back to this and fix it. - ScBaseCell* pBC = pDok->GetCell(aAdr); - double fVal = GetCellValue(aAdr, pBC); + double fVal = GetCellValue(aCellIter); if ( nGlobalError ) { commit 27eef91bc0d8fcef920b8fe0659ae049cc7ec8e2 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Mar 25 09:30:57 2013 -0400 More on ScCellIterator usage migration. Change-Id: I4ee6b1b3ae110ebfb59a84d6e9fd509ce38ca28c diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx index c490a9d..6f17e2d 100644 --- a/sc/inc/dociter.hxx +++ b/sc/inc/dociter.hxx @@ -247,6 +247,8 @@ public: OUString getString(); const EditTextObject* getEditText() const; ScFormulaCell* getFormulaCell(); + double getValue() const; + bool hasString() const; bool hasNumeric() const; bool isEmpty() const; diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index 8e503b8..fb39c8a 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -1166,6 +1166,20 @@ ScFormulaCell* ScCellIterator::getFormulaCell() return mpCurFormula; } +double ScCellIterator::getValue() const +{ + switch (meCurType) + { + case CELLTYPE_VALUE: + return mfCurValue; + case CELLTYPE_FORMULA: + return mpCurFormula->GetValue(); + default: + ; + } + return 0.0; +} + bool ScCellIterator::hasString() const { switch (meCurType) @@ -1199,7 +1213,17 @@ bool ScCellIterator::hasNumeric() const bool ScCellIterator::isEmpty() const { - return meCurType == CELLTYPE_NOTE || meCurType == CELLTYPE_NONE; + switch (meCurType) + { + case CELLTYPE_NOTE: + case CELLTYPE_NONE: + return true; + case CELLTYPE_FORMULA: + return mpCurFormula->IsEmpty(); + default: + ; + } + return false; } namespace { diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx index 7a716ed..74bccc7 100644 --- a/sc/source/core/tool/interpr5.cxx +++ b/sc/source/core/tool/interpr5.cxx @@ -424,20 +424,24 @@ ScMatrixRef ScInterpreter::CreateMatrixFromDoubleRef( const FormulaToken* pToken // Neighboring cell values of identical type are stored and passed as // an array to the matrix object, for performance reasons. - for (ScBaseCell* pCell = aCellIter.GetFirst(); pCell; pCell = aCellIter.GetNext(), nPrevRow = nThisRow) + for (bool bHas = aCellIter.first(); bHas; bHas = aCellIter.next(), nPrevRow = nThisRow) { nThisRow = aCellIter.GetPos().Row(); - if (HasCellEmptyData(pCell)) + if (aCellIter.isEmpty()) { aBucket.flush(*pMat, static_cast<SCSIZE>(nCol-nCol1)); continue; } - if (HasCellValueData(pCell)) + if (aCellIter.hasNumeric()) { ScAddress aAdr(nCol, nThisRow, nTab1); - double fVal = GetCellValue( aAdr, pCell); + + // TODO: Come back to this and fix it. + ScBaseCell* pBC = pDok->GetCell(aAdr); + double fVal = GetCellValue(aAdr, pBC); + if ( nGlobalError ) { fVal = CreateDoubleError( nGlobalError); @@ -459,8 +463,7 @@ ScMatrixRef ScInterpreter::CreateMatrixFromDoubleRef( const FormulaToken* pToken continue; } - String aStr; - GetCellString( aStr, pCell); + String aStr = aCellIter.getString(); if ( nGlobalError ) { double fVal = CreateDoubleError( nGlobalError); diff --git a/sc/source/ui/view/viewfun4.cxx b/sc/source/ui/view/viewfun4.cxx index 944c508..d05795e 100644 --- a/sc/source/ui/view/viewfun4.cxx +++ b/sc/source/ui/view/viewfun4.cxx @@ -240,30 +240,29 @@ void ScViewFunc::DoRefConversion( sal_Bool bRecord ) aRange.aStart.SetTab(i); aRange.aEnd.SetTab(i); ScCellIterator aIter( pDoc, aRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while ( pCell ) + for (bool bHas = aIter.first(); bHas; bHas = aIter.next()) { - if (pCell->GetCellType() == CELLTYPE_FORMULA) + if (aIter.getType() != CELLTYPE_FORMULA) + continue; + + ScFormulaCell* pCell = aIter.getFormulaCell(); + OUString aOld; + pCell->GetFormula(aOld); + sal_Int32 nLen = aOld.getLength(); + ScRefFinder aFinder( aOld, aIter.GetPos(), pDoc, pDoc->GetAddressConvention() ); + aFinder.ToggleRel( 0, nLen ); + if (aFinder.GetFound()) { - rtl::OUString aOld; - ((ScFormulaCell*)pCell)->GetFormula(aOld); - xub_StrLen nLen = aOld.getLength(); - ScRefFinder aFinder( aOld, aIter.GetPos(), pDoc, pDoc->GetAddressConvention() ); - aFinder.ToggleRel( 0, nLen ); - if (aFinder.GetFound()) - { - ScAddress aPos = ((ScFormulaCell*)pCell)->aPos; - String aNew = aFinder.GetText(); - ScCompiler aComp( pDoc, aPos); - aComp.SetGrammar(pDoc->GetGrammar()); - ScTokenArray* pArr = aComp.CompileString( aNew ); - ScFormulaCell* pNewCell = new ScFormulaCell( pDoc, aPos, - pArr,formula::FormulaGrammar::GRAM_DEFAULT, MM_NONE ); - pDoc->SetFormulaCell(aPos, pNewCell); - bOk = true; - } + ScAddress aPos = pCell->aPos; + String aNew = aFinder.GetText(); + ScCompiler aComp( pDoc, aPos); + aComp.SetGrammar(pDoc->GetGrammar()); + ScTokenArray* pArr = aComp.CompileString( aNew ); + ScFormulaCell* pNewCell = new ScFormulaCell( pDoc, aPos, + pArr,formula::FormulaGrammar::GRAM_DEFAULT, MM_NONE ); + pDoc->SetFormulaCell(aPos, pNewCell); + bOk = true; } - pCell = aIter.GetNext(); } } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits