sc/inc/cellform.hxx | 6 + sc/inc/document.hxx | 11 +- sc/source/core/data/documen4.cxx | 2 sc/source/core/data/document.cxx | 19 ++- sc/source/core/tool/cellform.cxx | 98 ++++++++++++++++++ sc/source/core/tool/chartarr.cxx | 116 ++++++++-------------- sc/source/filter/xml/xmlcelli.cxx | 68 ++++++------ sc/source/filter/xml/xmlexprt.cxx | 39 +++---- sc/source/ui/Accessibility/AccessibleCellBase.cxx | 6 - sc/source/ui/unoobj/chart2uno.cxx | 15 -- 10 files changed, 229 insertions(+), 151 deletions(-)
New commits: commit acc9ac65bf2a2abe324f034077bebb06270ede98 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Wed Mar 20 00:01:54 2013 -0400 Reduce use of ScValueCell outside ScDocument. Change-Id: Ia1a39016e1389e551169ae8dda179cb38d30a42a diff --git a/sc/inc/cellform.hxx b/sc/inc/cellform.hxx index 6b76c7d..e6314fc 100644 --- a/sc/inc/cellform.hxx +++ b/sc/inc/cellform.hxx @@ -26,6 +26,8 @@ class ScBaseCell; class SvNumberFormatter; class Color; +class ScDocument; +class ScAddress; enum ScForceTextFmt { ftDontForce, // numbers as numbers @@ -45,6 +47,10 @@ public: ScForceTextFmt eForceTextFmt = ftDontForce, bool bUseStarFormat = false ); + static OUString GetString( + const ScDocument& rDoc, const ScAddress& rPos, sal_uLong nFormat, + Color** ppColor, SvNumberFormatter& rFormatter, bool bNullVals = true, + bool bFormula = false, ScForceTextFmt eForceTextFmt = ftDontForce, bool bUseStarFormat = false ); static void GetInputString( ScBaseCell* pCell, sal_uLong nFormat, rtl::OUString& rString, SvNumberFormatter& rFormatter ); diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index efecd06..6d00287 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -798,15 +798,16 @@ public: SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const ScMarkData& rMark); - SC_DLLPUBLIC OUString GetString( SCCOL nCol, SCROW nRow, SCTAB nTab ); + SC_DLLPUBLIC OUString GetString( SCCOL nCol, SCROW nRow, SCTAB nTab ) const; + OUString GetString( const ScAddress& rPos ) const; SC_DLLPUBLIC void GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rString ); SC_DLLPUBLIC void GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, rtl::OUString& rString ); sal_uInt16 GetStringForFormula( const ScAddress& rPos, rtl::OUString& rString ); - SC_DLLPUBLIC double GetValue( const ScAddress& ); - SC_DLLPUBLIC double GetValue( const SCCOL nCol, SCROW nRow, SCTAB nTab) { ScAddress aAdr(nCol, nRow, nTab); return GetValue(aAdr);} - SC_DLLPUBLIC void GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ); + SC_DLLPUBLIC double GetValue( const ScAddress& rPos ) const; + SC_DLLPUBLIC double GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { ScAddress aAdr(nCol, nRow, nTab); return GetValue(aAdr);} + SC_DLLPUBLIC void GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ) const; SC_DLLPUBLIC const EditTextObject* GetEditText( const ScAddress& rPos ) const; - SC_DLLPUBLIC double RoundValueAsShown( double fVal, sal_uLong nFormat ); + SC_DLLPUBLIC double RoundValueAsShown( double fVal, sal_uInt32 nFormat ) const; SC_DLLPUBLIC void GetNumberFormat( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt32& rFormat ) const; sal_uInt32 GetNumberFormat( const ScRange& rRange ) const; diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 6bd34a4..b34cc07 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -526,7 +526,7 @@ bool ScDocument::GetSelectionFunction( ScSubTotalFunc eFunc, return !aData.bError; } -double ScDocument::RoundValueAsShown( double fVal, sal_uLong nFormat ) +double ScDocument::RoundValueAsShown( double fVal, sal_uInt32 nFormat ) const { short nType; if ( (nType = GetFormatTable()->GetType( nFormat )) != NUMBERFORMAT_DATE diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 4515b2c..bdef0e0 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -3035,7 +3035,7 @@ void ScDocument::SetValue( const ScAddress& rPos, double fVal ) maTabs[rPos.Tab()]->SetValue(rPos.Col(), rPos.Row(), fVal); } -OUString ScDocument::GetString( SCCOL nCol, SCROW nRow, SCTAB nTab ) +OUString ScDocument::GetString( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) { @@ -3047,6 +3047,16 @@ OUString ScDocument::GetString( SCCOL nCol, SCROW nRow, SCTAB nTab ) return EMPTY_OUSTRING; } +OUString ScDocument::GetString( const ScAddress& rPos ) const +{ + if (!TableExists(rPos.Tab())) + return EMPTY_OUSTRING; + + OUString aStr; + maTabs[rPos.Tab()]->GetString(rPos.Col(), rPos.Row(), aStr); + return aStr; +} + void ScDocument::GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, OUString& rString ) { if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) @@ -3116,7 +3126,7 @@ sal_uInt16 ScDocument::GetStringForFormula( const ScAddress& rPos, OUString& rSt } -void ScDocument::GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ) +void ScDocument::GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ) const { if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) rValue = maTabs[nTab]->GetValue( nCol, nRow ); @@ -3133,11 +3143,11 @@ const EditTextObject* ScDocument::GetEditText( const ScAddress& rPos ) const return maTabs[nTab]->GetEditText(rPos.Col(), rPos.Row()); } -double ScDocument::GetValue( const ScAddress& rPos ) +double ScDocument::GetValue( const ScAddress& rPos ) const { SCTAB nTab = rPos.Tab(); if ( nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->GetValue( rPos ); + return maTabs[nTab]->GetValue(rPos.Col(), rPos.Row()); return 0.0; } @@ -3277,7 +3287,6 @@ ScBaseCell* ScDocument::GetCell( const ScAddress& rPos ) const return NULL; } - bool ScDocument::HasStringData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) diff --git a/sc/source/core/tool/cellform.cxx b/sc/source/core/tool/cellform.cxx index 54d3245..254bb43 100644 --- a/sc/source/core/tool/cellform.cxx +++ b/sc/source/core/tool/cellform.cxx @@ -32,8 +32,6 @@ // Err527 Workaround const ScFormulaCell* pLastFormulaTreeTop = 0; -// ----------------------------------------------------------------------- - void ScCellFormat::GetString( ScBaseCell* pCell, sal_uLong nFormat, OUString& rString, Color** ppColor, SvNumberFormatter& rFormatter, sal_Bool bNullVals, @@ -145,6 +143,102 @@ void ScCellFormat::GetString( ScBaseCell* pCell, sal_uLong nFormat, OUString& rS } } +OUString ScCellFormat::GetString( + const ScDocument& rDoc, const ScAddress& rPos, sal_uLong nFormat, Color** ppColor, + SvNumberFormatter& rFormatter, bool bNullVals, bool bFormula, ScForceTextFmt eForceTextFmt, + bool bUseStarFormat ) +{ + OUString aString; + *ppColor = NULL; + + CellType eType = rDoc.GetCellType(rPos); + switch (eType) + { + case CELLTYPE_STRING: + { + OUString aCellString = rDoc.GetString(rPos); + rFormatter.GetOutputString(aCellString, nFormat, aString, ppColor, bUseStarFormat); + } + break; + case CELLTYPE_EDIT: + { + OUString aCellString = rDoc.GetString(rPos); + rFormatter.GetOutputString(aCellString, nFormat, aString, ppColor); + } + break; + case CELLTYPE_VALUE: + { + double nValue = rDoc.GetValue(rPos); + if (!bNullVals && nValue == 0.0) aString = OUString(); + else + { + if (eForceTextFmt == ftCheck) + { + if (nFormat && rFormatter.IsTextFormat(nFormat)) eForceTextFmt = ftForce; + } + if (eForceTextFmt == ftForce) + { + OUString aTemp; + rFormatter.GetOutputString(nValue, 0, aTemp, ppColor); + rFormatter.GetOutputString(aTemp, nFormat, aString, ppColor); + } + else rFormatter.GetOutputString(nValue, nFormat, aString, ppColor, bUseStarFormat); + } + } + break; + case CELLTYPE_FORMULA: + { + ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(rDoc.GetCell(rPos)); + if (bFormula) + { + pFCell->GetFormula(aString); + } + else + { + // A macro started from the interpreter, which has + // access to Formular Cells, becomes a CellText, even if + // that triggers further interpretation, except if those + // cells are already being interpreted. + // IdleCalc generally doesn't trigger futher interpretation, + // as not to get Err522 (circular). + if (pFCell->GetDocument()->IsInInterpreter() && + (!pFCell->GetDocument()->GetMacroInterpretLevel() + || pFCell->IsRunning())) + { + aString = OUString("..."); + } + else + { + sal_uInt16 nErrCode = pFCell->GetErrCode(); + + // get the number format only after interpretation (GetErrCode): + if ((nFormat % SV_COUNTRY_LANGUAGE_OFFSET) == 0) nFormat = pFCell->GetStandardFormat(rFormatter, + nFormat); + + if (nErrCode != 0) aString = ScGlobal::GetErrorString(nErrCode); + else if (pFCell->IsEmptyDisplayedAsString()) aString = OUString(); + else if (pFCell->IsValue()) + { + double fValue = pFCell->GetValue(); + if (!bNullVals && fValue == 0.0) aString = OUString(); + else if (pFCell->IsHybridValueCell()) aString = pFCell->GetString(); + else rFormatter.GetOutputString(fValue, nFormat, aString, ppColor, bUseStarFormat); + } + else + { + OUString aCellString = pFCell->GetString(); + rFormatter.GetOutputString(aCellString, nFormat, aString, ppColor, bUseStarFormat); + } + } + } + } + break; + default: + ; + } + return aString; +} + void ScCellFormat::GetInputString( ScBaseCell* pCell, sal_uLong nFormat, OUString& rString, SvNumberFormatter& rFormatter ) { diff --git a/sc/source/core/tool/chartarr.cxx b/sc/source/core/tool/chartarr.cxx index cd49af3..e88c6c1 100644 --- a/sc/source/core/tool/chartarr.cxx +++ b/sc/source/core/tool/chartarr.cxx @@ -114,6 +114,40 @@ ScMemChart* ScChartArray::CreateMemChart() return CreateMemChartMulti(); // kann 0 Range besser ab als Single } +namespace { + +double getCellValue( const ScDocument& rDoc, const ScAddress& rPos, double fDefault, bool bCalcAsShown ) +{ + double fRet = fDefault; + + CellType eType = rDoc.GetCellType(rPos); + switch (eType) + { + case CELLTYPE_VALUE: + { + fRet = rDoc.GetValue(rPos); + if (bCalcAsShown && fRet != 0.0) + { + sal_uInt32 nFormat = rDoc.GetNumberFormat(rPos); + fRet = rDoc.RoundValueAsShown(fRet, nFormat); + } + } + break; + case CELLTYPE_FORMULA: + { + ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(rDoc.GetCell(rPos)); + if (!pFCell->GetErrCode() && pFCell->IsValue()) + fRet = pFCell->GetValue(); + } + break; + default: + ; + } + return fRet; +} + +} + ScMemChart* ScChartArray::CreateMemChartSingle() { SCSIZE nCol; @@ -221,35 +255,13 @@ ScMemChart* ScChartArray::CreateMemChartSingle() if ( bValidData ) { bool bCalcAsShown = pDocument->GetDocOptions().IsCalcAsShown(); - ScBaseCell* pCell; for (nCol=0; nCol<nColCount; nCol++) { for (nRow=0; nRow<nRowCount; nRow++) { - double nVal = DBL_MIN; // Hack for Chart to recognize empty cells - - pDocument->GetCell( aCols[nCol], aRows[nRow], nTab1, pCell ); - if (pCell) - { - CellType eType = pCell->GetCellType(); - if (eType == CELLTYPE_VALUE) - { - nVal = ((ScValueCell*)pCell)->GetValue(); - if ( bCalcAsShown && nVal != 0.0 ) - { - sal_uInt32 nFormat; - pDocument->GetNumberFormat( aCols[nCol], - aRows[nRow], nTab1, nFormat ); - nVal = pDocument->RoundValueAsShown( nVal, nFormat ); - } - } - else if (eType == CELLTYPE_FORMULA) - { - ScFormulaCell* pFCell = (ScFormulaCell*)pCell; - if ( (pFCell->GetErrCode() == 0) && pFCell->IsValue() ) - nVal = pFCell->GetValue(); - } - } + // DBL_MIN is a Hack for Chart to recognize empty cells. + ScAddress aPos(aCols[nCol], aRows[nRow], nTab1); + double nVal = getCellValue(*pDocument, aPos, DBL_MIN, bCalcAsShown); pMemChart->SetData(static_cast<short>(nCol), static_cast<short>(nRow), nVal); } } @@ -358,29 +370,10 @@ ScMemChart* ScChartArray::CreateMemChartMulti() { double nVal = DBL_MIN; // Hack for Chart to recognize empty cells const ScAddress* pPos = GetPositionMap()->GetPosition( nIndex ); - if ( pPos ) - { // sonst: Luecke - ScBaseCell* pCell = pDocument->GetCell( *pPos ); - if (pCell) - { - CellType eType = pCell->GetCellType(); - if (eType == CELLTYPE_VALUE) - { - nVal = ((ScValueCell*)pCell)->GetValue(); - if ( bCalcAsShown && nVal != 0.0 ) - { - sal_uLong nFormat = pDocument->GetNumberFormat( *pPos ); - nVal = pDocument->RoundValueAsShown( nVal, nFormat ); - } - } - else if (eType == CELLTYPE_FORMULA) - { - ScFormulaCell* pFCell = (ScFormulaCell*)pCell; - if ( (pFCell->GetErrCode() == 0) && pFCell->IsValue() ) - nVal = pFCell->GetValue(); - } - } - } + if (pPos) + // otherwise: Gap + nVal = getCellValue(*pDocument, *pPos, DBL_MIN, bCalcAsShown); + pMemChart->SetData(static_cast<short>(nCol), static_cast<short>(nRow), nVal); } } @@ -391,29 +384,10 @@ ScMemChart* ScChartArray::CreateMemChartMulti() { double nVal = DBL_MIN; // Hack for Chart to recognize empty cells const ScAddress* pPos = GetPositionMap()->GetPosition( nIndex ); - if ( pPos ) - { // otherwise: Gap - ScBaseCell* pCell = pDocument->GetCell( *pPos ); - if (pCell) - { - CellType eType = pCell->GetCellType(); - if (eType == CELLTYPE_VALUE) - { - nVal = ((ScValueCell*)pCell)->GetValue(); - if ( bCalcAsShown && nVal != 0.0 ) - { - sal_uLong nFormat = pDocument->GetNumberFormat( *pPos ); - nVal = pDocument->RoundValueAsShown( nVal, nFormat ); - } - } - else if (eType == CELLTYPE_FORMULA) - { - ScFormulaCell* pFCell = (ScFormulaCell*)pCell; - if ( (pFCell->GetErrCode() == 0) && pFCell->IsValue() ) - nVal = pFCell->GetValue(); - } - } - } + if (pPos) + // otherwise: Gap + nVal = getCellValue(*pDocument, *pPos, DBL_MIN, bCalcAsShown); + pMemChart->SetData(static_cast<short>(nCol), static_cast<short>(nRow), nVal); } } diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index 6d376a7..86abcfb 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -1093,22 +1093,17 @@ void ScXMLTableRowCellContext::PutValueCell( const ScAddress& rCurrentPos ) ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell); SetFormulaCell(pFCell); } - } else //regular value cell { - // #i62435# Initialize the value cell's script type - // if the default style's number format is latin-only. - // If the cell uses a different format, the script type - // will be reset when the style is applied. + // #i62435# Initialize the value cell's script type if the default + // style's number format is latin-only. If the cell uses a different + // format, the script type will be reset when the style is applied. - ScBaseCell* pNewCell = new ScValueCell(fValue); ScDocument* pDoc = rXMLImport.GetDocument(); + pDoc->SetValue(rCurrentPos, fValue); if ( rXMLImport.IsLatinDefaultStyle() ) pDoc->SetScriptType(rCurrentPos, SCRIPTTYPE_LATIN); - pDoc->PutCell( - rCurrentPos.Col(), rCurrentPos.Row(), - rCurrentPos.Tab(), pNewCell ); } rXMLImport.ProgressBarIncrement(false); } @@ -1227,38 +1222,43 @@ bool ScXMLTableRowCellContext::CellsAreRepeated() const namespace { // from ScCellObj::GetOutputString_Imp(). all of it may not be necessary. -rtl::OUString getOutputString(ScDocument* pDoc, const ScAddress& aCellPos) +OUString getOutputString( ScDocument* pDoc, const ScAddress& aCellPos ) { - rtl::OUString aVal; - if ( pDoc ) + if (!pDoc) + return EMPTY_OUSTRING; + + CellType eType = pDoc->GetCellType(aCellPos); + switch (eType) { - ScBaseCell* pCell = pDoc->GetCell( aCellPos ); - if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE ) + case CELLTYPE_NONE: + case CELLTYPE_NOTE: + return EMPTY_OUSTRING; + case CELLTYPE_EDIT: { - if ( pCell->GetCellType() == CELLTYPE_EDIT ) + // GetString an der EditCell macht Leerzeichen aus Umbruechen, + // hier werden die Umbrueche aber gebraucht + const EditTextObject* pData = pDoc->GetEditText(aCellPos); + if (pData) { - // GetString an der EditCell macht Leerzeichen aus Umbruechen, - // hier werden die Umbrueche aber gebraucht - const EditTextObject* pData = static_cast<ScEditCell*>(pCell)->GetData(); - if (pData) - { - EditEngine& rEngine = pDoc->GetEditEngine(); - rEngine.SetText( *pData ); - aVal = rEngine.GetText( LINEEND_LF ); - } - // Edit-Zellen auch nicht per NumberFormatter formatieren - // (passend zur Ausgabe) - } - else - { - // wie in GetString am Dokument (column) - Color* pColor; - sal_uLong nNumFmt = pDoc->GetNumberFormat( aCellPos ); - ScCellFormat::GetString( pCell, nNumFmt, aVal, &pColor, *pDoc->GetFormatTable() ); + EditEngine& rEngine = pDoc->GetEditEngine(); + rEngine.SetText(*pData); + return rEngine.GetText(LINEEND_LF); } + // Edit-Zellen auch nicht per NumberFormatter formatieren + // (passend zur Ausgabe) + } + break; + default: + { + // wie in GetString am Dokument (column) + Color* pColor; + sal_uLong nNumFmt = pDoc->GetNumberFormat(aCellPos); + return ScCellFormat::GetString( + *pDoc, aCellPos, nNumFmt, &pColor, *pDoc->GetFormatTable()); } } - return aVal; + + return EMPTY_OUSTRING; } } diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 3fd048b..dd727ae 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -183,30 +183,31 @@ OUString lcl_GetRawString( ScDocument* pDoc, const ScAddress& rPos ) { // return text/edit cell string content, with line feeds in edit cells - String aVal; // document uses tools-strings - if (pDoc) + if (!pDoc) + return EMPTY_OUSTRING; + + switch (pDoc->GetCellType(rPos)) { - ScBaseCell* pCell = pDoc->GetCell( rPos ); - if (pCell) + case CELLTYPE_STRING: + return pDoc->GetString(rPos); + case CELLTYPE_EDIT: { - CellType eType = pCell->GetCellType(); - if ( eType == CELLTYPE_STRING ) - aVal = static_cast<ScStringCell*>(pCell)->GetString(); // string cell: content - else if ( eType == CELLTYPE_EDIT ) - { - // edit cell: text with line breaks - const EditTextObject* pData = static_cast<ScEditCell*>(pCell)->GetData(); - if (pData) - { - EditEngine& rEngine = pDoc->GetEditEngine(); - rEngine.SetText( *pData ); - aVal = rEngine.GetText( LINEEND_LF ); - } - } + const EditTextObject* pData = pDoc->GetEditText(rPos); + if (!pData) + return EMPTY_OUSTRING; + + EditEngine& rEngine = pDoc->GetEditEngine(); + rEngine.SetText(*pData); + return rEngine.GetText(LINEEND_LF); } + break; + default: + ; } - return aVal; + + return EMPTY_OUSTRING; } + } // anonymous namespace //---------------------------------------------------------------------------- diff --git a/sc/source/ui/Accessibility/AccessibleCellBase.cxx b/sc/source/ui/Accessibility/AccessibleCellBase.cxx index b9a0e08..a109f4f 100644 --- a/sc/source/ui/Accessibility/AccessibleCellBase.cxx +++ b/sc/source/ui/Accessibility/AccessibleCellBase.cxx @@ -244,10 +244,10 @@ sal_Bool SAL_CALL ScAccessibleCellBase::setCurrentValue( const uno::Any& aNumber ) throw (uno::RuntimeException) { - SolarMutexGuard aGuard; + SolarMutexGuard aGuard; IsObjectValid(); double fValue = 0; - sal_Bool bResult(false); + bool bResult = false; if((aNumber >>= fValue) && mpDoc && mpDoc->GetDocumentShell()) { uno::Reference<XAccessibleStateSet> xParentStates; @@ -259,7 +259,7 @@ sal_Bool SAL_CALL if (IsEditable(xParentStates)) { ScDocShell* pDocShell = (ScDocShell*) mpDoc->GetDocumentShell(); - bResult = pDocShell->GetDocFunc().PutCell( maCellAddress, new ScValueCell(fValue), sal_True ); + bResult = pDocShell->GetDocFunc().PutCell( maCellAddress, new ScValueCell(fValue), true); } } return bResult; diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index 9282a27..fcb7121 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -2597,24 +2597,17 @@ void ScChart2DataSequence::BuildDataCache() ++nDataCount; ScAddress aAdr(nCol, nRow, nTab); - ScBaseCell* pCell = m_pDocument->GetCell(aAdr); - if (!pCell) - continue; - - if (pCell->HasStringData()) - rItem.maString = pCell->GetStringData(); - else - rItem.maString = m_pDocument->GetString(nCol, nRow, nTab); + rItem.maString = m_pDocument->GetString(aAdr); - switch (pCell->GetCellType()) + switch (m_pDocument->GetCellType(aAdr)) { case CELLTYPE_VALUE: - rItem.mfValue = static_cast< ScValueCell*>(pCell)->GetValue(); + rItem.mfValue = m_pDocument->GetValue(aAdr); rItem.mbIsValue = true; break; case CELLTYPE_FORMULA: { - ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell); + ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(m_pDocument->GetCell(aAdr)); sal_uInt16 nErr = pFCell->GetErrCode(); if (nErr) break; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits