diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-09 22:12:12 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-11 12:14:26 -0400 |
commit | 7c6848845f10dbac392bfc3dccf405d8e8e969fc (patch) | |
tree | 244be09abf7382fd404e70ea111b0792a0167a14 /sc | |
parent | f793daf81c64690dcca0772ece07d9ead96d0d0b (diff) |
Properly intern strings going into matrix objects.
Change-Id: Ieb8befa4f19ebc31f4afa1370c924b469aa77382
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/externalrefmgr.hxx | 13 | ||||
-rw-r--r-- | sc/source/core/data/column2.cxx | 14 | ||||
-rw-r--r-- | sc/source/core/data/validat.cxx | 2 | ||||
-rw-r--r-- | sc/source/core/inc/interpre.hxx | 7 | ||||
-rw-r--r-- | sc/source/core/tool/ddelink.cxx | 5 | ||||
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 36 | ||||
-rw-r--r-- | sc/source/core/tool/interpr2.cxx | 7 | ||||
-rw-r--r-- | sc/source/core/tool/interpr4.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/tool/interpr5.cxx | 67 | ||||
-rw-r--r-- | sc/source/filter/excel/excform.cxx | 5 | ||||
-rw-r--r-- | sc/source/filter/excel/xihelper.cxx | 6 | ||||
-rw-r--r-- | sc/source/filter/excel/xilink.cxx | 19 | ||||
-rw-r--r-- | sc/source/filter/inc/xihelper.hxx | 8 | ||||
-rw-r--r-- | sc/source/filter/inc/xilink.hxx | 14 | ||||
-rw-r--r-- | sc/source/ui/docshell/externalrefmgr.cxx | 22 |
15 files changed, 135 insertions, 94 deletions
diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx index 9852b60c3507..df794bd3af23 100644 --- a/sc/inc/externalrefmgr.hxx +++ b/sc/inc/externalrefmgr.hxx @@ -49,6 +49,12 @@ class ScFormulaCell; class ScExternalRefCache; +namespace svl { + +class SharedStringPool; + +} + class ScExternalRefLink : public ::sfx2::SvBaseLink { public: @@ -195,7 +201,7 @@ public: typedef ::boost::unordered_map< OUString, size_t, OUStringHash> TableNameIndexMap; - ScExternalRefCache(); + ScExternalRefCache(svl::SharedStringPool& rPool); ~ScExternalRefCache(); const OUString* getRealTableName(sal_uInt16 nFileId, const OUString& rTabName) const; @@ -334,6 +340,7 @@ private: DocItem* getDocItem(sal_uInt16 nFileId) const; private: + svl::SharedStringPool& mrStrPool;; mutable DocDataType maDocs; }; @@ -756,11 +763,11 @@ private: private: + ScDocument* mpDoc; + /** cache of referenced ranges and names from source documents. */ ScExternalRefCache maRefCache; - ScDocument* mpDoc; - /** * Source document cache. This stores the original source document shell * instances. They get purged after a certain period of time. diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 3af1cf99a10e..62cd53857076 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1876,10 +1876,12 @@ class ToMatrixHandler ScMatrix& mrMat; SCCOL mnMatCol; SCROW mnTopRow; - const ScDocument* mpDoc; + ScDocument* mpDoc; + svl::SharedStringPool& mrStrPool; public: - ToMatrixHandler(ScMatrix& rMat, SCCOL nMatCol, SCROW nTopRow, const ScDocument* pDoc) : - mrMat(rMat), mnMatCol(nMatCol), mnTopRow(nTopRow), mpDoc(pDoc) {} + ToMatrixHandler(ScMatrix& rMat, SCCOL nMatCol, SCROW nTopRow, ScDocument* pDoc) : + mrMat(rMat), mnMatCol(nMatCol), mnTopRow(nTopRow), + mpDoc(pDoc), mrStrPool(pDoc->GetSharedStringPool()) {} void operator() (size_t nRow, double fVal) { @@ -1893,17 +1895,17 @@ public: if (rCell.IsValue()) mrMat.PutDouble(rCell.GetValue(), mnMatCol, nRow - mnTopRow); else - mrMat.PutString(rCell.GetString(), mnMatCol, nRow - mnTopRow); + mrMat.PutString(mrStrPool.intern(rCell.GetString()), mnMatCol, nRow - mnTopRow); } void operator() (size_t nRow, const svl::SharedString& rSS) { - mrMat.PutString(rSS.getString(), mnMatCol, nRow - mnTopRow); + mrMat.PutString(rSS, mnMatCol, nRow - mnTopRow); } void operator() (size_t nRow, const EditTextObject* pStr) { - mrMat.PutString(ScEditUtil::GetString(*pStr, mpDoc), mnMatCol, nRow - mnTopRow); + mrMat.PutString(mrStrPool.intern(ScEditUtil::GetString(*pStr, mpDoc)), mnMatCol, nRow - mnTopRow); } }; diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx index c27b25c8242a..9c24d966cae6 100644 --- a/sc/source/core/data/validat.cxx +++ b/sc/source/core/data/validat.cxx @@ -661,7 +661,7 @@ bool ScValidationData::GetSelectionFromFormula( else { OUString aStr = aValidationSrc.GetString(); - xMatRef->PutString( aStr, 0); + xMatRef->PutString(pDocument->GetSharedStringPool().intern(aStr), 0); } pValues = xMatRef.get(); diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index 1935c3b54560..975ba25e3461 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -57,6 +57,12 @@ struct RangeMatrix; } +namespace svl { + +class SharedStringPool; + +} + #define MAXSTACK (4096 / sizeof(formula::FormulaToken*)) class ScTokenStack @@ -145,6 +151,7 @@ private: ScAddress aPos; ScTokenArray& rArr; ScDocument* pDok; + svl::SharedStringPool& mrStrPool; formula::FormulaTokenRef xResult; ScJumpMatrix* pJumpMatrix; // currently active array condition, if any ScTokenMatrixMap* pTokenMatrixMap; // map ScToken* to formula::FormulaTokenRef if in array condition diff --git a/sc/source/core/tool/ddelink.cxx b/sc/source/core/tool/ddelink.cxx index 743753713be0..e8ecfbde018d 100644 --- a/sc/source/core/tool/ddelink.cxx +++ b/sc/source/core/tool/ddelink.cxx @@ -21,7 +21,7 @@ #include <sfx2/linkmgr.hxx> #include <sfx2/bindings.hxx> #include <svl/zforlist.hxx> -#include "svl/sharedstring.hxx" +#include "svl/sharedstringpool.hxx" #include "ddelink.hxx" #include "brdcst.hxx" @@ -158,6 +158,7 @@ sfx2::SvBaseLink::UpdateResult ScDdeLink::DataChanged( pResult = new ScMatrix(nCols, nRows, 0.0); SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); + svl::SharedStringPool& rPool = pDoc->GetSharedStringPool(); // nMode bestimmt, wie der Text interpretiert wird (#44455#/#49783#): // SC_DDE_DEFAULT - Zahlformat aus Zellvorlage "Standard" @@ -188,7 +189,7 @@ sfx2::SvBaseLink::UpdateResult ScDdeLink::DataChanged( // empty cell pResult->PutEmpty(nC, nR); else - pResult->PutString(svl::SharedString(aEntry), nC, nR); + pResult->PutString(rPool.intern(aEntry), nC, nR); } } } diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 314c2caa59a8..520ef1f71a6f 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -248,7 +248,8 @@ void ScInterpreter::ScIfJump() /** Store a matrix value in another matrix in the context of that other matrix is the result matrix of a jump matrix. All arguments must be valid and are not checked. */ -static void lcl_storeJumpMatResult( const ScMatrix* pMat, ScMatrix* pResMat, SCSIZE nC, SCSIZE nR ) +static void lcl_storeJumpMatResult( + svl::SharedStringPool& rPool, const ScMatrix* pMat, ScMatrix* pResMat, SCSIZE nC, SCSIZE nR ) { if ( pMat->IsValue( nC, nR ) ) { @@ -262,7 +263,7 @@ static void lcl_storeJumpMatResult( const ScMatrix* pMat, ScMatrix* pResMat, SCS else { const OUString& rStr = pMat->GetString(nC, nR); - pResMat->PutString(svl::SharedString(rStr), nC, nR); + pResMat->PutString(rPool.intern(rStr), nC, nR); } } @@ -379,7 +380,7 @@ void ScInterpreter::ScIfError( bool bNAonly ) { for ( ; nR < nRows && (nC != nErrorCol || nR != nErrorRow); ++nR) { - lcl_storeJumpMatResult( pMatPtr, pResMatPtr, nC, nR); + lcl_storeJumpMatResult(mrStrPool, pMatPtr, pResMatPtr, nC, nR); } if (nC != nErrorCol || nR != nErrorRow) ++nC; @@ -396,7 +397,7 @@ void ScInterpreter::ScIfError( bool bNAonly ) } else { // FALSE, EMPTY path, store result instead - lcl_storeJumpMatResult( pMatPtr, pResMatPtr, nC, nR); + lcl_storeJumpMatResult(mrStrPool, pMatPtr, pResMatPtr, nC, nR); } } } @@ -600,7 +601,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel ) nGlobalError = 0; } else - pResMat->PutString( rStr, nC, nR ); + pResMat->PutString(mrStrPool.intern(rStr), nC, nR); } break; case svSingleRef: @@ -641,7 +642,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel ) nGlobalError = 0; } else - pResMat->PutString( aStr, nC, nR); + pResMat->PutString(mrStrPool.intern(aStr), nC, nR); } } } @@ -709,7 +710,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel ) nGlobalError = 0; } else - pResMat->PutString( aStr, nC, nR ); + pResMat->PutString(mrStrPool.intern(aStr), nC, nR); } } SCSIZE nParmCols = aRange.aEnd.Col() - aRange.aStart.Col() + 1; @@ -745,7 +746,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel ) } else { - lcl_storeJumpMatResult( pMat.get(), pResMat.get(), nC, nR); + lcl_storeJumpMatResult(mrStrPool, pMat.get(), pResMat.get(), nC, nR); } lcl_AdjustJumpMatrix( pJumpMatrix, pResMat, nCols, nRows ); } @@ -1181,7 +1182,7 @@ sc::RangeMatrix ScInterpreter::CompareMat( ScCompareOptions* pOptions ) aRes.mpMat->PutDouble(CompareFunc(aComp, pOptions), j, k); } else - aRes.mpMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), j, k); + aRes.mpMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), j, k); } } } @@ -1721,7 +1722,7 @@ void ScInterpreter::ScNeg() pResMat->PutDouble( -pMat->GetDouble(i,j), i, j ); else pResMat->PutString( - ScGlobal::GetRscString( STR_NO_VALUE ), i, j ); + mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i, j); } } PushMatrix( pResMat ); @@ -1777,7 +1778,7 @@ void ScInterpreter::ScNot() pResMat->PutDouble( (pMat->GetDouble(i,j) == 0.0), i, j ); else pResMat->PutString( - ScGlobal::GetRscString( STR_NO_VALUE ), i, j ); + mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i, j); } } PushMatrix( pResMat ); @@ -4899,7 +4900,7 @@ double ScInterpreter::IterateParametersIf( ScIterFuncIf eFunc ) if (pToken->GetType() == svDouble) pSumExtraMatrix->PutDouble(pToken->GetDouble(), 0, 0); else - pSumExtraMatrix->PutString(pToken->GetString(), 0, 0); + pSumExtraMatrix->PutString(mrStrPool.intern(pToken->GetString()), 0, 0); } break; case svExternalDoubleRef: @@ -6151,7 +6152,7 @@ void ScInterpreter::ScLookup() if (pDataMat->IsValue(0, i)) pTempMat->PutDouble(pDataMat->GetDouble(0, i), 0, i); else - pTempMat->PutString(pDataMat->GetString(0, i), 0, i); + pTempMat->PutString(mrStrPool.intern(pDataMat->GetString(0, i)), 0, i); pDataMat2 = pTempMat; } else @@ -6161,7 +6162,7 @@ void ScInterpreter::ScLookup() if (pDataMat->IsValue(i, 0)) pTempMat->PutDouble(pDataMat->GetDouble(i, 0), i, 0); else - pTempMat->PutString(pDataMat->GetString(i, 0), i, 0); + pTempMat->PutString(mrStrPool.intern(pDataMat->GetString(i, 0)), i, 0); pDataMat2 = pTempMat; } @@ -7630,8 +7631,8 @@ void ScInterpreter::ScIndex() pResMat->PutDouble(pMat->GetDouble(i, nRowMinus1), i, 0); else - pResMat->PutString(pMat->GetString(i, - nRowMinus1), i, 0); + pResMat->PutString( + mrStrPool.intern(pMat->GetString(i, nRowMinus1)), i, 0); PushMatrix(pResMat); } else @@ -7648,8 +7649,7 @@ void ScInterpreter::ScIndex() pResMat->PutDouble(pMat->GetDouble(nColMinus1, i), i); else - pResMat->PutString(pMat->GetString(nColMinus1, - i), i); + pResMat->PutString(mrStrPool.intern(pMat->GetString(nColMinus1, i)), i); PushMatrix(pResMat); } else diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx index a915394dc8f9..3797c42ddcbe 100644 --- a/sc/source/core/tool/interpr2.cxx +++ b/sc/source/core/tool/interpr2.cxx @@ -25,6 +25,7 @@ #include <sfx2/objsh.hxx> #include <svl/stritem.hxx> #include <svl/zforlist.hxx> +#include "svl/sharedstringpool.hxx" #include <sal/macros.h> #include "attrib.hxx" @@ -2515,13 +2516,13 @@ void ScInterpreter::ScHyperLink() if (ScMatrix::IsValueType( nResultType)) pResMat->PutDouble( fVal, 0); else if (ScMatrix::IsRealStringType( nResultType)) - pResMat->PutString( aStr, 0); + pResMat->PutString(mrStrPool.intern(aStr), 0); else // EmptyType, EmptyPathType, mimic xcl pResMat->PutDouble( 0.0, 0 ); } else - pResMat->PutString(svl::SharedString(aUrl), 0); - pResMat->PutString(svl::SharedString(aUrl), 1); + pResMat->PutString(mrStrPool.intern(aUrl), 0); + pResMat->PutString(mrStrPool.intern(aUrl), 1); bMatrixFormula = true; PushMatrix(pResMat); } diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 8a6652ddce8b..7aadff11b6a1 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -31,6 +31,7 @@ #include <basic/sbxobj.hxx> #include <basic/sbuno.hxx> #include <svl/zforlist.hxx> +#include "svl/sharedstringpool.hxx" #include <stdlib.h> #include <string.h> #include <signal.h> @@ -3377,7 +3378,7 @@ void ScInterpreter::ScMacro() } else { - pMat->PutString( pV->GetOUString(), i, j ); + pMat->PutString(mrStrPool.intern(pV->GetOUString()), i, j); } } } @@ -3688,6 +3689,7 @@ ScInterpreter::ScInterpreter( ScFormulaCell* pCell, ScDocument* pDoc, aPos( rPos ), rArr( r ), pDok( pDoc ), + mrStrPool(pDoc->GetSharedStringPool()), pTokenMatrixMap( NULL ), pMyFormulaCell( pCell ), pFormatter( pDoc->GetFormatTable() ), diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx index 95c386ce18f8..e9cd3b3f8045 100644 --- a/sc/source/core/tool/interpr5.cxx +++ b/sc/source/core/tool/interpr5.cxx @@ -401,7 +401,7 @@ ScMatrixRef ScInterpreter::GetMatrix() { OUString aStr; GetCellString(aStr, aCell); - pMat->PutString(aStr, 0); + pMat->PutString(mrStrPool.intern(aStr), 0); } } } @@ -450,7 +450,7 @@ ScMatrixRef ScInterpreter::GetMatrix() nGlobalError = 0; } else - pMat->PutString(svl::SharedString(aStr), 0); + pMat->PutString(mrStrPool.intern(aStr), 0); } } break; @@ -472,7 +472,7 @@ ScMatrixRef ScInterpreter::GetMatrix() else if (pToken->GetType() == svString) { pMat = new ScMatrix(1, 1, 0.0); - pMat->PutString(pToken->GetString(), 0, 0); + pMat->PutString(mrStrPool.intern(pToken->GetString()), 0, 0); } else { @@ -1029,7 +1029,8 @@ static inline SCSIZE lcl_GetMinExtent( SCSIZE n1, SCSIZE n2 ) template<class _Function> static ScMatrixRef lcl_MatrixCalculation( - const ScMatrix& rMat1, const ScMatrix& rMat2, ScInterpreter* pInterpreter) + svl::SharedStringPool& rPool, + const ScMatrix& rMat1, const ScMatrix& rMat2, ScInterpreter* pInterpreter) { static _Function Op; @@ -1053,7 +1054,7 @@ static ScMatrixRef lcl_MatrixCalculation( xResMat->PutDouble( d, i, j); } else - xResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i, j); + xResMat->PutString(rPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i, j); } } } @@ -1085,7 +1086,7 @@ ScMatrixRef ScInterpreter::MatConcat(const ScMatrixRef& pMat1, const ScMatrixRef { OUString aTmp = pMat1->GetString(*pFormatter, i, j); aTmp += pMat2->GetString( *pFormatter, i, j); - xResMat->PutString(svl::SharedString(aTmp), i, j); + xResMat->PutString(mrStrPool.intern(aTmp), i, j); } } } @@ -1181,11 +1182,11 @@ void ScInterpreter::CalculateAddSub(bool _bSub) ScMatrixRef pResMat; if ( _bSub ) { - pResMat = lcl_MatrixCalculation<MatrixSub>(*pMat1, *pMat2, this); + pResMat = lcl_MatrixCalculation<MatrixSub>(mrStrPool, *pMat1, *pMat2, this); } else { - pResMat = lcl_MatrixCalculation<MatrixAdd>(*pMat1, *pMat2, this); + pResMat = lcl_MatrixCalculation<MatrixAdd>(mrStrPool, *pMat1, *pMat2, this); } if (!pResMat) @@ -1222,7 +1223,7 @@ void ScInterpreter::CalculateAddSub(bool _bSub) if (pMat->IsValue(i)) pResMat->PutDouble( _bSub ? ::rtl::math::approxSub( fVal, pMat->GetDouble(i)) : ::rtl::math::approxAdd( pMat->GetDouble(i), fVal), i); else - pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i); } // for ( SCSIZE i = 0; i < nCount; i++ ) } // if (bFlag || !_bSub ) else @@ -1231,7 +1232,7 @@ void ScInterpreter::CalculateAddSub(bool _bSub) { if (pMat->IsValue(i)) pResMat->PutDouble( ::rtl::math::approxSub( pMat->GetDouble(i), fVal), i); else - pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i); } // for ( SCSIZE i = 0; i < nCount; i++ ) } PushMatrix(pResMat); @@ -1316,7 +1317,7 @@ void ScInterpreter::ScAmpersand() { OUString aTmp = sStr; aTmp += pMat->GetString( *pFormatter, i, j); - pResMat->PutString(svl::SharedString(aTmp), i, j); + pResMat->PutString(mrStrPool.intern(aTmp), i, j); } } } @@ -1332,7 +1333,7 @@ void ScInterpreter::ScAmpersand() { OUString aTmp = pMat->GetString(*pFormatter, i, j); aTmp += sStr; - pResMat->PutString(svl::SharedString(aTmp), i, j); + pResMat->PutString(mrStrPool.intern(aTmp), i, j); } } } @@ -1389,7 +1390,7 @@ void ScInterpreter::ScMul() } if (pMat1 && pMat2) { - ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixMul>(*pMat1, *pMat2, this); + ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixMul>(mrStrPool, *pMat1, *pMat2, this); if (!pResMat) PushNoValue(); else @@ -1416,7 +1417,7 @@ void ScInterpreter::ScMul() if (pMat->IsValue(i)) pResMat->PutDouble(pMat->GetDouble(i)*fVal, i); else - pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i); PushMatrix(pResMat); } else @@ -1462,7 +1463,7 @@ void ScInterpreter::ScDiv() } if (pMat1 && pMat2) { - ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixDiv>(*pMat1, *pMat2, this); + ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixDiv>(mrStrPool, *pMat1, *pMat2, this); if (!pResMat) PushNoValue(); else @@ -1495,14 +1496,14 @@ void ScInterpreter::ScDiv() if (pMat->IsValue(i)) pResMat->PutDouble( div( fVal, pMat->GetDouble(i)), i); else - pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i); } else { for ( SCSIZE i = 0; i < nCount; i++ ) if (pMat->IsValue(i)) pResMat->PutDouble( div( pMat->GetDouble(i), fVal), i); else - pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i); } PushMatrix(pResMat); } @@ -1541,7 +1542,7 @@ void ScInterpreter::ScPow() fVal1 = GetDouble(); if (pMat1 && pMat2) { - ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixPow>(*pMat1, *pMat2, this); + ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixPow>(mrStrPool, *pMat1, *pMat2, this); if (!pResMat) PushNoValue(); else @@ -1574,14 +1575,14 @@ void ScInterpreter::ScPow() if (pMat->IsValue(i)) pResMat->PutDouble(pow(fVal,pMat->GetDouble(i)), i); else - pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i); } else { for ( SCSIZE i = 0; i < nCount; i++ ) if (pMat->IsValue(i)) pResMat->PutDouble(pow(pMat->GetDouble(i),fVal), i); else - pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i); } PushMatrix(pResMat); } @@ -1726,7 +1727,7 @@ void ScInterpreter::ScSumXMY2() PushNoValue(); return; } // if (nC1 != nC2 || nR1 != nR2) - ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixSub>(*pMat1, *pMat2, this); + ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixSub>(mrStrPool, *pMat1, *pMat2, this); if (!pResMat) { PushNoValue(); @@ -2370,9 +2371,9 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) { for (SCSIZE i=2; i<K+1; i++) { - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), i, 2 ); - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), i, 3 ); - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), i, 4 ); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), i, 2); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), i, 3); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), i, 4); } } @@ -2439,13 +2440,13 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) { // exact fit; test SSreg too, because SSresid might be // unequal zero due to round of errors pResMat->PutDouble(0.0, 1, 4); // SSresid - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 0, 3); // F + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 0, 3); // F pResMat->PutDouble(0.0, 1, 2); // RMSE pResMat->PutDouble(0.0, 0, 1); // SigmaSlope if (bConstant) pResMat->PutDouble(0.0, 1, 1); //SigmaIntercept else - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 1, 1); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 1, 1); pResMat->PutDouble(1.0, 0, 2); // R^2 } else @@ -2469,7 +2470,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) } else { - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 1, 1); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 1, 1); } double fR2 = fSSreg / (fSSreg + fSSresid); @@ -2567,7 +2568,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) { // exact fit; incl. observed values Y are identical pResMat->PutDouble(0.0, 1, 4); // SSresid // F = (SSreg/K) / (SSresid/df) = #DIV/0! - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 0, 3); // F + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 0, 3); // F // RMSE = sqrt(SSresid / df) = sqrt(0 / df) = 0 pResMat->PutDouble(0.0, 1, 2); // RMSE // SigmaSlope[i] = RMSE * sqrt(matrix[i,i]) = 0 * sqrt(...) = 0 @@ -2578,7 +2579,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) if (bConstant) pResMat->PutDouble(0.0, K, 1); //SigmaIntercept else - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1); // R^2 = SSreg / (SSreg + SSresid) = 1.0 pResMat->PutDouble(1.0, 0, 2); // R^2 @@ -2629,7 +2630,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) } else { - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1); } double fR2 = fSSreg / (fSSreg + fSSresid); @@ -2725,7 +2726,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) { // exact fit; incl. case observed values Y are identical pResMat->PutDouble(0.0, 1, 4); // SSresid // F = (SSreg/K) / (SSresid/df) = #DIV/0! - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 0, 3); // F + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 0, 3); // F // RMSE = sqrt(SSresid / df) = sqrt(0 / df) = 0 pResMat->PutDouble(0.0, 1, 2); // RMSE // SigmaSlope[i] = RMSE * sqrt(matrix[i,i]) = 0 * sqrt(...) = 0 @@ -2736,7 +2737,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) if (bConstant) pResMat->PutDouble(0.0, K, 1); //SigmaIntercept else - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1); // R^2 = SSreg / (SSreg + SSresid) = 1.0 pResMat->PutDouble(1.0, 0, 2); // R^2 @@ -2787,7 +2788,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP) } else { - pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1); + pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1); } double fR2 = fSSreg / (fSSreg + fSSresid); diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx index 74bb54684c26..74b0ea07dde7 100644 --- a/sc/source/filter/excel/excform.cxx +++ b/sc/source/filter/excel/excform.cxx @@ -27,7 +27,7 @@ #include "scmatrix.hxx" #include "formula/errorcodes.hxx" -#include "svl/sharedstring.hxx" +#include "svl/sharedstringpool.hxx" #include "imp_op.hxx" #include "root.hxx" @@ -1815,6 +1815,7 @@ void ExcelToSc::ReadExtensionArray( unsigned int n, XclImpStream& aIn ) OSL_FAIL( "ExcelToSc::ReadExtensionArray - missing matrix" ); } + svl::SharedStringPool& rPool = GetDoc().GetSharedStringPool(); for( nR = 0 ; nR < nRows; nR++ ) { for( nC = 0 ; nC < nCols; nC++ ) @@ -1851,7 +1852,7 @@ void ExcelToSc::ReadExtensionArray( unsigned int n, XclImpStream& aIn ) } if( NULL != pMatrix ) { - pMatrix->PutString(svl::SharedString(aString), nC, nR); + pMatrix->PutString(rPool.intern(aString), nC, nR); } break; diff --git a/sc/source/filter/excel/xihelper.cxx b/sc/source/filter/excel/xihelper.cxx index 6a0eb82031c3..5e01dd4464e9 100644 --- a/sc/source/filter/excel/xihelper.cxx +++ b/sc/source/filter/excel/xihelper.cxx @@ -19,7 +19,7 @@ #include "xihelper.hxx" #include <svl/itemset.hxx> -#include "svl/sharedstring.hxx" +#include "svl/sharedstringpool.hxx" #include <editeng/editobj.hxx> #include <tools/urlobj.hxx> #include "scitems.hxx" @@ -856,7 +856,7 @@ XclImpCachedMatrix::~XclImpCachedMatrix() { } -ScMatrixRef XclImpCachedMatrix::CreateScMatrix() const +ScMatrixRef XclImpCachedMatrix::CreateScMatrix( svl::SharedStringPool& rPool ) const { ScMatrixRef xScMatrix; OSL_ENSURE( mnScCols * mnScRows == maValueList.size(), "XclImpCachedMatrix::CreateScMatrix - element count mismatch" ); @@ -878,7 +878,7 @@ ScMatrixRef XclImpCachedMatrix::CreateScMatrix() const xScMatrix->PutDouble( itValue->GetValue(), nScCol, nScRow ); break; case EXC_CACHEDVAL_STRING: - xScMatrix->PutString(svl::SharedString(itValue->GetString()), nScCol, nScRow); + xScMatrix->PutString(rPool.intern(itValue->GetString()), nScCol, nScRow); break; case EXC_CACHEDVAL_BOOL: xScMatrix->PutBoolean( itValue->GetBool(), nScCol, nScRow ); diff --git a/sc/source/filter/excel/xilink.cxx b/sc/source/filter/excel/xilink.cxx index 20dc8dfd4ce6..3a687eb3c49a 100644 --- a/sc/source/filter/excel/xilink.cxx +++ b/sc/source/filter/excel/xilink.cxx @@ -29,7 +29,7 @@ #include "tokenarray.hxx" #include "externalrefmgr.hxx" #include "scmatrix.hxx" -#include "svl/sharedstring.hxx" +#include "svl/sharedstringpool.hxx" #include <vector> #include <boost/ptr_container/ptr_vector.hpp> @@ -124,6 +124,8 @@ public: void LoadCachedValues(); + svl::SharedStringPool& GetSharedStringPool(); + private: typedef boost::ptr_vector< XclImpSupbookTab > XclImpSupbookTabList; typedef boost::ptr_vector< XclImpExtName > XclImpExtNameList; @@ -274,7 +276,7 @@ sal_uInt16 XclImpTabInfo::GetCurrentIndex( sal_uInt16 nCreatedId, sal_uInt16 nMa // External names ============================================================= -XclImpExtName::MOper::MOper(XclImpStream& rStrm) : +XclImpExtName::MOper::MOper(svl::SharedStringPool& rPool, XclImpStream& rStrm) : mxCached(new ScMatrix(0,0)) { SCSIZE nLastCol = rStrm.ReaduInt8(); @@ -297,7 +299,7 @@ XclImpExtName::MOper::MOper(XclImpStream& rStrm) : case 0x02: { OUString aStr = rStrm.ReadUniString(); - mxCached->PutString(svl::SharedString(aStr), nCol, nRow); + mxCached->PutString(rPool.intern(aStr), nCol, nRow); } break; case 0x04: @@ -327,7 +329,7 @@ const ScMatrix& XclImpExtName::MOper::GetCache() const return *mxCached; } -XclImpExtName::XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm, XclSupbookType eSubType, ExcelToSc* pFormulaConv ) : +XclImpExtName::XclImpExtName( XclImpSupbook& rSupbook, XclImpStream& rStrm, XclSupbookType eSubType, ExcelToSc* pFormulaConv ) : mpMOper(NULL) { sal_uInt16 nFlags; @@ -385,7 +387,7 @@ XclImpExtName::XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm } break; case xlExtOLE: - mpMOper = new MOper(rStrm); + mpMOper = new MOper(rSupbook.GetSharedStringPool(), rStrm); break; default: ; @@ -401,7 +403,7 @@ void XclImpExtName::CreateDdeData( ScDocument& rDoc, const OUString& rApplic, co { ScMatrixRef xResults; if( mxDdeMatrix.get() ) - xResults = mxDdeMatrix->CreateScMatrix(); + xResults = mxDdeMatrix->CreateScMatrix(rDoc.GetSharedStringPool()); rDoc.CreateDdeLink( rApplic, rTopic, maName, SC_DDE_DEFAULT, xResults ); } @@ -734,6 +736,11 @@ void XclImpSupbook::LoadCachedValues() } } +svl::SharedStringPool& XclImpSupbook::GetSharedStringPool() +{ + return GetDoc().GetSharedStringPool(); +} + // Import link manager ======================================================== XclImpLinkManagerImpl::XclImpLinkManagerImpl( const XclImpRoot& rRoot ) : diff --git a/sc/source/filter/inc/xihelper.hxx b/sc/source/filter/inc/xihelper.hxx index fa8aac7ffd06..2474a9365cb4 100644 --- a/sc/source/filter/inc/xihelper.hxx +++ b/sc/source/filter/inc/xihelper.hxx @@ -31,6 +31,12 @@ class ScRangeList; +namespace svl { + +class SharedStringPool; + +} + // Excel->Calc cell address/range conversion ================================== /** Provides functions to convert Excel cell addresses to Calc cell addresses. */ @@ -326,7 +332,7 @@ public: ~XclImpCachedMatrix(); /** Creates a new ScMatrix object and fills it with the contained values. */ - ScMatrixRef CreateScMatrix() const; + ScMatrixRef CreateScMatrix( svl::SharedStringPool& rPool ) const; private: typedef boost::ptr_vector< XclImpCachedValue > XclImpValueList; diff --git a/sc/source/filter/inc/xilink.hxx b/sc/source/filter/inc/xilink.hxx index 56770ecee2bf..e6b8678cab67 100644 --- a/sc/source/filter/inc/xilink.hxx +++ b/sc/source/filter/inc/xilink.hxx @@ -25,6 +25,12 @@ #include "xiroot.hxx" #include "types.hxx" +namespace svl { + +class SharedStringPool; + +} + /* ============================================================================ Classes for import of different kinds of internal/external references. - 3D cell and cell range links @@ -112,7 +118,7 @@ class XclImpExtName class MOper { public: - MOper(XclImpStream& rStrm); + MOper(svl::SharedStringPool& rPool, XclImpStream& rStrm); const ScMatrix& GetCache() const; private: ScMatrixRef mxCached; @@ -120,9 +126,9 @@ class XclImpExtName public: /** Reads the external name from the stream. */ - explicit XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm, - XclSupbookType eSubType, ExcelToSc* pFormulaConv ); - ~XclImpExtName(); + explicit XclImpExtName( XclImpSupbook& rSupbook, XclImpStream& rStrm, + XclSupbookType eSubType, ExcelToSc* pFormulaConv ); + ~XclImpExtName(); /** Create and apply the cached list of this DDE Link to the document. */ void CreateDdeData( ScDocument& rDoc, diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 5db75525a98e..00b28b779d4b 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -45,7 +45,7 @@ #include "svl/stritem.hxx" #include "svl/urihelper.hxx" #include "svl/zformat.hxx" -#include "svl/sharedstring.hxx" +#include "svl/sharedstringpool.hxx" #include "sfx2/linkmgr.hxx" #include "tools/urlobj.hxx" #include "unotools/ucbhelper.hxx" @@ -488,12 +488,10 @@ ScExternalRefCache::CellFormat::CellFormat() : // ---------------------------------------------------------------------------- -ScExternalRefCache::ScExternalRefCache() -{ -} -ScExternalRefCache::~ScExternalRefCache() -{ -} +ScExternalRefCache::ScExternalRefCache(svl::SharedStringPool& rPool) : + mrStrPool(rPool) {} + +ScExternalRefCache::~ScExternalRefCache() {} const OUString* ScExternalRefCache::getRealTableName(sal_uInt16 nFileId, const OUString& rTabName) const { @@ -645,7 +643,7 @@ ScExternalRefCache::TokenArrayRef ScExternalRefCache::getCellRangeData( xMat->PutDouble(pToken->GetDouble(), nC, nR); break; case svString: - xMat->PutString(svl::SharedString(pToken->GetString()), nC, nR); + xMat->PutString(mrStrPool.intern(pToken->GetString()), nC, nR); break; default: ; @@ -1374,7 +1372,8 @@ inline void ColumnBatch<T>::putValues(ScMatrixRef& xMat, const SCCOL nCol) const } static ScTokenArray* convertToTokenArray( - ScDocument* pSrcDoc, ScRange& rRange, vector<ScExternalRefCache::SingleRangeData>& rCacheData ) + ScDocument* pSrcDoc, svl::SharedStringPool& rStrPool, ScRange& rRange, + vector<ScExternalRefCache::SingleRangeData>& rCacheData ) { ScAddress& s = rRange.aStart; ScAddress& e = rRange.aEnd; @@ -1455,7 +1454,7 @@ static ScTokenArray* convertToTokenArray( else { OUString aStr = pFCell->GetString(); - xMat->PutString(aStr, nC, nR); + xMat->PutString(rStrPool.intern(aStr), nC, nR); } } break; @@ -1505,6 +1504,7 @@ static ScTokenArray* lcl_fillEmptyMatrix(const ScRange& rRange) ScExternalRefManager::ScExternalRefManager(ScDocument* pDoc) : mpDoc(pDoc), + maRefCache(pDoc->GetSharedStringPool()), mbInReferenceMarking(false), mbUserInteractionEnabled(true) { @@ -2024,7 +2024,7 @@ ScExternalRefCache::TokenArrayRef ScExternalRefManager::getDoubleRefTokensFromSr aRange.aStart.SetTab(nTab1); aRange.aEnd.SetTab(nTab1 + nTabSpan); - pArray.reset(convertToTokenArray(pSrcDoc, aRange, aCacheData)); + pArray.reset(convertToTokenArray(pSrcDoc, mpDoc->GetSharedStringPool(), aRange, aCacheData)); rRange = aRange; rCacheData.swap(aCacheData); return pArray; |