[Libreoffice-commits] core.git: Branch 'private/kohei/calc-shared-string' - sc/inc sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Tue Oct 8 18:46:26 PDT 2013


 sc/inc/queryentry.hxx                            |    3 
 sc/inc/queryparam.hxx                            |    8 ++
 sc/source/core/data/dociter.cxx                  |   10 +--
 sc/source/core/data/dpcache.cxx                  |    9 +-
 sc/source/core/data/dpshttab.cxx                 |    2 
 sc/source/core/data/table3.cxx                   |   21 ++++--
 sc/source/core/tool/doubleref.cxx                |   20 +++---
 sc/source/core/tool/interpr1.cxx                 |   70 +++++++++++------------
 sc/source/core/tool/lookupcache.cxx              |    2 
 sc/source/core/tool/queryentry.cxx               |   14 ++--
 sc/source/core/tool/queryparam.cxx               |   19 +++---
 sc/source/filter/excel/excimp8.cxx               |   46 ++++++++-------
 sc/source/filter/excel/excrecds.cxx              |    8 +-
 sc/source/filter/inc/excimp8.hxx                 |    3 
 sc/source/filter/xml/XMLExportDataPilot.cxx      |    6 -
 sc/source/filter/xml/XMLExportDatabaseRanges.cxx |    6 -
 sc/source/filter/xml/xmlfilti.cxx                |   14 +++-
 sc/source/ui/dbgui/filtdlg.cxx                   |   16 ++---
 sc/source/ui/dbgui/pfiltdlg.cxx                  |    7 +-
 sc/source/ui/unoobj/cellsuno.cxx                 |    7 +-
 sc/source/ui/unoobj/datauno.cxx                  |   44 ++++++++++----
 sc/source/ui/view/gridwin.cxx                    |   29 +++++----
 22 files changed, 214 insertions(+), 150 deletions(-)

New commits:
commit bf91532f101d4f44cc5e8e4b44ada59d1c268749
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Tue Oct 8 21:46:56 2013 -0400

    Store svl::SharedString in query entry items, and adjust all call sites.
    
    Change-Id: Ifd3bbb84c7abbe983a017a169c7e05914ef33450

diff --git a/sc/inc/queryentry.hxx b/sc/inc/queryentry.hxx
index a3baea6..cc35b23 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 ad311ff..ff89d3e 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 189c822..3cad91c 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 874efb2..5ef3ada 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 f4a80b2..93af29c 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 59e080c..9b63531 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 68f930d..3483809 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 770ee24..9400bec 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 a676a72..914b188 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 1ac1a89..f933516 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 5ce8f89..071c345 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 fea897b..d4d4cc5 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 938e89a..d7bea0b 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 d4a54cc..cfe1b80 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 c9b9b3b..cd711d4 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 8336e49..f9ea2c6 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 75c0af3..6e8f88b 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 bc68214..a156131 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 8fab570..edcf8bf 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 19c1e81..d081d1f 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 56a7e80..594561b 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 2de9a77..62b1651 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;


More information about the Libreoffice-commits mailing list