diff options
-rw-r--r-- | sc/inc/queryentry.hxx | 3 | ||||
-rw-r--r-- | sc/inc/queryparam.hxx | 8 | ||||
-rw-r--r-- | sc/source/core/data/dociter.cxx | 10 | ||||
-rw-r--r-- | sc/source/core/data/dpcache.cxx | 9 | ||||
-rw-r--r-- | sc/source/core/data/dpshttab.cxx | 2 | ||||
-rw-r--r-- | sc/source/core/data/table3.cxx | 21 | ||||
-rw-r--r-- | sc/source/core/tool/doubleref.cxx | 20 | ||||
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 70 | ||||
-rw-r--r-- | sc/source/core/tool/lookupcache.cxx | 2 | ||||
-rw-r--r-- | sc/source/core/tool/queryentry.cxx | 14 | ||||
-rw-r--r-- | sc/source/core/tool/queryparam.cxx | 19 | ||||
-rw-r--r-- | sc/source/filter/excel/excimp8.cxx | 46 | ||||
-rw-r--r-- | sc/source/filter/excel/excrecds.cxx | 8 | ||||
-rw-r--r-- | sc/source/filter/inc/excimp8.hxx | 3 | ||||
-rw-r--r-- | sc/source/filter/xml/XMLExportDataPilot.cxx | 6 | ||||
-rw-r--r-- | sc/source/filter/xml/XMLExportDatabaseRanges.cxx | 6 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlfilti.cxx | 14 | ||||
-rw-r--r-- | sc/source/ui/dbgui/filtdlg.cxx | 16 | ||||
-rw-r--r-- | sc/source/ui/dbgui/pfiltdlg.cxx | 7 | ||||
-rw-r--r-- | sc/source/ui/unoobj/cellsuno.cxx | 7 | ||||
-rw-r--r-- | sc/source/ui/unoobj/datauno.cxx | 44 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 29 |
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; |