summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/queryentry.hxx3
-rw-r--r--sc/inc/queryparam.hxx8
-rw-r--r--sc/source/core/data/dociter.cxx10
-rw-r--r--sc/source/core/data/dpcache.cxx9
-rw-r--r--sc/source/core/data/dpshttab.cxx2
-rw-r--r--sc/source/core/data/table3.cxx21
-rw-r--r--sc/source/core/tool/doubleref.cxx20
-rw-r--r--sc/source/core/tool/interpr1.cxx70
-rw-r--r--sc/source/core/tool/lookupcache.cxx2
-rw-r--r--sc/source/core/tool/queryentry.cxx14
-rw-r--r--sc/source/core/tool/queryparam.cxx19
-rw-r--r--sc/source/filter/excel/excimp8.cxx46
-rw-r--r--sc/source/filter/excel/excrecds.cxx8
-rw-r--r--sc/source/filter/inc/excimp8.hxx3
-rw-r--r--sc/source/filter/xml/XMLExportDataPilot.cxx6
-rw-r--r--sc/source/filter/xml/XMLExportDatabaseRanges.cxx6
-rw-r--r--sc/source/filter/xml/xmlfilti.cxx14
-rw-r--r--sc/source/ui/dbgui/filtdlg.cxx16
-rw-r--r--sc/source/ui/dbgui/pfiltdlg.cxx7
-rw-r--r--sc/source/ui/unoobj/cellsuno.cxx7
-rw-r--r--sc/source/ui/unoobj/datauno.cxx44
-rw-r--r--sc/source/ui/view/gridwin.cxx29
22 files changed, 214 insertions, 150 deletions
diff --git a/sc/inc/queryentry.hxx b/sc/inc/queryentry.hxx
index a3baea6fd5c2..cc35b23cb2bc 100644
--- a/sc/inc/queryentry.hxx
+++ b/sc/inc/queryentry.hxx
@@ -22,6 +22,7 @@
#include "address.hxx"
#include "global.hxx"
+#include "svl/sharedstring.hxx"
#include <vector>
@@ -41,7 +42,7 @@ struct SC_DLLPUBLIC ScQueryEntry
{
QueryType meType;
double mfVal;
- OUString maString;
+ svl::SharedString maString;
Item() : meType(ByValue), mfVal(0.0) {}
diff --git a/sc/inc/queryparam.hxx b/sc/inc/queryparam.hxx
index ad311ffc6982..ff89d3e62aac 100644
--- a/sc/inc/queryparam.hxx
+++ b/sc/inc/queryparam.hxx
@@ -28,6 +28,12 @@
struct ScDBQueryParamInternal;
struct ScQueryEntry;
+namespace svl {
+
+class SharedStringPool;
+
+}
+
struct ScQueryParamBase
{
bool bHasHeader;
@@ -48,7 +54,7 @@ struct ScQueryParamBase
ScQueryEntry* FindEntryByField(SCCOLROW nField, bool bNew);
SC_DLLPUBLIC void RemoveEntryByField(SCCOLROW nField);
void Resize(size_t nNew);
- void FillInExcelSyntax(const OUString& aCellStr, SCSIZE nIndex);
+ void FillInExcelSyntax(svl::SharedStringPool& rPool, const OUString& aCellStr, SCSIZE nIndex);
protected:
typedef boost::ptr_vector<ScQueryEntry> EntriesType;
diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx
index 189c822001de..3cad91c00e2c 100644
--- a/sc/source/core/data/dociter.cxx
+++ b/sc/source/core/data/dociter.cxx
@@ -364,7 +364,7 @@ ScDBQueryDataIterator::DataAccessInternal::DataAccessInternal(const ScDBQueryDat
ScQueryEntry::Item& rItem = rItems.front();
sal_uInt32 nIndex = 0;
bool bNumber = mpDoc->GetFormatTable()->IsNumberFormat(
- rItem.maString, nIndex, rItem.mfVal);
+ rItem.maString.getString(), nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
}
nNumFormat = 0; // Initialized in GetNumberFormat
@@ -683,7 +683,7 @@ bool ScDBQueryDataIterator::DataAccessMatrix::isValidQuery(SCROW nRow, const ScM
// Equality check first.
OUString aMatStr = rMat.GetString(nField, nRow);
upperCase(aMatStr);
- OUString aQueryStr = rEntry.GetQueryItem().maString;
+ OUString aQueryStr = rEntry.GetQueryItem().maString.getString();
upperCase(aQueryStr);
bool bDone = false;
switch (rEntry.eOp)
@@ -1062,7 +1062,7 @@ ScQueryCellIterator::ScQueryCellIterator(ScDocument* pDocument, SCTAB nTable,
ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
sal_uInt32 nIndex = 0;
bool bNumber = pDoc->GetFormatTable()->IsNumberFormat(
- rItem.maString, nIndex, rItem.mfVal);
+ rItem.maString.getString(), nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
}
}
@@ -1408,7 +1408,7 @@ bool ScQueryCellIterator::BinarySearch()
sal_uLong nFormat = pCol->GetNumberFormat(toLogicalPos(aLoPos));
aCell = sc::toRefCell(aLoPos.first, aLoPos.second);
ScCellFormat::GetInputString(aCell, nFormat, aCellStr, rFormatter, pDoc);
- sal_Int32 nTmp = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString);
+ sal_Int32 nTmp = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString.getString());
if ((rEntry.eOp == SC_LESS_EQUAL && nTmp > 0) ||
(rEntry.eOp == SC_GREATER_EQUAL && nTmp < 0) ||
(rEntry.eOp == SC_EQUAL && nTmp != 0))
@@ -1559,7 +1559,7 @@ bool ScQueryCellIterator::BinarySearch()
aCell = sc::toRefCell(aPos.first, aPos.second);
ScCellFormat::GetInputString(aCell, nFormat, aCellStr, rFormatter, pDoc);
- nRes = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString);
+ nRes = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString.getString());
if (nRes < 0 && bLessEqual)
{
sal_Int32 nTmp = pCollator->compareString( aLastInRangeString,
diff --git a/sc/source/core/data/dpcache.cxx b/sc/source/core/data/dpcache.cxx
index 874efb2b2790..5ef3adada7a2 100644
--- a/sc/source/core/data/dpcache.cxx
+++ b/sc/source/core/data/dpcache.cxx
@@ -550,7 +550,8 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const
{
if (bMatchWholeCell)
{
- OUString aStr = rEntry.GetQueryItem().maString;
+ // TODO: Use shared string for fast equality check.
+ OUString aStr = rEntry.GetQueryItem().maString.getString();
bOk = pTransliteration->isEqual(aCellStr, aStr);
bool bHasStar = false;
sal_Int32 nIndex;
@@ -574,12 +575,12 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const
}
else
{
- const OUString& rQueryStr = rEntry.GetQueryItem().maString;
+ OUString aQueryStr = rEntry.GetQueryItem().maString.getString();
::com::sun::star::uno::Sequence< sal_Int32 > xOff;
OUString aCell = pTransliteration->transliterate(
aCellStr, ScGlobal::eLnge, 0, aCellStr.getLength(), &xOff);
OUString aQuer = pTransliteration->transliterate(
- rQueryStr, ScGlobal::eLnge, 0, rQueryStr.getLength(), &xOff);
+ aQueryStr, ScGlobal::eLnge, 0, aQueryStr.getLength(), &xOff);
bOk = (aCell.indexOf( aQuer ) != -1);
}
if (rEntry.eOp == SC_NOT_EQUAL)
@@ -588,7 +589,7 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const
else
{ // use collator here because data was probably sorted
sal_Int32 nCompare = pCollator->compareString(
- aCellStr, rEntry.GetQueryItem().maString);
+ aCellStr, rEntry.GetQueryItem().maString.getString());
switch (rEntry.eOp)
{
case SC_LESS :
diff --git a/sc/source/core/data/dpshttab.cxx b/sc/source/core/data/dpshttab.cxx
index f4a80b2f3941..93af29c10ff6 100644
--- a/sc/source/core/data/dpshttab.cxx
+++ b/sc/source/core/data/dpshttab.cxx
@@ -59,7 +59,7 @@ ScSheetDPData::ScSheetDPData(ScDocument* pD, const ScSheetSourceDesc& rDesc, con
{
sal_uInt32 nIndex = 0;
bool bNumber = pD->GetFormatTable()->IsNumberFormat(
- rItem.maString, nIndex, rItem.mfVal);
+ rItem.maString.getString(), nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
}
}
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 59e080c11578..9b63531aecdb 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -57,6 +57,8 @@
#include "mtvcellfunc.hxx"
#include "columnspanset.hxx"
+#include "svl/sharedstringpool.hxx"
+
#include <vector>
#include <boost/unordered_set.hpp>
@@ -1485,7 +1487,7 @@ public:
// Simple string matching i.e. no regexp match.
if (isTextMatchOp(rEntry))
{
- if (rItem.meType != ScQueryEntry::ByString && rItem.maString.isEmpty())
+ if (rItem.meType != ScQueryEntry::ByString && rItem.maString.getString().isEmpty())
{
// #i18374# When used from functions (match, countif, sumif, vlookup, hlookup, lookup),
// the query value is assigned directly, and the string is empty. In that case,
@@ -1496,18 +1498,19 @@ public:
}
else if ( bMatchWholeCell )
{
- bOk = mpTransliteration->isEqual(aCellStr, rItem.maString);
+ // TODO: Use shared string for faster equality check.
+ bOk = mpTransliteration->isEqual(aCellStr, rItem.maString.getString());
if ( rEntry.eOp == SC_NOT_EQUAL )
bOk = !bOk;
}
else
{
- const OUString& rQueryStr = rItem.maString;
+ OUString aQueryStr = rItem.maString.getString();
OUString aCell( mpTransliteration->transliterate(
aCellStr, ScGlobal::eLnge, 0, aCellStr.getLength(),
NULL ) );
OUString aQuer( mpTransliteration->transliterate(
- rQueryStr, ScGlobal::eLnge, 0, rQueryStr.getLength(),
+ aQueryStr, ScGlobal::eLnge, 0, aQueryStr.getLength(),
NULL ) );
xub_StrLen nIndex = (rEntry.eOp == SC_ENDS_WITH
|| rEntry.eOp == SC_DOES_NOT_END_WITH) ? (aCell.getLength()-aQuer.getLength()) : 0;
@@ -1544,7 +1547,7 @@ public:
else
{ // use collator here because data was probably sorted
sal_Int32 nCompare = mpCollator->compareString(
- aCellStr, rItem.maString);
+ aCellStr, rItem.maString.getString());
switch (rEntry.eOp)
{
case SC_LESS :
@@ -1809,7 +1812,7 @@ public:
sal_uInt32 nIndex = 0;
bool bNumber = mrDoc.GetFormatTable()->
- IsNumberFormat(rItem.maString, nIndex, rItem.mfVal);
+ IsNumberFormat(rItem.maString.getString(), nIndex, rItem.mfVal);
// Advanced Filter creates only ByString queries that need to be
// converted to ByValue if appropriate. rItem.mfVal now holds the value
@@ -2039,6 +2042,7 @@ bool ScTable::CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow
SCSIZE nIndex = 0;
SCROW nRow = nRow1 + 1;
+ svl::SharedStringPool& rPool = pDocument->GetSharedStringPool();
while (nRow <= nRow2)
{
nCol = nCol1;
@@ -2050,7 +2054,7 @@ bool ScTable::CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow
if (nIndex < nNewEntries)
{
rQueryParam.GetEntry(nIndex).nField = pFields[nCol - nCol1];
- rQueryParam.FillInExcelSyntax(aCellStr, nIndex);
+ rQueryParam.FillInExcelSyntax(rPool, aCellStr, nIndex);
nIndex++;
if (nIndex < nNewEntries)
rQueryParam.GetEntry(nIndex).eConnect = SC_AND;
@@ -2094,6 +2098,7 @@ bool ScTable::CreateStarQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2
SCSIZE nNewEntries = static_cast<SCSIZE>(nRow2-nRow1+1);
rQueryParam.Resize( nNewEntries );
+ svl::SharedStringPool& rPool = pDocument->GetSharedStringPool();
do
{
@@ -2167,7 +2172,7 @@ bool ScTable::CreateStarQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2
{
OUString aStr;
GetString(nCol1 + 3, nRow, aStr);
- rEntry.GetQueryItem().maString = aStr;
+ rEntry.GetQueryItem().maString = rPool.intern(aStr);
rEntry.bDoQuery = true;
}
nIndex++;
diff --git a/sc/source/core/tool/doubleref.cxx b/sc/source/core/tool/doubleref.cxx
index 68f930dbd08f..348380968564 100644
--- a/sc/source/core/tool/doubleref.cxx
+++ b/sc/source/core/tool/doubleref.cxx
@@ -26,6 +26,8 @@
#include "globstr.hrc"
#include "scmatrix.hxx"
+#include "svl/sharedstringpool.hxx"
+
#include <memory>
#include <vector>
@@ -39,7 +41,8 @@ void lcl_uppercase(OUString& rStr)
rStr = ScGlobal::pCharClass->uppercase(rStr.trim());
}
-bool lcl_createStarQuery(ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
+bool lcl_createStarQuery(
+ svl::SharedStringPool& rPool, ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
{
// A valid StarQuery must be at least 4 columns wide. To be precise it
// should be exactly 4 columns ...
@@ -128,7 +131,8 @@ bool lcl_createStarQuery(ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef,
if (bValid)
{
// Finally, the right-hand-side value in the 4th column.
- rEntry.GetQueryItem().maString = pQueryRef->getString(3, nRow);
+ rEntry.GetQueryItem().maString =
+ rPool.intern(pQueryRef->getString(3, nRow));
rEntry.bDoQuery = true;
}
nIndex++;
@@ -139,7 +143,7 @@ bool lcl_createStarQuery(ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef,
}
bool lcl_createExcelQuery(
- ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
+ svl::SharedStringPool& rPool, ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
{
bool bValid = true;
SCCOL nCols = pQueryRef->getColSize();
@@ -186,7 +190,7 @@ bool lcl_createExcelQuery(
if (nIndex < nNewEntries)
{
pParam->GetEntry(nIndex).nField = aFields[nCol];
- pParam->FillInExcelSyntax(OUString(aCellStr), nIndex);
+ pParam->FillInExcelSyntax(rPool, aCellStr, nIndex);
nIndex++;
if (nIndex < nNewEntries)
pParam->GetEntry(nIndex).eConnect = SC_AND;
@@ -205,17 +209,17 @@ bool lcl_createExcelQuery(
}
bool lcl_fillQueryEntries(
- ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
+ svl::SharedStringPool& rPool, ScQueryParamBase* pParam, const ScDBRangeBase* pDBRef, const ScDBRangeBase* pQueryRef)
{
SCSIZE nCount = pParam->GetEntryCount();
for (SCSIZE i = 0; i < nCount; ++i)
pParam->GetEntry(i).Clear();
// Standard QueryTabelle
- bool bValid = lcl_createStarQuery(pParam, pDBRef, pQueryRef);
+ bool bValid = lcl_createStarQuery(rPool, pParam, pDBRef, pQueryRef);
// Excel QueryTabelle
if (!bValid)
- bValid = lcl_createExcelQuery(pParam, pDBRef, pQueryRef);
+ bValid = lcl_createExcelQuery(rPool, pParam, pDBRef, pQueryRef);
nCount = pParam->GetEntryCount();
if (bValid)
@@ -249,7 +253,7 @@ bool ScDBRangeBase::fillQueryEntries(ScQueryParamBase* pParam, const ScDBRangeBa
if (!pDBRef)
return false;
- return lcl_fillQueryEntries(pParam, pDBRef, this);
+ return lcl_fillQueryEntries(getDoc()->GetSharedStringPool(), pParam, pDBRef, this);
}
void ScDBRangeBase::fillQueryOptions(ScQueryParamBase* pParam)
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 770ee24e36ae..9400beca2fa0 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -922,7 +922,7 @@ double ScInterpreter::CompareFunc( const ScCompare& rComp, ScCompareOptions* pOp
// is/must be identical to *rEntry.pStr, which is essential for
// regex to work through GetSearchTextPtr().
ScQueryEntry& rEntry = pOptions->aQueryEntry;
- OSL_ENSURE(rEntry.GetQueryItem().maString.equals(*rComp.pVal[1]), "ScInterpreter::CompareFunc: broken options");
+ OSL_ENSURE(rEntry.GetQueryItem().maString.getString().equals(*rComp.pVal[1]), "ScInterpreter::CompareFunc: broken options");
if (pOptions->bRegEx)
{
sal_Int32 nStart = 0;
@@ -976,13 +976,13 @@ double ScInterpreter::CompareFunc( const ScCompare& rComp, ScCompareOptions* pOp
if (!rItems.empty())
{
const ScQueryEntry::Item& rItem = rItems[0];
- if (rItem.meType != ScQueryEntry::ByString && !rItem.maString.isEmpty() &&
+ if (rItem.meType != ScQueryEntry::ByString && !rItem.maString.getString().isEmpty() &&
(rEntry.eOp == SC_EQUAL || rEntry.eOp == SC_NOT_EQUAL))
{
// As in ScTable::ValidQuery() match a numeric string for a
// number query that originated from a string, e.g. in SUMIF
// and COUNTIF. Transliteration is not needed here.
- bool bEqual = (*rComp.pVal[nStringQuery-1]) == rItem.maString;
+ bool bEqual = (*rComp.pVal[nStringQuery-1]) == rItem.maString.getString();
// match => fRes=0, else fRes=1
fRes = (rEntry.eOp == SC_NOT_EQUAL) ? bEqual : !bEqual;
}
@@ -1234,7 +1234,7 @@ ScMatrixRef ScInterpreter::QueryMat( const ScMatrixRef& pMat, ScCompareOptions&
PushMatrix( pMat);
const ScQueryEntry::Item& rItem = rOptions.aQueryEntry.GetQueryItem();
if (rItem.meType == ScQueryEntry::ByString)
- PushString(rItem.maString);
+ PushString(rItem.maString.getString());
else
PushDouble(rItem.mfVal);
ScMatrixRef pResultMatrix = CompareMat( &rOptions).mpMat;
@@ -4420,10 +4420,10 @@ static sal_Int32 lcl_CompareMatrix2Query(
if (!bByString)
return 1; // string always greater than numeric
- const OUString aStr1 = rMat.GetString(i);
- const OUString& rStr2 = rEntry.GetQueryItem().maString;
+ OUString aStr1 = rMat.GetString(i);
+ OUString aStr2 = rEntry.GetQueryItem().maString.getString();
- return ScGlobal::GetCollator()->compareString(aStr1, rStr2); // case-insensitive
+ return ScGlobal::GetCollator()->compareString(aStr1, aStr2); // case-insensitive
}
/** returns the last item with the identical value as the original item
@@ -4541,6 +4541,7 @@ void ScInterpreter::ScMatch()
if (nGlobalError == 0)
{
+ svl::SharedStringPool& rPool = pDok->GetSharedStringPool();
double fVal;
OUString sStr;
ScQueryParam rParam;
@@ -4569,7 +4570,7 @@ void ScInterpreter::ScMatch()
{
sStr = GetString();
rItem.meType = ScQueryEntry::ByString;
- rItem.maString = sStr;
+ rItem.maString = rPool.intern(sStr);
}
break;
case svDoubleRef :
@@ -4593,7 +4594,7 @@ void ScInterpreter::ScMatch()
{
GetCellString(sStr, aCell);
rItem.meType = ScQueryEntry::ByString;
- rItem.maString = sStr;
+ rItem.maString = rPool.intern(sStr);
}
}
break;
@@ -4614,7 +4615,7 @@ void ScInterpreter::ScMatch()
else
{
rItem.meType = ScQueryEntry::ByString;
- rItem.maString = pToken->GetString();
+ rItem.maString = rPool.intern(pToken->GetString());
}
}
break;
@@ -4628,7 +4629,7 @@ void ScInterpreter::ScMatch()
OUString aStr;
ScMatValType nType = GetDoubleOrStringFromMatrix(
rItem.mfVal, aStr);
- rItem.maString = aStr;
+ rItem.maString = rPool.intern(aStr);
rItem.meType = ScMatrix::IsNonValueType(nType) ?
ScQueryEntry::ByString : ScQueryEntry::ByValue;
}
@@ -4649,7 +4650,7 @@ void ScInterpreter::ScMatch()
if ( bIsVBAMode )
rParam.bRegExp = false;
else
- rParam.bRegExp = MayBeRegExp(rEntry.GetQueryItem().maString, pDok);
+ rParam.bRegExp = MayBeRegExp(rEntry.GetQueryItem().maString.getString(), pDok);
}
if (pMatSrc) // The source data is matrix array.
@@ -5111,13 +5112,13 @@ double ScInterpreter::IterateParametersIf( ScIterFuncIf eFunc )
}
else
{
- rParam.FillInExcelSyntax(aString, 0);
+ rParam.FillInExcelSyntax(pDok->GetSharedStringPool(), aString, 0);
sal_uInt32 nIndex = 0;
bool bNumber = pFormatter->IsNumberFormat(
- rItem.maString, nIndex, rItem.mfVal);
+ rItem.maString.getString(), nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
if (rItem.meType == ScQueryEntry::ByString)
- rParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
+ rParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
}
ScAddress aAdr;
aAdr.SetTab( nTab3 );
@@ -5411,13 +5412,13 @@ void ScInterpreter::ScCountIf()
}
else
{
- rParam.FillInExcelSyntax(aString, 0);
+ rParam.FillInExcelSyntax(pDok->GetSharedStringPool(), aString, 0);
sal_uInt32 nIndex = 0;
bool bNumber = pFormatter->IsNumberFormat(
- rItem.maString, nIndex, rItem.mfVal);
+ rItem.maString.getString(), nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
if (rItem.meType == ScQueryEntry::ByString)
- rParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
+ rParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
}
rParam.nCol1 = nCol1;
rParam.nCol2 = nCol2;
@@ -5663,13 +5664,13 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
}
else
{
- rParam.FillInExcelSyntax(aString, 0);
+ rParam.FillInExcelSyntax(pDok->GetSharedStringPool(), aString, 0);
sal_uInt32 nIndex = 0;
bool bNumber = pFormatter->IsNumberFormat(
- rItem.maString, nIndex, rItem.mfVal);
+ rItem.maString.getString(), nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
if (rItem.meType == ScQueryEntry::ByString)
- rParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
+ rParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
}
ScAddress aAdr;
aAdr.SetTab( nTab1 );
@@ -6073,7 +6074,7 @@ void ScInterpreter::ScLookup()
if (rItem.meType != ScQueryEntry::ByString)
bFound = false;
else
- bFound = (ScGlobal::GetCollator()->compareString(aDataStr, rItem.maString) <= 0);
+ bFound = (ScGlobal::GetCollator()->compareString(aDataStr, rItem.maString.getString()) <= 0);
}
if (!bFound)
@@ -6319,7 +6320,7 @@ void ScInterpreter::ScLookup()
rEntry.nField = nCol1;
ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
if (rItem.meType == ScQueryEntry::ByString)
- aParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
+ aParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
ScQueryCellIterator aCellIter(pDok, nTab1, aParam, false);
SCCOL nC;
@@ -6551,7 +6552,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
if (rItem.meType == ScQueryEntry::ByString)
- aParam.bRegExp = MayBeRegExp(rItem.maString, pDok);
+ aParam.bRegExp = MayBeRegExp(rItem.maString.getString(), pDok);
if (pMat)
{
SCSIZE nMatCount = bHLookup ? nC : nR;
@@ -6561,7 +6562,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
//!!!!!!!
//! TODO: enable regex on matrix strings
//!!!!!!!
- const OUString& rParamStr = rItem.maString;
+ OUString aParamStr = rItem.maString.getString();
if ( bSorted )
{
static CollatorWrapper* pCollator = ScGlobal::GetCollator();
@@ -6570,7 +6571,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
if (bHLookup ? pMat->IsString(i, 0) : pMat->IsString(0, i))
{
sal_Int32 nRes =
- pCollator->compareString( bHLookup ? pMat->GetString(i,0) : pMat->GetString(0,i), rParamStr);
+ pCollator->compareString( bHLookup ? pMat->GetString(i,0) : pMat->GetString(0,i), aParamStr);
if (nRes <= 0)
nDelta = i;
else if (i>0) // #i2168# ignore first mismatch
@@ -6589,7 +6590,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
if (pMat->IsString(i, 0))
{
if ( ScGlobal::GetpTransliteration()->isEqual(
- pMat->GetString(i,0), rParamStr))
+ pMat->GetString(i,0), aParamStr))
{
nDelta = i;
i = nMatCount + 1;
@@ -6599,7 +6600,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
}
else
{
- nDelta = pMat->MatchStringInColumns(rParamStr, 0, 0);
+ nDelta = pMat->MatchStringInColumns(aParamStr, 0, 0);
}
}
}
@@ -6704,6 +6705,7 @@ void ScInterpreter::CalculateLookup(bool bHLookup)
bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
{
ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
+ svl::SharedStringPool& rPool = pDok->GetSharedStringPool();
switch ( GetStackType() )
{
case svDouble:
@@ -6716,7 +6718,7 @@ bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
{
const OUString& sStr = GetString();
rItem.meType = ScQueryEntry::ByString;
- rItem.maString = sStr;
+ rItem.maString = rPool.intern(sStr);
}
break;
case svDoubleRef :
@@ -6740,7 +6742,7 @@ bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
OUString aStr;
GetCellString(aStr, aCell);
rItem.meType = ScQueryEntry::ByString;
- rItem.maString = aStr;
+ rItem.maString = rPool.intern(aStr);
}
}
break;
@@ -6748,7 +6750,7 @@ bool ScInterpreter::FillEntry(ScQueryEntry& rEntry)
{
OUString aStr;
const ScMatValType nType = GetDoubleOrStringFromMatrix(rItem.mfVal, aStr);
- rItem.maString = aStr;
+ rItem.maString = rPool.intern(aStr);
rItem.meType = ScMatrix::IsNonValueType(nType) ?
ScQueryEntry::ByString : ScQueryEntry::ByValue;
}
@@ -6946,13 +6948,13 @@ ScDBQueryParamBase* ScInterpreter::GetDBParams( bool& rMissingField )
ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
sal_uInt32 nIndex = 0;
- const OUString& rQueryStr = rItem.maString;
+ OUString aQueryStr = rItem.maString.getString();
bool bNumber = pFormatter->IsNumberFormat(
- rQueryStr, nIndex, rItem.mfVal);
+ aQueryStr, nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
if (!bNumber && !pParam->bRegExp)
- pParam->bRegExp = MayBeRegExp(rQueryStr, pDok);
+ pParam->bRegExp = MayBeRegExp(aQueryStr, pDok);
}
return pParam.release();
}
diff --git a/sc/source/core/tool/lookupcache.cxx b/sc/source/core/tool/lookupcache.cxx
index a676a72374e9..914b188a851d 100644
--- a/sc/source/core/tool/lookupcache.cxx
+++ b/sc/source/core/tool/lookupcache.cxx
@@ -43,7 +43,7 @@ ScLookupCache::QueryCriteria::QueryCriteria( const ScQueryEntry& rEntry ) :
const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
if (rItem.meType == ScQueryEntry::ByString)
- setString(rItem.maString);
+ setString(rItem.maString.getString());
else
setDouble(rItem.mfVal);
}
diff --git a/sc/source/core/tool/queryentry.cxx b/sc/source/core/tool/queryentry.cxx
index 1ac1a899327b..f93351687a98 100644
--- a/sc/source/core/tool/queryentry.cxx
+++ b/sc/source/core/tool/queryentry.cxx
@@ -32,7 +32,7 @@
bool ScQueryEntry::Item::operator== (const Item& r) const
{
- return meType == r.meType && mfVal == r.mfVal && maString.equals(r.maString);
+ return meType == r.meType && mfVal == r.mfVal && maString == r.maString;
}
ScQueryEntry::ScQueryEntry() :
@@ -95,7 +95,7 @@ void ScQueryEntry::SetQueryByEmpty()
maQueryItems.resize(1);
Item& rItem = maQueryItems[0];
rItem.meType = ByEmpty;
- rItem.maString = OUString();
+ rItem.maString = svl::SharedString();
rItem.mfVal = SC_EMPTYFIELDS;
}
@@ -107,7 +107,7 @@ bool ScQueryEntry::IsQueryByEmpty() const
const Item& rItem = maQueryItems[0];
return eOp == SC_EQUAL &&
rItem.meType == ByEmpty &&
- rItem.maString.isEmpty() &&
+ rItem.maString.getString().isEmpty() &&
rItem.mfVal == SC_EMPTYFIELDS;
}
@@ -117,7 +117,7 @@ void ScQueryEntry::SetQueryByNonEmpty()
maQueryItems.resize(1);
Item& rItem = maQueryItems[0];
rItem.meType = ByEmpty;
- rItem.maString = OUString();
+ rItem.maString = svl::SharedString();
rItem.mfVal = SC_NONEMPTYFIELDS;
}
@@ -129,7 +129,7 @@ bool ScQueryEntry::IsQueryByNonEmpty() const
const Item& rItem = maQueryItems[0];
return eOp == SC_EQUAL &&
rItem.meType == ByEmpty &&
- rItem.maString.isEmpty() &&
+ rItem.maString.getString().isEmpty() &&
rItem.mfVal == SC_NONEMPTYFIELDS;
}
@@ -178,9 +178,9 @@ utl::TextSearch* ScQueryEntry::GetSearchTextPtr( bool bCaseSens ) const
{
if ( !pSearchParam )
{
- const OUString& rStr = maQueryItems[0].maString;
+ OUString aStr = maQueryItems[0].maString.getString();
pSearchParam = new utl::SearchParam(
- rStr, utl::SearchParam::SRCH_REGEXP, bCaseSens, false, false);
+ aStr, utl::SearchParam::SRCH_REGEXP, bCaseSens, false, false);
pSearchText = new utl::TextSearch( *pSearchParam, *ScGlobal::pCharClass );
}
return pSearchText;
diff --git a/sc/source/core/tool/queryparam.cxx b/sc/source/core/tool/queryparam.cxx
index 5ce8f89e3505..071c3457c383 100644
--- a/sc/source/core/tool/queryparam.cxx
+++ b/sc/source/core/tool/queryparam.cxx
@@ -21,6 +21,8 @@
#include "queryentry.hxx"
#include "scmatrix.hxx"
+#include "svl/sharedstringpool.hxx"
+
namespace {
const size_t MAXQUERY = 8;
@@ -166,7 +168,8 @@ void ScQueryParamBase::Resize(size_t nNew)
}
}
-void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex)
+void ScQueryParamBase::FillInExcelSyntax(
+ svl::SharedStringPool& rPool, const OUString& rStr, SCSIZE nIndex)
{
const OUString aCellStr = rStr;
if (!aCellStr.isEmpty())
@@ -183,17 +186,17 @@ void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex)
{
if (aCellStr[1] == '>')
{
- rItem.maString = aCellStr.copy(2);
+ rItem.maString = rPool.intern(aCellStr.copy(2));
rEntry.eOp = SC_NOT_EQUAL;
}
else if (aCellStr[1] == '=')
{
- rItem.maString = aCellStr.copy(2);
+ rItem.maString = rPool.intern(aCellStr.copy(2));
rEntry.eOp = SC_LESS_EQUAL;
}
else
{
- rItem.maString = aCellStr.copy(1);
+ rItem.maString = rPool.intern(aCellStr.copy(1));
rEntry.eOp = SC_LESS;
}
}
@@ -201,21 +204,21 @@ void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex)
{
if (aCellStr[1] == '=')
{
- rItem.maString = aCellStr.copy(2);
+ rItem.maString = rPool.intern(aCellStr.copy(2));
rEntry.eOp = SC_GREATER_EQUAL;
}
else
{
- rItem.maString = aCellStr.copy(1);
+ rItem.maString = rPool.intern(aCellStr.copy(1));
rEntry.eOp = SC_GREATER;
}
}
else
{
if (aCellStr[0] == '=')
- rItem.maString = aCellStr.copy(1);
+ rItem.maString = rPool.intern(aCellStr.copy(1));
else
- rItem.maString = aCellStr;
+ rItem.maString = rPool.intern(aCellStr);
rEntry.eOp = SC_EQUAL;
}
}
diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx
index fea897beba71..d4d4cc59552a 100644
--- a/sc/source/filter/excel/excimp8.cxx
+++ b/sc/source/filter/excel/excimp8.cxx
@@ -55,6 +55,7 @@
#include <sot/exchange.hxx>
#include <svl/stritem.hxx>
+#include "svl/sharedstringpool.hxx"
#include <rtl/math.hxx>
#include <rtl/ustring.hxx>
@@ -454,7 +455,7 @@ void ImportExcel8::AutoFilter( void )
XclImpAutoFilterData* pData = pExcRoot->pAutoFilterBuffer->GetByTab( GetCurrScTab() );
if( pData )
- pData->ReadAutoFilter( aIn );
+ pData->ReadAutoFilter(aIn, GetDoc().GetSharedStringPool());
}
@@ -472,17 +473,21 @@ XclImpAutoFilterData::XclImpAutoFilterData( RootData* pRoot, const ScRange& rRan
aParam.nCol2 = rRange.aEnd.Col();
aParam.nRow2 = rRange.aEnd.Row();
- aParam.bInplace = sal_True;
+ aParam.bInplace = true;
}
-void XclImpAutoFilterData::CreateFromDouble( OUString& rStr, double fVal )
+namespace {
+
+OUString CreateFromDouble( double fVal )
{
- rStr += ::rtl::math::doubleToUString(fVal,
+ return rtl::math::doubleToUString(fVal,
rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
ScGlobal::pLocaleData->getNumDecimalSep()[0], true);
}
+}
+
void XclImpAutoFilterData::SetCellAttribs()
{
ScDocument& rDoc = pExcRoot->pIR->GetDoc();
@@ -515,12 +520,11 @@ void XclImpAutoFilterData::InsertQueryParam()
}
}
-static void ExcelQueryToOooQuery( ScQueryEntry& rEntry )
+static void ExcelQueryToOooQuery( OUString& aStr, ScQueryEntry& rEntry )
{
if (rEntry.eOp != SC_EQUAL && rEntry.eOp != SC_NOT_EQUAL)
return;
- OUString aStr = rEntry.GetQueryItem().maString;
xub_StrLen nLen = aStr.getLength();
sal_Unicode nStart = aStr[0];
sal_Unicode nEnd = aStr[ nLen-1 ];
@@ -543,10 +547,10 @@ static void ExcelQueryToOooQuery( ScQueryEntry& rEntry )
{
aStr = aStr.copy( 1 );
}
- rEntry.GetQueryItem().maString = aStr;
}
-void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
+void XclImpAutoFilterData::ReadAutoFilter(
+ XclImpStream& rStrm, svl::SharedStringPool& rPool )
{
sal_uInt16 nCol, nFlags;
rStrm >> nCol >> nFlags;
@@ -570,7 +574,7 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
aEntry.eConnect = SC_AND;
rItem.meType = ScQueryEntry::ByString;
- rItem.maString = OUString::number(nCntOfTop10);
+ rItem.maString = rPool.intern(OUString::number(nCntOfTop10));
rStrm.Ignore(20);
return;
@@ -620,23 +624,23 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
case EXC_AFTYPE_RK:
rStrm >> nRK;
rStrm.Ignore( 4 );
- CreateFromDouble(
- rItem.maString, XclTools::GetDoubleFromRK(nRK));
+ rItem.maString = rPool.intern(
+ CreateFromDouble(XclTools::GetDoubleFromRK(nRK)));
break;
case EXC_AFTYPE_DOUBLE:
rStrm >> fVal;
- CreateFromDouble(rItem.maString, fVal);
+ rItem.maString = rPool.intern(CreateFromDouble(fVal));
break;
case EXC_AFTYPE_STRING:
rStrm.Ignore( 4 );
rStrm >> nStrLen[ nE ];
rStrm.Ignore( 3 );
- rItem.maString = OUString();
+ rItem.maString = svl::SharedString();
break;
case EXC_AFTYPE_BOOLERR:
rStrm >> nBoolErr >> nVal;
rStrm.Ignore( 6 );
- rItem.maString = OUString::number(nVal);
+ rItem.maString = rPool.intern(OUString::number(nVal));
bIgnore = (nBoolErr != 0);
break;
case EXC_AFTYPE_EMPTY:
@@ -665,8 +669,9 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
{
if (nStrLen[nE] && aEntries[nE].bDoQuery)
{
- aEntries[nE].GetQueryItem().maString = rStrm.ReadUniString(nStrLen[nE]);
- ExcelQueryToOooQuery(aEntries[nE]);
+ OUString aStr = rStrm.ReadUniString(nStrLen[nE]);
+ ExcelQueryToOooQuery(aStr, aEntries[nE]);
+ aEntries[nE].GetQueryItem().maString = rPool.intern(aStr);
aParam.AppendEntry() = aEntries[nE];
}
}
@@ -693,9 +698,9 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
ScQueryEntry::QueryItemsType aItems;
aItems.reserve(2);
ScQueryEntry::Item aItem1, aItem2;
- aItem1.maString = rStrm.ReadUniString(nStrLen[0]);
+ aItem1.maString = rPool.intern(rStrm.ReadUniString(nStrLen[0]));
aItem1.meType = ScQueryEntry::ByString;
- aItem2.maString = rStrm.ReadUniString(nStrLen[1]);
+ aItem2.maString = rPool.intern(rStrm.ReadUniString(nStrLen[1]));
aItem2.meType = ScQueryEntry::ByString;
aItems.push_back(aItem1);
aItems.push_back(aItem2);
@@ -704,8 +709,9 @@ void XclImpAutoFilterData::ReadAutoFilter( XclImpStream& rStrm )
else if (nStrLen[0] && aEntries[0].bDoQuery)
{
// Due to conflict, we can import only the first condition.
- aEntries[0].GetQueryItem().maString = rStrm.ReadUniString(nStrLen[0]);
- ExcelQueryToOooQuery(aEntries[0]);
+ OUString aStr = rStrm.ReadUniString(nStrLen[0]);
+ ExcelQueryToOooQuery(aStr, aEntries[0]);
+ aEntries[0].GetQueryItem().maString = rPool.intern(aStr);
aParam.AppendEntry() = aEntries[0];
}
}
diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx
index 938e89ac1efc..d7bea0b4533b 100644
--- a/sc/source/filter/excel/excrecds.cxx
+++ b/sc/source/filter/excel/excrecds.cxx
@@ -721,10 +721,10 @@ bool XclExpAutofilter::AddEntry( const ScQueryEntry& rEntry )
bool bConflict = false;
OUString sText;
const ScQueryEntry::Item& rItem = rItems[0];
- const OUString& rQueryStr = rItem.maString;
- if (!rQueryStr.isEmpty())
+ OUString aQueryStr = rItem.maString.getString();
+ if (!aQueryStr.isEmpty())
{
- sText = rQueryStr;
+ sText = aQueryStr;
switch( rEntry.eOp )
{
case SC_CONTAINS:
@@ -830,7 +830,7 @@ bool XclExpAutofilter::AddMultiValueEntry( const ScQueryEntry& rEntry )
const ScQueryEntry::QueryItemsType& rItems = rEntry.GetQueryItems();
ScQueryEntry::QueryItemsType::const_iterator itr = rItems.begin(), itrEnd = rItems.end();
for (; itr != itrEnd; ++itr)
- maMultiValues.push_back(itr->maString);
+ maMultiValues.push_back(itr->maString.getString());
return false;
}
diff --git a/sc/source/filter/inc/excimp8.hxx b/sc/source/filter/inc/excimp8.hxx
index d4a54cc20013..cfe1b805429c 100644
--- a/sc/source/filter/inc/excimp8.hxx
+++ b/sc/source/filter/inc/excimp8.hxx
@@ -89,7 +89,6 @@ private:
bool bCriteria:1;
bool bAutoOrAdvanced:1;
- void CreateFromDouble( OUString& rStr, double fVal );
void SetCellAttribs();
void InsertQueryParam();
@@ -107,7 +106,7 @@ public:
inline SCCOL EndCol() const { return aParam.nCol2; }
inline SCROW EndRow() const { return aParam.nRow2; }
- void ReadAutoFilter( XclImpStream& rStrm );
+ void ReadAutoFilter( XclImpStream& rStrm, svl::SharedStringPool& rPool );
inline void Activate() { bActive = true; }
void SetAdvancedRange( const ScRange* pRange );
diff --git a/sc/source/filter/xml/XMLExportDataPilot.cxx b/sc/source/filter/xml/XMLExportDataPilot.cxx
index c9b9b3b13d5f..cd711d4b0edb 100644
--- a/sc/source/filter/xml/XMLExportDataPilot.cxx
+++ b/sc/source/filter/xml/XMLExportDataPilot.cxx
@@ -112,15 +112,15 @@ void ScXMLExportDataPilot::WriteDPCondition(const ScQueryEntry& aQueryEntry, boo
if (bIsCaseSensitive)
rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE);
const ScQueryEntry::Item& rItem = aQueryEntry.GetQueryItem();
- const OUString& rQueryStr = rItem.maString;
+ OUString aQueryStr = rItem.maString.getString();
if (rItem.meType == ScQueryEntry::ByString)
{
- rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rQueryStr);
+ rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aQueryStr);
}
else
{
rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
- rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rQueryStr);
+ rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aQueryStr);
}
if (aQueryEntry.IsQueryByEmpty())
diff --git a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
index 8336e497ddec..f9ea2c6bf5b6 100644
--- a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
+++ b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
@@ -424,7 +424,7 @@ private:
WriteSetItem(ScXMLExport& r) : mrExport(r) {}
void operator() (const ScQueryEntry::Item& rItem) const
{
- mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
+ mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString());
SvXMLElementExport aElem(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_SET_ITEM, true, true);
}
};
@@ -447,7 +447,7 @@ private:
// Single item condition.
const ScQueryEntry::Item& rItem = rItems.front();
if (rItem.meType == ScQueryEntry::ByString)
- mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
+ mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString());
else
{
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
@@ -466,7 +466,7 @@ private:
// Store the 1st value for backward compatibility.
const ScQueryEntry::Item& rItem = rItems.front();
- mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
+ mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString());
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, OUString("="));
SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true);
diff --git a/sc/source/filter/xml/xmlfilti.cxx b/sc/source/filter/xml/xmlfilti.cxx
index 75c0af36a379..6e8f88b1c286 100644
--- a/sc/source/filter/xml/xmlfilti.cxx
+++ b/sc/source/filter/xml/xmlfilti.cxx
@@ -24,7 +24,9 @@
#include "XMLConverter.hxx"
#include "rangeutl.hxx"
#include "queryentry.hxx"
+#include "document.hxx"
+#include "svl/sharedstringpool.hxx"
#include <xmloff/xmltkmap.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
@@ -452,7 +454,8 @@ void ScXMLConditionContext::EndElement()
}
else
{
- rItem.maString = sConditionValue;
+ svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool();
+ rItem.maString = rPool.intern(sConditionValue);
rItem.meType = ScQueryEntry::ByString;
}
}
@@ -490,8 +493,9 @@ ScXMLSetItemContext::ScXMLSetItemContext(
{
case XML_TOK_FILTER_SET_ITEM_ATTR_VALUE:
{
+ svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool();
ScQueryEntry::Item aItem;
- aItem.maString = sValue;
+ aItem.maString = rPool.intern(sValue);
aItem.meType = ScQueryEntry::ByString;
aItem.mfVal = 0.0;
rParent.AddSetItem(aItem);
@@ -864,15 +868,17 @@ void ScXMLDPConditionContext::EndElement()
pFilterContext->SetUseRegularExpressions(bUseRegularExpressions);
aFilterField.nField = nField;
ScQueryEntry::Item& rItem = aFilterField.GetQueryItem();
+ svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool();
+
if (IsXMLToken(sDataType, XML_NUMBER))
{
rItem.mfVal = sConditionValue.toDouble();
- rItem.maString = sConditionValue;
+ rItem.maString = rPool.intern(sConditionValue);
rItem.meType = ScQueryEntry::ByValue;
}
else
{
- rItem.maString = sConditionValue;
+ rItem.maString = rPool.intern(sConditionValue);
rItem.meType = ScQueryEntry::ByString;
rItem.mfVal = 0.0;
}
diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index bc68214a63be..a15613109b8c 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -37,6 +37,7 @@
#include "filtdlg.hxx"
#include <vcl/msgbox.hxx>
+#include "svl/sharedstringpool.hxx"
#include <limits>
@@ -272,7 +273,8 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
}
else
{
- if (rItem.maString.isEmpty())
+ OUString aQueryStr = rItem.maString.getString();
+ if (aQueryStr.isEmpty())
{
if (rItem.meType == ScQueryEntry::ByValue)
pDoc->GetFormatTable()->GetInputLineString( rItem.mfVal, 0, aValStr);
@@ -285,7 +287,7 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
else
{
SAL_WARN( "sc", "ScFilterDlg::Init: empty query string, really?");
- aValStr = rItem.maString;
+ aValStr = aQueryStr;
}
}
else
@@ -293,7 +295,7 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
// XXX NOTE: if not ByString we just assume this has been
// set to a proper string corresponding to the numeric
// value earlier!
- aValStr = rItem.maString;
+ aValStr = aQueryStr;
}
}
}
@@ -1128,12 +1130,12 @@ IMPL_LINK( ScFilterDlg, ValModifyHdl, ComboBox*, pEd )
}
else
{
- rItem.maString = aStrVal;
+ rItem.maString = pDoc->GetSharedStringPool().intern(aStrVal);
rItem.mfVal = 0.0;
sal_uInt32 nIndex = 0;
bool bNumber = pDoc->GetFormatTable()->IsNumberFormat(
- rItem.maString, nIndex, rItem.mfVal);
+ rItem.maString.getString(), nIndex, rItem.mfVal);
rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
}
@@ -1193,7 +1195,7 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );
const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
- const OUString& rQueryStr = rItem.maString;
+ OUString aQueryStr = rItem.maString.getString();
if (rEntry.IsQueryByEmpty())
{
aValStr = aStrEmpty;
@@ -1206,7 +1208,7 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
}
else
{
- aValStr = rQueryStr;
+ aValStr = aQueryStr;
maCondLbArr[i]->Enable();
}
maFieldLbArr[i]->Enable();
diff --git a/sc/source/ui/dbgui/pfiltdlg.cxx b/sc/source/ui/dbgui/pfiltdlg.cxx
index 8fab570cfbd4..edcf8bff8f3a 100644
--- a/sc/source/ui/dbgui/pfiltdlg.cxx
+++ b/sc/source/ui/dbgui/pfiltdlg.cxx
@@ -42,6 +42,7 @@
#include "pfiltdlg.hxx"
#undef _PFILTDLG_CXX
#include <svl/zforlist.hxx>
+#include "svl/sharedstringpool.hxx"
//==================================================================
@@ -199,7 +200,7 @@ void ScPivotFilterDlg::Init( const SfxItemSet& rArgSet )
{
const ScQueryEntry& rEntry = theQueryData.GetEntry(i);
const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
- OUString aValStr = rItem.maString;
+ OUString aValStr = rItem.maString.getString();
if (rEntry.IsQueryByEmpty())
aValStr = aStrEmpty;
else if (rEntry.IsQueryByNonEmpty())
@@ -382,6 +383,8 @@ const ScQueryItem& ScPivotFilterDlg::GetOutputItem()
sal_uInt16 nConnect1 = aLbConnect1.GetSelectEntryPos();
sal_uInt16 nConnect2 = aLbConnect2.GetSelectEntryPos();
+ svl::SharedStringPool& rPool = pViewData->GetDocument()->GetSharedStringPool();
+
for ( SCSIZE i=0; i<3; i++ )
{
sal_uInt16 nField = aFieldLbArr[i]->GetSelectEntryPos();
@@ -414,7 +417,7 @@ const ScQueryItem& ScPivotFilterDlg::GetOutputItem()
}
else
{
- rItem.maString = aStrVal;
+ rItem.maString = rPool.intern(aStrVal);
rItem.mfVal = 0.0;
rItem.meType = ScQueryEntry::ByString;
}
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 19c1e8150f2d..d081d1f1abee 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -32,6 +32,7 @@
#include <editeng/langitem.hxx>
#include <sfx2/linkmgr.hxx>
#include <svl/srchitem.hxx>
+#include "svl/sharedstringpool.hxx"
#include <svx/unomid.hxx>
#include <editeng/unoprnms.hxx>
#include <editeng/unotext.hxx>
@@ -5699,6 +5700,7 @@ void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDe
static_cast<SCCOLROW>(aRange.aStart.Col()) :
static_cast<SCCOLROW>(aRange.aStart.Row());
SCSIZE nCount = aParam.GetEntryCount();
+ svl::SharedStringPool& rPool = pDocSh->GetDocument()->GetSharedStringPool();
for (SCSIZE i=0; i<nCount; i++)
{
ScQueryEntry& rEntry = aParam.GetEntry(i);
@@ -5711,8 +5713,9 @@ void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDe
ScQueryEntry::Item& rItem = rItems.front();
if (rItem.meType != ScQueryEntry::ByString)
{
- pDocSh->GetDocument()->GetFormatTable()->
- GetInputLineString(rItem.mfVal, 0, rItem.maString);
+ OUString aStr;
+ pDocSh->GetDocument()->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aStr);
+ rItem.maString = rPool.intern(aStr);
}
}
}
diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index 56a7e80ce3ad..594561b3f62f 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -17,8 +17,11 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include "datauno.hxx"
+
#include <svl/smplhint.hxx>
#include <svl/zforlist.hxx>
+#include "svl/sharedstringpool.hxx"
#include <vcl/svapp.hxx>
#include <com/sun/star/awt/XBitmap.hpp>
@@ -31,7 +34,6 @@
#include <com/sun/star/sheet/FilterOperator2.hpp>
#include <com/sun/star/sheet/TableFilterField2.hpp>
-#include "datauno.hxx"
#include "dapiuno.hxx"
#include "cellsuno.hxx"
#include "miscuno.hxx"
@@ -1061,7 +1063,7 @@ uno::Sequence<sheet::TableFilterField> SAL_CALL ScFilterDescriptorBase::getFilte
sheet::FilterConnection_OR;
aField.Field = rEntry.nField;
aField.IsNumeric = rItem.meType != ScQueryEntry::ByString;
- aField.StringValue = rItem.maString;
+ aField.StringValue = rItem.maString.getString();
aField.NumericValue = rItem.mfVal;
switch (rEntry.eOp) // ScQueryOp
@@ -1176,6 +1178,7 @@ void fillQueryParam(
rParam.Resize(nCount);
const sheet::TableFilterField2* pAry = aFilterFields.getConstArray();
+ svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
for (size_t i = 0; i < nCount; ++i)
{
ScQueryEntry& rEntry = rParam.GetEntry(i);
@@ -1188,10 +1191,14 @@ void fillQueryParam(
ScQueryEntry::Item& rItem = rItems.front();
rItem.meType = pAry[i].IsNumeric ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
rItem.mfVal = pAry[i].NumericValue;
- rItem.maString = pAry[i].StringValue;
+ rItem.maString = rPool.intern(pAry[i].StringValue);
- if (rItem.meType == ScQueryEntry::ByValue && pDoc)
- pDoc->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, rItem.maString);
+ if (rItem.meType == ScQueryEntry::ByValue)
+ {
+ OUString aStr;
+ pDoc->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aStr);
+ rItem.maString = rPool.intern(aStr);
+ }
}
}
@@ -1207,6 +1214,7 @@ void fillQueryParam(
size_t nCount = static_cast<size_t>(aFilterFields.getLength());
rParam.Resize(nCount);
+ svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
const sheet::TableFilterField3* pAry = aFilterFields.getConstArray();
for (size_t i = 0; i < nCount; ++i)
{
@@ -1223,10 +1231,14 @@ void fillQueryParam(
ScQueryEntry::Item aItem;
aItem.meType = rVals[j].IsNumeric ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
aItem.mfVal = rVals[j].NumericValue;
- aItem.maString = rVals[j].StringValue;
+ aItem.maString = rPool.intern(rVals[j].StringValue);
- if (aItem.meType == ScQueryEntry::ByValue && pDoc)
- pDoc->GetFormatTable()->GetInputLineString(aItem.mfVal, 0, aItem.maString);
+ if (aItem.meType == ScQueryEntry::ByValue)
+ {
+ OUString aStr;
+ pDoc->GetFormatTable()->GetInputLineString(aItem.mfVal, 0, aStr);
+ aItem.maString = rPool.intern(aStr);
+ }
rItems.push_back(aItem);
}
@@ -1282,7 +1294,7 @@ throw(uno::RuntimeException)
{
const ScQueryEntry::Item& rItem = rEntry.GetQueryItems().front();
aField.IsNumeric = rItem.meType != ScQueryEntry::ByString;
- aField.StringValue = rItem.maString;
+ aField.StringValue = rItem.maString.getString();
aField.NumericValue = rItem.mfVal;
}
@@ -1340,7 +1352,7 @@ uno::Sequence<sheet::TableFilterField3> SAL_CALL ScFilterDescriptorBase::getFilt
for (size_t j = 0; itr != itrEnd; ++itr, ++j)
{
aField.Values[j].IsNumeric = itr->meType != ScQueryEntry::ByString;
- aField.Values[j].StringValue = itr->maString;
+ aField.Values[j].StringValue = itr->maString.getString();
aField.Values[j].NumericValue = itr->mfVal;
}
@@ -1362,6 +1374,8 @@ void SAL_CALL ScFilterDescriptorBase::setFilterFields(
SCSIZE nCount = static_cast<SCSIZE>(aFilterFields.getLength());
aParam.Resize( nCount );
+ ScDocument* pDoc = pDocSh->GetDocument();
+ svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
const sheet::TableFilterField* pAry = aFilterFields.getConstArray();
SCSIZE i;
for (i=0; i<nCount; i++)
@@ -1375,10 +1389,14 @@ void SAL_CALL ScFilterDescriptorBase::setFilterFields(
rEntry.nField = pAry[i].Field;
rItem.meType = pAry[i].IsNumeric ? ScQueryEntry::ByValue : ScQueryEntry::ByString;
rItem.mfVal = pAry[i].NumericValue;
- rItem.maString = pAry[i].StringValue;
+ rItem.maString = rPool.intern(pAry[i].StringValue);
- if (rItem.meType != ScQueryEntry::ByString && pDocSh)
- pDocSh->GetDocument()->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, rItem.maString);
+ if (rItem.meType != ScQueryEntry::ByString)
+ {
+ OUString aStr;
+ pDoc->GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aStr);
+ rItem.maString = rPool.intern(aStr);
+ }
switch (pAry[i].Operator) // FilterOperator
{
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 2de9a7701085..62b1651ebde8 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -38,6 +38,7 @@
#include <svl/stritem.hxx>
#include <svtools/svtabbx.hxx>
#include <svl/urlbmk.hxx>
+#include "svl/sharedstringpool.hxx"
#include <vcl/cursor.hxx>
#include <vcl/graph.hxx>
#include <vcl/hatch.hxx>
@@ -646,12 +647,14 @@ public:
class AddItemToEntry : public std::unary_function<OUString, void>
{
ScQueryEntry::QueryItemsType& mrItems;
+ svl::SharedStringPool& mrPool;
public:
- AddItemToEntry(ScQueryEntry::QueryItemsType& rItems) : mrItems(rItems) {}
+ AddItemToEntry(ScQueryEntry::QueryItemsType& rItems, svl::SharedStringPool& rPool) :
+ mrItems(rItems), mrPool(rPool) {}
void operator() (const OUString& rSelected)
{
ScQueryEntry::Item aNew;
- aNew.maString = rSelected;
+ aNew.maString = mrPool.intern(rSelected);
aNew.meType = ScQueryEntry::ByString;
aNew.mfVal = 0.0;
mrItems.push_back(aNew);
@@ -667,7 +670,7 @@ public:
void operator() (const ScQueryEntry::Item& rItem)
{
- mrSet.insert(rItem.maString);
+ mrSet.insert(rItem.maString.getString());
}
};
@@ -780,12 +783,13 @@ void ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode)
if (!pDBData)
return;
+ ScDocument* pDoc = pViewData->GetDocument();
+ svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
switch (eMode)
{
case SortAscending:
case SortDescending:
{
- ScDocument* pDoc = pViewData->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
SCCOL nCol = rPos.Col();
ScSortParam aSortParam;
@@ -866,13 +870,13 @@ void ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode)
ScQueryEntry::QueryItemsType& rItems = pEntry->GetQueryItems();
rItems.clear();
- std::for_each(aSelected.begin(), aSelected.end(), AddItemToEntry(rItems));
+ std::for_each(aSelected.begin(), aSelected.end(), AddItemToEntry(rItems, rPool));
}
break;
case Top10:
pEntry->eOp = SC_TOPVAL;
pEntry->GetQueryItem().meType = ScQueryEntry::ByString;
- pEntry->GetQueryItem().maString = OUString("10");
+ pEntry->GetQueryItem().maString = rPool.intern("10");
break;
case Empty:
pEntry->SetQueryByEmpty();
@@ -1230,15 +1234,15 @@ void ScGridWindow::LaunchDataSelectMenu( SCCOL nCol, SCROW nRow, bool bDataSelec
bValid = false;
if (rEntry.nField == nCol)
{
- const OUString& rQueryStr = rEntry.GetQueryItem().maString;
+ OUString aQueryStr = rEntry.GetQueryItem().maString.getString();
if (rEntry.eOp == SC_EQUAL)
{
- if (!rQueryStr.isEmpty())
+ if (!aQueryStr.isEmpty())
{
- nSelPos = pFilterBox->GetEntryPos(rQueryStr);
+ nSelPos = pFilterBox->GetEntryPos(aQueryStr);
}
}
- else if ( rEntry.eOp == SC_TOPVAL && rQueryStr == "10" )
+ else if ( rEntry.eOp == SC_TOPVAL && aQueryStr == "10" )
nSelPos = SC_AUTOFILTER_TOP10;
else
nSelPos = SC_AUTOFILTER_CUSTOM;
@@ -1381,6 +1385,7 @@ void ScGridWindow::ExecFilter( sal_uLong nSel,
{
SCTAB nTab = pViewData->GetTabNo();
ScDocument* pDoc = pViewData->GetDocument();
+ svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
ScDBData* pDBData = pDoc->GetDBAtCursor( nCol, nRow, nTab );
if (pDBData)
@@ -1454,7 +1459,7 @@ void ScGridWindow::ExecFilter( sal_uLong nSel,
if ( nSel == SC_AUTOFILTER_TOP10 )
{
rNewEntry.eOp = SC_TOPVAL;
- rItem.maString = OUString("10");
+ rItem.maString = rPool.intern("10");
}
else if (nSel == SC_AUTOFILTER_EMPTY)
{
@@ -1467,7 +1472,7 @@ void ScGridWindow::ExecFilter( sal_uLong nSel,
else
{
rNewEntry.eOp = SC_EQUAL;
- rItem.maString = aValue;
+ rItem.maString = rPool.intern(aValue);
}
if (nQueryPos > 0)
rNewEntry.eConnect = SC_AND;