oox/source/token/properties.txt | 1 sc/inc/queryentry.hxx | 14 ++--- sc/source/core/data/dociter.cxx | 6 +- sc/source/core/data/dpcache.cxx | 12 ++-- sc/source/core/data/table3.cxx | 74 +++++++++++++++--------------- sc/source/core/tool/compare.cxx | 4 - sc/source/core/tool/interpr1.cxx | 11 ++-- sc/source/core/tool/queryentry.cxx | 4 - sc/source/filter/excel/impop.cxx | 1 sc/source/filter/oox/workbooksettings.cxx | 1 sc/source/ui/inc/tpcalc.hxx | 1 sc/source/ui/optdlg/tpcalc.cxx | 22 ++++++++ sc/uiconfig/scalc/ui/optcalculatepage.ui | 24 ++++++++- 13 files changed, 106 insertions(+), 69 deletions(-)
New commits: commit 4eea29f79eca05e76bfe90aaa176f39dd0fd80ea Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 21:06:45 2016 +0100 enable wildcards when importing .xlsx|.xlsb, tdf#72196 Change-Id: I6fbc8926d10d9028287c154a2e933d2de847cc12 diff --git a/sc/source/filter/oox/workbooksettings.cxx b/sc/source/filter/oox/workbooksettings.cxx index b61885e6..831314f 100644 --- a/sc/source/filter/oox/workbooksettings.cxx +++ b/sc/source/filter/oox/workbooksettings.cxx @@ -186,6 +186,7 @@ void WorkbookSettings::finalizeImport() case FILTER_BIFF: aPropSet.setProperty( PROP_IgnoreCase, true ); // always in Excel aPropSet.setProperty( PROP_RegularExpressions, false ); // not supported in Excel + aPropSet.setProperty( PROP_Wildcards, true ); // always in Excel break; case FILTER_UNKNOWN: break; commit 5eaab67daa3dc6e18fa3b901a9ec57b509733905 Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 21:01:15 2016 +0100 add Wildcards / PROP_Wildcards, tdf#72196 Change-Id: I7045042cba991a834f24f237d983ac3693f4b93d diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index dfef4dc..5290914 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -561,6 +561,7 @@ VisualEffect Weight WhiteDay Width +Wildcards WritingMode XLA1Representation ZoomType commit faf7979144203d110111a2a4e80c7688a45cd538 Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 20:50:15 2016 +0100 enable wildcards when importing .xls, tdf#72196 Change-Id: Ice014ef31c9962a2d77496236712b59cd147b6e8 diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx index 470c315..c4e2717 100644 --- a/sc/source/filter/excel/impop.cxx +++ b/sc/source/filter/excel/impop.cxx @@ -148,6 +148,7 @@ ImportExcel::ImportExcel( XclImpRootData& rImpData, SvStream& rStrm ): ScDocOptions aDocOpt( pD->GetDocOptions() ); aDocOpt.SetIgnoreCase( true ); // always in Excel aDocOpt.SetFormulaRegexEnabled( false ); // regular expressions? what's that? + aDocOpt.SetFormulaWildcardsEnabled( true ); // Excel uses wildcard expressions aDocOpt.SetLookUpColRowNames( false ); // default: no natural language refs pD->SetDocOptions( aDocOpt ); } commit 20b5917966d931fc9cbb8dd24a957f80f95e64bc Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 20:43:50 2016 +0100 add wildcards to Tools->Options->Calc->Calculate dialog, tdf#72196 Maybe this should be a radio button instead (wildcards/regex/literal), on the other hand it reflects the two API bool values. Also only two checkbox lines are needed instead of three radio button lines. Change-Id: I3fa74e19c838e10dc0cffd6c0ad6329017e10e56 diff --git a/sc/source/ui/inc/tpcalc.hxx b/sc/source/ui/inc/tpcalc.hxx index 9476ac1..1d99e1e 100644 --- a/sc/source/ui/inc/tpcalc.hxx +++ b/sc/source/ui/inc/tpcalc.hxx @@ -60,6 +60,7 @@ private: VclPtr<CheckBox> m_pBtnCase; VclPtr<CheckBox> m_pBtnCalc; VclPtr<CheckBox> m_pBtnMatch; + VclPtr<CheckBox> m_pBtnWildcards; VclPtr<CheckBox> m_pBtnRegex; VclPtr<CheckBox> m_pBtnLookUp; VclPtr<CheckBox> m_pBtnGeneralPrec; diff --git a/sc/source/ui/optdlg/tpcalc.cxx b/sc/source/ui/optdlg/tpcalc.cxx index 8073d37..b3fcfb7 100644 --- a/sc/source/ui/optdlg/tpcalc.cxx +++ b/sc/source/ui/optdlg/tpcalc.cxx @@ -55,6 +55,7 @@ ScTpCalcOptions::ScTpCalcOptions(vcl::Window* pParent, const SfxItemSet& rCoreAt get(m_pBtnCase, "case"); get(m_pBtnCalc, "calc"); get(m_pBtnMatch, "match"); + get(m_pBtnWildcards, "wildcards"); get(m_pBtnRegex, "regex"); get(m_pBtnLookUp, "lookup"); get(m_pBtnGeneralPrec, "generalprec"); @@ -84,6 +85,7 @@ void ScTpCalcOptions::dispose() m_pBtnCase.clear(); m_pBtnCalc.clear(); m_pBtnMatch.clear(); + m_pBtnWildcards.clear(); m_pBtnRegex.clear(); m_pBtnLookUp.clear(); m_pBtnGeneralPrec.clear(); @@ -99,6 +101,8 @@ void ScTpCalcOptions::Init() m_pBtnDateStd->SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) ); m_pBtnDateSc10->SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) ); m_pBtnDate1904->SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) ); + m_pBtnWildcards->SetClickHdl( LINK( this, ScTpCalcOptions, CheckClickHdl ) ); + m_pBtnRegex->SetClickHdl( LINK( this, ScTpCalcOptions, CheckClickHdl ) ); } VclPtr<SfxTabPage> ScTpCalcOptions::Create( vcl::Window* pParent, const SfxItemSet* rAttrSet ) @@ -115,7 +119,12 @@ void ScTpCalcOptions::Reset( const SfxItemSet* /* rCoreAttrs */ ) m_pBtnCase->Check( !pLocalOptions->IsIgnoreCase() ); m_pBtnCalc->Check( pLocalOptions->IsCalcAsShown() ); m_pBtnMatch->Check( pLocalOptions->IsMatchWholeCell() ); - m_pBtnRegex->Check( pLocalOptions->IsFormulaRegexEnabled() ); + bool bWildcards = pLocalOptions->IsFormulaWildcardsEnabled(); + bool bRegex = pLocalOptions->IsFormulaRegexEnabled(); + if (bWildcards && bRegex) + bRegex = false; + m_pBtnWildcards->Check( bWildcards ); + m_pBtnRegex->Check( bRegex ); m_pBtnLookUp->Check( pLocalOptions->IsLookUpColRowNames() ); m_pBtnIterate->Check( pLocalOptions->IsIter() ); m_pEdSteps->SetValue( pLocalOptions->GetIterCount() ); @@ -161,6 +170,7 @@ bool ScTpCalcOptions::FillItemSet( SfxItemSet* rCoreAttrs ) pLocalOptions->SetIgnoreCase( !m_pBtnCase->IsChecked() ); pLocalOptions->SetCalcAsShown( m_pBtnCalc->IsChecked() ); pLocalOptions->SetMatchWholeCell( m_pBtnMatch->IsChecked() ); + pLocalOptions->SetFormulaWildcardsEnabled( m_pBtnWildcards->IsChecked() ); pLocalOptions->SetFormulaRegexEnabled( m_pBtnRegex->IsChecked() ); pLocalOptions->SetLookUpColRowNames( m_pBtnLookUp->IsChecked() ); @@ -253,6 +263,16 @@ IMPL_LINK_TYPED( ScTpCalcOptions, CheckClickHdl, Button*, p, void ) m_pFtEps->Disable(); m_pEdEps->Disable(); } } + else if (pBtn == m_pBtnWildcards) + { + if ( pBtn->IsChecked() ) + m_pBtnRegex->Check( false ); + } + else if (pBtn == m_pBtnRegex) + { + if ( pBtn->IsChecked() ) + m_pBtnWildcards->Check( false ); + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/uiconfig/scalc/ui/optcalculatepage.ui b/sc/uiconfig/scalc/ui/optcalculatepage.ui index a9dca19..6b0e1c0 100644 --- a/sc/uiconfig/scalc/ui/optcalculatepage.ui +++ b/sc/uiconfig/scalc/ui/optcalculatepage.ui @@ -92,8 +92,8 @@ </packing> </child> <child> - <object class="GtkCheckButton" id="regex"> - <property name="label" translatable="yes">_Enable regular expressions in formulas</property> + <object class="GtkCheckButton" id="wildcards"> + <property name="label" translatable="yes">Enable w_ildcards in formulas</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -108,6 +108,22 @@ </packing> </child> <child> + <object class="GtkCheckButton" id="regex"> + <property name="label" translatable="yes">Enable r_egular expressions in formulas</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">4</property> + <property name="width">2</property> + </packing> + </child> + <child> <object class="GtkCheckButton" id="lookup"> <property name="label" translatable="yes">_Automatically find column and row labels</property> <property name="visible">True</property> @@ -119,7 +135,7 @@ </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">4</property> + <property name="top_attach">5</property> <property name="width">2</property> </packing> </child> @@ -135,7 +151,7 @@ </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">5</property> + <property name="top_attach">6</property> </packing> </child> <child> commit d098b76f3311ec1b1763dbcfc1561791a4a2945f Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 19:52:59 2016 +0100 change to DetectSearchType(), tdf#72196 Change-Id: I34cc3faa325f754e4f1dc5236a65f16e035d6c27 diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 82f6beb..a35a976 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -8147,9 +8147,7 @@ void ScInterpreter::ScSearch() PushNoValue(); else { - utl::SearchParam::SearchType eSearchType = - (MayBeRegExp( SearchStr, pDok ) ? - utl::SearchParam::SRCH_REGEXP : utl::SearchParam::SRCH_NORMAL); + utl::SearchParam::SearchType eSearchType = DetectSearchType( SearchStr, pDok ); utl::SearchParam sPar(SearchStr, eSearchType, false, false, false); utl::TextSearch sT( sPar, *ScGlobal::pCharClass ); bool bBool = sT.SearchForward(sStr, &nPos, &nEndPos); commit 41cd992b0229b2cb814b96b52c0038bf12473b37 Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 19:47:30 2016 +0100 confusing block indentation Change-Id: I42dc30742a65062374e700a70796f129e61b13c1 diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index dfebe57..b3974f5 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -2435,32 +2435,34 @@ public: && (nStart != 0 || nEnd != aCellStr.getLength()) ) bMatch = false; // RegExp must match entire cell string if ( bRealWildOrRegExp ) - switch (rEntry.eOp) { - case SC_EQUAL: - case SC_CONTAINS: - bOk = bMatch; - break; - case SC_NOT_EQUAL: - case SC_DOES_NOT_CONTAIN: - bOk = !bMatch; - break; - case SC_BEGINS_WITH: - bOk = ( bMatch && (nStart == 0) ); - break; - case SC_DOES_NOT_BEGIN_WITH: - bOk = !( bMatch && (nStart == 0) ); - break; - case SC_ENDS_WITH: - bOk = ( bMatch && (nEnd == aCellStr.getLength()) ); - break; - case SC_DOES_NOT_END_WITH: - bOk = !( bMatch && (nEnd == aCellStr.getLength()) ); - break; - default: - { - // added to avoid warnings - } + switch (rEntry.eOp) + { + case SC_EQUAL: + case SC_CONTAINS: + bOk = bMatch; + break; + case SC_NOT_EQUAL: + case SC_DOES_NOT_CONTAIN: + bOk = !bMatch; + break; + case SC_BEGINS_WITH: + bOk = ( bMatch && (nStart == 0) ); + break; + case SC_DOES_NOT_BEGIN_WITH: + bOk = !( bMatch && (nStart == 0) ); + break; + case SC_ENDS_WITH: + bOk = ( bMatch && (nEnd == aCellStr.getLength()) ); + break; + case SC_DOES_NOT_END_WITH: + bOk = !( bMatch && (nEnd == aCellStr.getLength()) ); + break; + default: + { + // added to avoid warnings + } + } } else bTestEqual = bMatch; commit d3c79d019114b7786268a1e821f96554e54767c0 Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 19:43:40 2016 +0100 adapt places that call GetSearchTextPtr(), tdf#72196 ... to do that not only for regexp. Change-Id: I0a6d878c7b30b1668dda902f0e50ae3c3cc3b486 diff --git a/sc/source/core/data/dpcache.cxx b/sc/source/core/data/dpcache.cxx index d6e104d..b60e9c7 100644 --- a/sc/source/core/data/dpcache.cxx +++ b/sc/source/core/data/dpcache.cxx @@ -529,10 +529,10 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const { // by String OUString aCellStr = pCellData->GetString(); - bool bRealRegExp = (rParam.eSearchType == utl::SearchParam::SRCH_REGEXP && + bool bRealWildOrRegExp = (rParam.eSearchType != utl::SearchParam::SRCH_NORMAL && ((rEntry.eOp == SC_EQUAL) || (rEntry.eOp == SC_NOT_EQUAL))); - bool bTestRegExp = false; - if (bRealRegExp || bTestRegExp) + bool bTestWildOrRegExp = false; + if (bRealWildOrRegExp || bTestWildOrRegExp) { sal_Int32 nStart = 0; sal_Int32 nEnd = aCellStr.getLength(); @@ -543,10 +543,10 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const if (bMatch && bMatchWholeCell && (nStart != 0 || nEnd != aCellStr.getLength())) bMatch = false; // RegExp must match entire cell string - if (bRealRegExp) + if (bRealWildOrRegExp) bOk = ((rEntry.eOp == SC_NOT_EQUAL) ? !bMatch : bMatch); } - if (!bRealRegExp) + if (!bRealWildOrRegExp) { if (rEntry.eOp == SC_EQUAL || rEntry.eOp == SC_NOT_EQUAL) { diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index cfefd57..dfebe57 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -2213,20 +2213,20 @@ class QueryEvaluator return false; } - bool isRealRegExp(const ScQueryEntry& rEntry) const + bool isRealWildOrRegExp(const ScQueryEntry& rEntry) const { - if (mrParam.eSearchType != utl::SearchParam::SRCH_REGEXP) + if (mrParam.eSearchType == utl::SearchParam::SRCH_NORMAL) return false; return isTextMatchOp(rEntry); } - bool isTestRegExp(const ScQueryEntry& rEntry) const + bool isTestWildOrRegExp(const ScQueryEntry& rEntry) const { if (!mpTestEqualCondition) return false; - if (mrParam.eSearchType != utl::SearchParam::SRCH_REGEXP) + if (mrParam.eSearchType == utl::SearchParam::SRCH_NORMAL) return false; return (rEntry.eOp == SC_LESS_EQUAL || rEntry.eOp == SC_GREATER_EQUAL); @@ -2409,10 +2409,10 @@ public: aCellStr = mrStrPool.intern(aStr); } - bool bRealRegExp = isRealRegExp(rEntry); - bool bTestRegExp = isTestRegExp(rEntry); + bool bRealWildOrRegExp = isRealWildOrRegExp(rEntry); + bool bTestWildOrRegExp = isTestWildOrRegExp(rEntry); - if ( bRealRegExp || bTestRegExp ) + if ( bRealWildOrRegExp || bTestWildOrRegExp ) { sal_Int32 nStart = 0; sal_Int32 nEnd = aCellStr.getLength(); @@ -2434,7 +2434,7 @@ public: if ( bMatch && bMatchWholeCell && (nStart != 0 || nEnd != aCellStr.getLength()) ) bMatch = false; // RegExp must match entire cell string - if ( bRealRegExp ) + if ( bRealWildOrRegExp ) switch (rEntry.eOp) { case SC_EQUAL: @@ -2465,7 +2465,7 @@ public: else bTestEqual = bMatch; } - if ( !bRealRegExp ) + if ( !bRealWildOrRegExp ) { // Simple string matching i.e. no regexp match. if (isTextMatchOp(rEntry)) diff --git a/sc/source/core/tool/compare.cxx b/sc/source/core/tool/compare.cxx index 8433202..cf5c0ff 100644 --- a/sc/source/core/tool/compare.cxx +++ b/sc/source/core/tool/compare.cxx @@ -136,7 +136,7 @@ double CompareFunc( const Compare& rComp, CompareOptions* pOptions ) // regex to work through GetSearchTextPtr(). ScQueryEntry& rEntry = pOptions->aQueryEntry; OSL_ENSURE(rEntry.GetQueryItem().maString == rCell2.maStr, "ScInterpreter::CompareFunc: broken options"); - if (pOptions->eSearchType == utl::SearchParam::SRCH_REGEXP) + if (pOptions->eSearchType != utl::SearchParam::SRCH_NORMAL) { sal_Int32 nStart = 0; sal_Int32 nStop = rCell1.maStr.getLength(); commit bad266fa06294f1dacec11ec02dfc6ae4ec8cdc4 Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 19:20:08 2016 +0100 ScQueryEntry::GetSearchTextPtr() with SearchType, tdf#72196 Change-Id: I1c9c5c6271927bb2d2ac9309e9a6ca36016237f4 diff --git a/sc/inc/queryentry.hxx b/sc/inc/queryentry.hxx index cac1170..1669f6c 100644 --- a/sc/inc/queryentry.hxx +++ b/sc/inc/queryentry.hxx @@ -23,14 +23,10 @@ #include "address.hxx" #include "global.hxx" #include <svl/sharedstring.hxx> +#include <unotools/textsearch.hxx> #include <vector> -namespace utl { - class SearchParam; - class TextSearch; -} - /** * Each instance of this struct represents a single filtering criteria. */ @@ -55,15 +51,15 @@ struct SC_DLLPUBLIC ScQueryEntry SCCOLROW nField; ScQueryOp eOp; ScQueryConnect eConnect; - mutable utl::SearchParam* pSearchParam; ///< if RegExp, not saved - mutable utl::TextSearch* pSearchText; ///< if RegExp, not saved + mutable utl::SearchParam* pSearchParam; ///< if Wildcard or RegExp, not saved + mutable utl::TextSearch* pSearchText; ///< if Wildcard or RegExp, not saved ScQueryEntry(); ScQueryEntry(const ScQueryEntry& r); ~ScQueryEntry(); - /// creates pSearchParam and pSearchText if necessary, always RegExp! - utl::TextSearch* GetSearchTextPtr( bool bCaseSens ) const; + /// creates pSearchParam and pSearchText if necessary + utl::TextSearch* GetSearchTextPtr( utl::SearchParam::SearchType eSearchType, bool bCaseSens ) const; QueryItemsType& GetQueryItems() { return maQueryItems;} const QueryItemsType& GetQueryItems() const { return maQueryItems;} diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index 7ff9ee9..1b86461 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -1296,9 +1296,9 @@ bool ScQueryCellIterator::FindEqualOrSortedLastInRange( SCCOL& nFoundCol, SetStopOnMismatch( true ); // assume sorted keys SetTestEqualCondition( true ); bIgnoreMismatchOnLeadingStrings = bIgnoreMismatchOnLeadingStringsP; - bool bRegExp = mpParam->eSearchType == utl::SearchParam::SRCH_REGEXP && + bool bLiteral = mpParam->eSearchType == utl::SearchParam::SRCH_NORMAL && mpParam->GetEntry(0).GetQueryItem().meType == ScQueryEntry::ByString; - bool bBinary = !bRegExp && mpParam->bByRow && (mpParam->GetEntry(0).eOp == + bool bBinary = bLiteral && mpParam->bByRow && (mpParam->GetEntry(0).eOp == SC_LESS_EQUAL || mpParam->GetEntry(0).eOp == SC_GREATER_EQUAL); bool bFound = false; if (bBinary) @@ -1413,7 +1413,7 @@ bool ScQueryCellIterator::FindEqualOrSortedLastInRange( SCCOL& nFoundCol, maCurPos = aPosSave; return true; } - if ( (bSearchForEqualAfterMismatch || mpParam->eSearchType == utl::SearchParam::SRCH_REGEXP) && + if ( (bSearchForEqualAfterMismatch || mpParam->eSearchType != utl::SearchParam::SRCH_NORMAL) && StoppedOnMismatch() ) { // Assume found entry to be the last value less than respectively diff --git a/sc/source/core/data/dpcache.cxx b/sc/source/core/data/dpcache.cxx index 1e77d25..d6e104d 100644 --- a/sc/source/core/data/dpcache.cxx +++ b/sc/source/core/data/dpcache.cxx @@ -537,7 +537,7 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const sal_Int32 nStart = 0; sal_Int32 nEnd = aCellStr.getLength(); - bool bMatch = (bool) rEntry.GetSearchTextPtr( rParam.bCaseSens ) + bool bMatch = (bool) rEntry.GetSearchTextPtr( rParam.eSearchType, rParam.bCaseSens ) ->SearchForward( aCellStr, &nStart, &nEnd ); // from 614 on, nEnd is behind the found text if (bMatch && bMatchWholeCell diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 67d9e3e..cfefd57 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -2423,12 +2423,12 @@ public: { nEnd = 0; nStart = aCellStr.getLength(); - bMatch = rEntry.GetSearchTextPtr( mrParam.bCaseSens ) + bMatch = rEntry.GetSearchTextPtr( mrParam.eSearchType, mrParam.bCaseSens ) ->SearchBackward(aCellStr.getString(), &nStart, &nEnd); } else { - bMatch = rEntry.GetSearchTextPtr( mrParam.bCaseSens ) + bMatch = rEntry.GetSearchTextPtr( mrParam.eSearchType, mrParam.bCaseSens ) ->SearchForward(aCellStr.getString(), &nStart, &nEnd); } if ( bMatch && bMatchWholeCell diff --git a/sc/source/core/tool/compare.cxx b/sc/source/core/tool/compare.cxx index d2d0322..8433202 100644 --- a/sc/source/core/tool/compare.cxx +++ b/sc/source/core/tool/compare.cxx @@ -140,7 +140,7 @@ double CompareFunc( const Compare& rComp, CompareOptions* pOptions ) { sal_Int32 nStart = 0; sal_Int32 nStop = rCell1.maStr.getLength(); - bool bMatch = rEntry.GetSearchTextPtr( + bool bMatch = rEntry.GetSearchTextPtr( pOptions->eSearchType, !rComp.mbIgnoreCase)->SearchForward( rCell1.maStr.getString(), &nStart, &nStop); if (bMatch && pOptions->bMatchWholeCell && (nStart != 0 || nStop != rCell1.maStr.getLength())) diff --git a/sc/source/core/tool/queryentry.cxx b/sc/source/core/tool/queryentry.cxx index 1a5c471..17529c5 100644 --- a/sc/source/core/tool/queryentry.cxx +++ b/sc/source/core/tool/queryentry.cxx @@ -164,13 +164,13 @@ bool ScQueryEntry::operator==( const ScQueryEntry& r ) const // do not compare pSearchParam and pSearchText! } -utl::TextSearch* ScQueryEntry::GetSearchTextPtr( bool bCaseSens ) const +utl::TextSearch* ScQueryEntry::GetSearchTextPtr( utl::SearchParam::SearchType eSearchType, bool bCaseSens ) const { if ( !pSearchParam ) { OUString aStr = maQueryItems[0].maString.getString(); pSearchParam = new utl::SearchParam( - aStr, utl::SearchParam::SRCH_REGEXP, bCaseSens, false, false); + aStr, eSearchType, bCaseSens, false, false); pSearchText = new utl::TextSearch( *pSearchParam, *ScGlobal::pCharClass ); } return pSearchText; commit b3a66ccdd3f4098670b593883602093c4a9e712c Author: Eike Rathke <er...@redhat.com> Date: Mon Feb 22 17:17:22 2016 +0100 include '~' escape character in MaybeWildcard(), tdf#72196 Change-Id: I09ff6b07f63b9b9199b73d27d8118c18d233f2b2 diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 26b7f10..82f6beb 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -8515,9 +8515,10 @@ bool ScInterpreter::MayBeWildcard( const OUString& rStr, const ScDocument* pDoc if ( pDoc && !pDoc->GetDocOptions().IsFormulaWildcardsEnabled() ) return false; - // Wildcards without '~' escape, if there are no wildcards then an escaped - // character does not make sense. - static const sal_Unicode cw[] = { '*','?', 0 }; + // Wildcards with '~' escape, if there are no wildcards then an escaped + // character does not make sense, but it modifies the search pattern in an + // Excel compatible wildcard search.. + static const sal_Unicode cw[] = { '*','?','~', 0 }; const sal_Unicode* p1 = rStr.getStr(); sal_Unicode c1; while ( ( c1 = *p1++ ) != 0 ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits