From 3d6a7391466cf259127a9c3a9cd40a86fb85b719 Mon Sep 17 00:00:00 2001 From: Kohei Yoshida Date: Thu, 28 Mar 2013 14:22:46 -0400 Subject: Remove GetCell() from ScDocument, and make PutCell() private. At this point, only ScTable and ScFormulaCell call PutCell(). Make them friends of ScDocument (for now). Change-Id: I7b8795580eafe7ea0ba5a4325f531efe53a2ea5b --- sc/inc/document.hxx | 10 +-- sc/source/core/data/documen8.cxx | 30 +++---- sc/source/core/data/document.cxx | 173 ++++++++++++++++++--------------------- 3 files changed, 99 insertions(+), 114 deletions(-) (limited to 'sc') diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 840c7d12cace..d83f04468c63 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -215,6 +215,8 @@ friend class ScAttrRectIterator; friend class ScDocShell; friend class ScDocRowHeightUpdater; friend class ScColumnTextWidthIterator; +friend class ScFormulaCell; +friend class ScTable; typedef ::std::vector TableContainer; private: @@ -743,9 +745,6 @@ public: SC_DLLPUBLIC void EnsureTable( SCTAB nTab ); - SC_DLLPUBLIC void PutCell( const ScAddress&, ScBaseCell* pCell, bool bForceTab = false ); - SC_DLLPUBLIC void PutCell(SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell, - sal_uLong nFormatIndex, bool bForceTab = false); // return TRUE = number format is set SC_DLLPUBLIC bool SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const rtl::OUString& rString, @@ -853,8 +852,6 @@ public: SC_DLLPUBLIC void GetFormula( SCCOL nCol, SCROW nRow, SCTAB nTab, rtl::OUString& rFormula ) const; SC_DLLPUBLIC void GetCellType( SCCOL nCol, SCROW nRow, SCTAB nTab, CellType& rCellType ) const; SC_DLLPUBLIC CellType GetCellType( const ScAddress& rPos ) const; - SC_DLLPUBLIC void GetCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell*& rpCell ) const; - SC_DLLPUBLIC ScBaseCell* GetCell( const ScAddress& rPos ) const; SC_DLLPUBLIC bool HasData( SCCOL nCol, SCROW nRow, SCTAB nTab ); SC_DLLPUBLIC bool HasStringData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const; @@ -1976,6 +1973,9 @@ private: // CLOOK-Impl-methods bool HasPartOfMerged( const ScRange& rRange ); + void PutCell( const ScAddress&, ScBaseCell* pCell, bool bForceTab = false ); + void PutCell(SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell, sal_uLong nFormatIndex, bool bForceTab = false ); + std::map< SCTAB, ScSortParam > mSheetSortParams; }; diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 3dda38c104c5..5fe23dc5f75a 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -96,6 +96,7 @@ #define VSPL_START 0 #define VSPL_DONE 1 +using namespace com::sun::star; // STATIC DATA ----------------------------------------------------------- @@ -1613,14 +1614,15 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32 nTyp while (bFound) { - const ScBaseCell* pCell = GetCell( ScAddress( nCol, nRow, nTab ) ); - CellType eType = pCell ? pCell->GetCellType() : CELLTYPE_NONE; + ScRefCellValue aCell; + aCell.assign(*this, ScAddress(nCol, nRow, nTab)); + // fdo#32786 TITLE_CASE/SENTENCE_CASE need the extra handling in EditEngine (loop over words/sentences). // Still use TransliterationWrapper directly for text cells with other transliteration types, // for performance reasons. - if ( eType == CELLTYPE_EDIT || - ( eType == CELLTYPE_STRING && ( nType == com::sun::star::i18n::TransliterationModulesExtra::SENTENCE_CASE || - nType == com::sun::star::i18n::TransliterationModulesExtra::TITLE_CASE ) ) ) + if (aCell.meType == CELLTYPE_EDIT || + (aCell.meType == CELLTYPE_STRING && + ( nType == i18n::TransliterationModulesExtra::SENTENCE_CASE || nType == i18n::TransliterationModulesExtra::TITLE_CASE))) { if (!pEngine) pEngine = new ScFieldEditEngine(this, GetEnginePool(), GetEditPool()); @@ -1631,13 +1633,11 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32 nTyp pPattern->FillEditItemSet( pDefaults ); pEngine->SetDefaults( pDefaults, true ); - if ( eType == CELLTYPE_STRING ) - pEngine->SetText( static_cast(pCell)->GetString() ); - else - { - const EditTextObject* pData = static_cast(pCell)->GetData(); - pEngine->SetText( *pData ); - } + if (aCell.meType == CELLTYPE_STRING) + pEngine->SetText(*aCell.mpString); + else if (aCell.mpEditText) + pEngine->SetText(*aCell.mpEditText); + pEngine->ClearModifyFlag(); sal_uInt16 nLastPar = pEngine->GetParagraphCount(); @@ -1669,9 +1669,9 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32 nTyp } } - else if ( eType == CELLTYPE_STRING ) + else if (aCell.meType == CELLTYPE_STRING) { - rtl::OUString aOldStr = ((const ScStringCell*)pCell)->GetString(); + OUString aOldStr = *aCell.mpString; sal_Int32 nOldLen = aOldStr.getLength(); if ( bConsiderLanguage ) @@ -1683,7 +1683,7 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32 nTyp nLanguage = ((const SvxLanguageItem*)GetAttr( nCol, nRow, nTab, nWhich ))->GetValue(); } - com::sun::star::uno::Sequence aOffsets; + uno::Sequence aOffsets; rtl::OUString aNewStr = aTranslitarationWrapper.transliterate( aOldStr, nLanguage, 0, nOldLen, &aOffsets ); if ( aNewStr != aOldStr ) diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 0d82eb698f3a..9aa8e6a3bfae 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -3090,49 +3090,52 @@ sal_uInt16 ScDocument::GetStringForFormula( const ScAddress& rPos, OUString& rSt // ScInterpreter::GetCellString: always format values as numbers. // The return value is the error code. - sal_uInt16 nErr = 0; - String aStr; - ScBaseCell* pCell = GetCell( rPos ); - if (pCell) + ScRefCellValue aCell; + aCell.assign(*this, rPos); + if (aCell.isEmpty()) { - SvNumberFormatter* pFormatter = GetFormatTable(); - switch (pCell->GetCellType()) + rString = EMPTY_OUSTRING; + return 0; + } + + sal_uInt16 nErr = 0; + OUString aStr; + SvNumberFormatter* pFormatter = GetFormatTable(); + switch (aCell.meType) + { + case CELLTYPE_STRING: + case CELLTYPE_EDIT: + aStr = aCell.getString(); + break; + case CELLTYPE_FORMULA: { - case CELLTYPE_STRING: - aStr = static_cast(pCell)->GetString(); - break; - case CELLTYPE_EDIT: - aStr = static_cast(pCell)->GetString(); - break; - case CELLTYPE_FORMULA: + ScFormulaCell* pFCell = aCell.mpFormula; + nErr = pFCell->GetErrCode(); + if (pFCell->IsValue()) { - ScFormulaCell* pFCell = static_cast(pCell); - nErr = pFCell->GetErrCode(); - if (pFCell->IsValue()) - { - double fVal = pFCell->GetValue(); - sal_uInt32 nIndex = pFormatter->GetStandardFormat( - NUMBERFORMAT_NUMBER, - ScGlobal::eLnge); - pFormatter->GetInputLineString(fVal, nIndex, aStr); - } - else - aStr = pFCell->GetString(); - } - break; - case CELLTYPE_VALUE: - { - double fVal = static_cast(pCell)->GetValue(); + double fVal = pFCell->GetValue(); sal_uInt32 nIndex = pFormatter->GetStandardFormat( - NUMBERFORMAT_NUMBER, - ScGlobal::eLnge); + NUMBERFORMAT_NUMBER, + ScGlobal::eLnge); pFormatter->GetInputLineString(fVal, nIndex, aStr); } - break; - default: - ; + else + aStr = pFCell->GetString(); + } + break; + case CELLTYPE_VALUE: + { + double fVal = aCell.mfValue; + sal_uInt32 nIndex = pFormatter->GetStandardFormat( + NUMBERFORMAT_NUMBER, + ScGlobal::eLnge); + pFormatter->GetInputLineString(fVal, nIndex, aStr); } + break; + default: + ; } + rString = aStr; return nErr; } @@ -3305,30 +3308,6 @@ void ScDocument::GetCellType( SCCOL nCol, SCROW nRow, SCTAB nTab, rCellType = CELLTYPE_NONE; } - -void ScDocument::GetCell( SCCOL nCol, SCROW nRow, SCTAB nTab, - ScBaseCell*& rpCell ) const -{ - if (ValidTab(nTab) && nTab < static_cast(maTabs.size()) && maTabs[nTab]) - rpCell = maTabs[nTab]->GetCell( nCol, nRow ); - else - { - OSL_FAIL("GetCell without a table"); - rpCell = NULL; - } -} - - -ScBaseCell* ScDocument::GetCell( const ScAddress& rPos ) const -{ - SCTAB nTab = rPos.Tab(); - if (ValidTab(nTab) && nTab < static_cast(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetCell( rPos ); - - OSL_FAIL("GetCell without a table"); - return NULL; -} - bool ScDocument::HasStringData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { if ( ValidTab(nTab) && nTab < static_cast(maTabs.size()) && maTabs[nTab] ) @@ -5004,44 +4983,50 @@ bool ScDocument::GetMatrixFormulaRange( const ScAddress& rCellPos, ScRange& rMat { // if rCell is part of a matrix formula, return its complete range - bool bRet = false; - ScBaseCell* pCell = GetCell( rCellPos ); - if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA) + ScFormulaCell* pFCell = GetFormulaCell(rCellPos); + if (!pFCell) + // not a formula cell. Bail out. + return false; + + ScAddress aOrigin = rCellPos; + if (!pFCell->GetMatrixOrigin(aOrigin)) + // Failed to get the address of the matrix origin. + return false; + + if (aOrigin != rCellPos) { - ScAddress aOrigin = rCellPos; - if ( ((ScFormulaCell*)pCell)->GetMatrixOrigin( aOrigin ) ) - { - if ( aOrigin != rCellPos ) - pCell = GetCell( aOrigin ); - if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA) - { - SCCOL nSizeX; - SCROW nSizeY; - ((ScFormulaCell*)pCell)->GetMatColsRows(nSizeX,nSizeY); - if ( !(nSizeX > 0 && nSizeY > 0) ) - { - // GetMatrixEdge computes also dimensions of the matrix - // if not already done (may occur if document is loaded - // from old file format). - // Needs an "invalid" initialized address. - aOrigin.SetInvalid(); - ((ScFormulaCell*)pCell)->GetMatrixEdge(aOrigin); - ((ScFormulaCell*)pCell)->GetMatColsRows(nSizeX,nSizeY); - } - if ( nSizeX > 0 && nSizeY > 0 ) - { - ScAddress aEnd( aOrigin.Col() + nSizeX - 1, - aOrigin.Row() + nSizeY - 1, - aOrigin.Tab() ); + pFCell = GetFormulaCell(aOrigin); + if (!pFCell) + // The matrix origin cell is not a formula cell !? Something is up... + return false; + } - rMatrix.aStart = aOrigin; - rMatrix.aEnd = aEnd; - bRet = true; - } - } - } + SCCOL nSizeX; + SCROW nSizeY; + pFCell->GetMatColsRows(nSizeX, nSizeY); + if (nSizeX <= 0 || nSizeY <= 0) + { + // GetMatrixEdge computes also dimensions of the matrix + // if not already done (may occur if document is loaded + // from old file format). + // Needs an "invalid" initialized address. + aOrigin.SetInvalid(); + pFCell->GetMatrixEdge(aOrigin); + pFCell->GetMatColsRows(nSizeX, nSizeY); } - return bRet; + + if (nSizeX <= 0 || nSizeY <= 0) + // Matrix size is still invalid. Give up. + return false; + + ScAddress aEnd( aOrigin.Col() + nSizeX - 1, + aOrigin.Row() + nSizeY - 1, + aOrigin.Tab() ); + + rMatrix.aStart = aOrigin; + rMatrix.aEnd = aEnd; + + return true; } -- cgit