Author: kyoshida Date: Mon Feb 18 01:56:43 2008 New Revision: 11603 URL: http://svn.gnome.org/viewvc/ooo-build?rev=11603&view=rev
Log: experimental patch to handle text numbers as numbers in formulas. Added: trunk/patches/test/sc-formula-text-number.diff Added: trunk/patches/test/sc-formula-text-number.diff ============================================================================== --- (empty file) +++ trunk/patches/test/sc-formula-text-number.diff Mon Feb 18 01:56:43 2008 @@ -0,0 +1,252 @@ +diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx +index 40bfe0c..bdac8b4 100644 +--- sc/inc/dociter.hxx ++++ sc/inc/dociter.hxx +@@ -115,6 +115,7 @@ private: + BOOL bNextValid; + BOOL bCalcAsShown; + BOOL bTextAsZero; ++ SvNumberFormatter* pFormatter; + + BOOL GetThis(double& rValue, USHORT& rErr); + public: +@@ -134,6 +135,8 @@ public: + ++nColRow, bNumValid = FALSE, TRUE ) + : ( ++nRow, GetThis(rValue, rErr) ); + } ++ ++ void SetNumberFormatter(SvNumberFormatter* p); + }; + + class ScQueryValueIterator // alle Zahlenwerte in einem Bereich durchgehen +diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx +index 6a740cd..7a862ef 100644 +--- sc/source/core/data/dociter.cxx ++++ sc/source/core/data/dociter.cxx +@@ -243,7 +243,8 @@ ScValueIterator::ScValueIterator( ScDocument* pDocument, + bSubTotal(bSTotal), + bNextValid( FALSE ), + bCalcAsShown( pDocument->GetDocOptions().IsCalcAsShown() ), +- bTextAsZero( bTextZero ) ++ bTextAsZero( bTextZero ), ++ pFormatter( NULL ) + { + PutInOrder( nStartCol, nEndCol); + PutInOrder( nStartRow, nEndRow); +@@ -282,7 +283,8 @@ ScValueIterator::ScValueIterator( ScDocument* pDocument, const ScRange& rRange, + bSubTotal(bSTotal), + bNextValid( FALSE ), + bCalcAsShown( pDocument->GetDocOptions().IsCalcAsShown() ), +- bTextAsZero( bTextZero ) ++ bTextAsZero( bTextZero ), ++ pFormatter( NULL ) + { + PutInOrder( nStartCol, nEndCol); + PutInOrder( nStartRow, nEndRow); +@@ -342,79 +344,81 @@ BOOL ScValueIterator::GetThis(double& rValue, USHORT& rErr) + if ( !bSubTotal || !pDoc->pTab[nTab]->IsFiltered( nRow-1 ) ) + { + ScBaseCell* pCell = pCol->pItems[nColRow].pCell; ++ CellType eType = pCell->GetCellType(); + ++nColRow; +- switch (pCell->GetCellType()) +- { +- case CELLTYPE_VALUE: +- { +- bNumValid = FALSE; +- rValue = ((ScValueCell*)pCell)->GetValue(); +- rErr = 0; +- --nRow; +- if ( bCalcAsShown ) +- { +- lcl_IterGetNumberFormat( nNumFormat, pAttrArray, +- nAttrEndRow, pCol->pAttrArray, nRow, pDoc ); +- rValue = pDoc->RoundValueAsShown( rValue, nNumFormat ); +- } +- // +- // wenn in der selben Spalte gleich noch eine Value-Cell folgt, die +- // auch noch im Block liegt, den Wert jetzt schon holen +- // +- if ( nColRow < pCol->nCount && +- pCol->pItems[nColRow].nRow <= nEndRow && +- pCol->pItems[nColRow].pCell->GetCellType() == CELLTYPE_VALUE && +- !bSubTotal ) +- { +- fNextValue = ((ScValueCell*)pCol->pItems[nColRow].pCell)->GetValue(); +- nNextRow = pCol->pItems[nColRow].nRow; +- bNextValid = TRUE; +- if ( bCalcAsShown ) +- { +- lcl_IterGetNumberFormat( nNumFormat, pAttrArray, +- nAttrEndRow, pCol->pAttrArray, nNextRow, pDoc ); +- fNextValue = pDoc->RoundValueAsShown( fNextValue, nNumFormat ); +- } +- } + +- return TRUE; // gefunden +- } +-// break; +- case CELLTYPE_FORMULA: +- { +- if (!bSubTotal || !((ScFormulaCell*)pCell)->IsSubTotal()) +- { +- rErr = ((ScFormulaCell*)pCell)->GetErrCode(); +- if ( rErr || ((ScFormulaCell*)pCell)->IsValue() ) +- { +- rValue = ((ScFormulaCell*)pCell)->GetValue(); +- nRow--; +- bNumValid = FALSE; +- return TRUE; // gefunden +- } +- } +- } +- break; +- case CELLTYPE_STRING : +- case CELLTYPE_EDIT : +- { +- if ( bTextAsZero ) +- { +- rErr = 0; +- rValue = 0.0; +- nNumFmtType = NUMBERFORMAT_NUMBER; +- nNumFmtIndex = 0; +- bNumValid = TRUE; +- --nRow; +- return TRUE; +- } +- } +- break; +- default: ++ bool bNumberText = false; ++ double fTextNumVal = 0.0; ++ if ( !bTextAsZero && pFormatter && (eType == CELLTYPE_STRING || eType == CELLTYPE_EDIT) ) ++ { ++ // check and see if this a number text. ++ sal_uInt32 nFIndex = 0; ++ String aStr = pCell->GetStringData(); ++ if ( pFormatter->IsNumberFormat(aStr, nFIndex, fTextNumVal) ) ++ bNumberText = true; ++ } ++ ++ if (eType == CELLTYPE_VALUE || bNumberText) ++ { ++ bNumValid = FALSE; ++ rValue = bNumberText ? fTextNumVal : static_cast<ScValueCell*>(pCell)->GetValue(); ++ rErr = 0; ++ --nRow; ++ if ( bCalcAsShown ) + { +- // added to avoid warnings ++ lcl_IterGetNumberFormat( nNumFormat, pAttrArray, ++ nAttrEndRow, pCol->pAttrArray, nRow, pDoc ); ++ rValue = pDoc->RoundValueAsShown( rValue, nNumFormat ); + } +- } ++ // ++ // wenn in der selben Spalte gleich noch eine Value-Cell folgt, die ++ // auch noch im Block liegt, den Wert jetzt schon holen ++ // ++ if ( nColRow < pCol->nCount && ++ pCol->pItems[nColRow].nRow <= nEndRow && ++ pCol->pItems[nColRow].pCell->GetCellType() == CELLTYPE_VALUE && ++ !bSubTotal ) ++ { ++ fNextValue = ((ScValueCell*)pCol->pItems[nColRow].pCell)->GetValue(); ++ nNextRow = pCol->pItems[nColRow].nRow; ++ bNextValid = TRUE; ++ if ( bCalcAsShown ) ++ { ++ lcl_IterGetNumberFormat( nNumFormat, pAttrArray, ++ nAttrEndRow, pCol->pAttrArray, nNextRow, pDoc ); ++ fNextValue = pDoc->RoundValueAsShown( fNextValue, nNumFormat ); ++ } ++ } ++ ++ return TRUE; // gefunden ++ } ++ else if (eType == CELLTYPE_FORMULA) ++ { ++ if (!bSubTotal || !((ScFormulaCell*)pCell)->IsSubTotal()) ++ { ++ rErr = ((ScFormulaCell*)pCell)->GetErrCode(); ++ if ( rErr || ((ScFormulaCell*)pCell)->IsValue() ) ++ { ++ rValue = ((ScFormulaCell*)pCell)->GetValue(); ++ nRow--; ++ bNumValid = FALSE; ++ return TRUE; // gefunden ++ } ++ } ++ } ++ else if (eType == CELLTYPE_STRING || eType == CELLTYPE_EDIT) ++ { ++ if ( bTextAsZero ) ++ { ++ rErr = 0; ++ rValue = 0.0; ++ nNumFmtType = NUMBERFORMAT_NUMBER; ++ nNumFmtIndex = 0; ++ bNumValid = TRUE; ++ --nRow; ++ return TRUE; ++ } ++ } + } + } + else +@@ -472,6 +476,11 @@ BOOL ScValueIterator::GetFirst(double& rValue, USHORT& rErr) + return GetThis(rValue, rErr); + } + ++void ScValueIterator::SetNumberFormatter(SvNumberFormatter* p) ++{ ++ pFormatter = p; ++} ++ + /* ist inline: + BOOL ScValueIterator::GetNext(double& rValue, USHORT& rErr) + { +diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx +index 1dba9a8..4a0137d 100644 +--- sc/source/core/tool/interpr1.cxx ++++ sc/source/core/tool/interpr1.cxx +@@ -3080,16 +3080,27 @@ double ScInterpreter::IterateParameters( ScIterFunc eFunc, BOOL bTextAsZero ) + ScBaseCell* pCell = GetCell( aAdr ); + if ( pCell ) + { ++ bool bNumberText = false; ++ double fTextNumVal = 0.0; ++ if ( !bTextAsZero && pCell->HasStringData() ) ++ { ++ // check and see if this a number text. ++ sal_uInt32 nFIndex = 0; ++ String aStr = pCell->GetStringData(); ++ if ( pFormatter->IsNumberFormat(aStr, nFIndex, fTextNumVal) ) ++ bNumberText = true; ++ } ++ + if( eFunc == ifCOUNT2 ) + { + CellType eCellType = pCell->GetCellType(); + if (eCellType != CELLTYPE_NONE && eCellType != CELLTYPE_NOTE) + nCount++; + } +- else if ( pCell->HasValueData() ) ++ else if ( pCell->HasValueData() || bNumberText ) + { + nCount++; +- fVal = GetCellValue( aAdr, pCell ); ++ fVal = bNumberText ? fTextNumVal : GetCellValue( aAdr, pCell ); + CurFmtToFuncFmt(); + switch( eFunc ) + { +@@ -3139,6 +3150,7 @@ double ScInterpreter::IterateParameters( ScIterFunc eFunc, BOOL bTextAsZero ) + else + { + ScValueIterator aValIter( pDok, aRange, glSubTotal, bTextAsZero ); ++ aValIter.SetNumberFormatter(pFormatter); + if (aValIter.GetFirst(fVal, nErr)) + { + // Schleife aus Performance-Gruenden nach innen verlegt: +diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx +diff --git a/sc/source/ui/view/output.cxx b/sc/source/ui/view/output.cxx _______________________________________________ SVN-commits-list mailing list (read only) http://mail.gnome.org/mailman/listinfo/svn-commits-list Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want. Module maintainer? It is possible to set the reply-to to your development mailing list. Email [EMAIL PROTECTED] if interested.