summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2013-10-09 22:12:12 -0400
committerKohei Yoshida <kohei.yoshida@collabora.com>2013-10-11 12:14:26 -0400
commit7c6848845f10dbac392bfc3dccf405d8e8e969fc (patch)
tree244be09abf7382fd404e70ea111b0792a0167a14 /sc
parentf793daf81c64690dcca0772ece07d9ead96d0d0b (diff)
Properly intern strings going into matrix objects.
Change-Id: Ieb8befa4f19ebc31f4afa1370c924b469aa77382
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/externalrefmgr.hxx13
-rw-r--r--sc/source/core/data/column2.cxx14
-rw-r--r--sc/source/core/data/validat.cxx2
-rw-r--r--sc/source/core/inc/interpre.hxx7
-rw-r--r--sc/source/core/tool/ddelink.cxx5
-rw-r--r--sc/source/core/tool/interpr1.cxx36
-rw-r--r--sc/source/core/tool/interpr2.cxx7
-rw-r--r--sc/source/core/tool/interpr4.cxx4
-rw-r--r--sc/source/core/tool/interpr5.cxx67
-rw-r--r--sc/source/filter/excel/excform.cxx5
-rw-r--r--sc/source/filter/excel/xihelper.cxx6
-rw-r--r--sc/source/filter/excel/xilink.cxx19
-rw-r--r--sc/source/filter/inc/xihelper.hxx8
-rw-r--r--sc/source/filter/inc/xilink.hxx14
-rw-r--r--sc/source/ui/docshell/externalrefmgr.cxx22
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;