diff --git a/Qt/Widgets/pqQuickLaunchDialog.cxx b/Qt/Widgets/pqQuickLaunchDialog.cxx index 458cd22cf9a544bf5fc025cb685e95d3b1fa3129..5e83da13b16e4b7338ce8cf99ab6de306dada9e4 100644 --- a/Qt/Widgets/pqQuickLaunchDialog.cxx +++ b/Qt/Widgets/pqQuickLaunchDialog.cxx @@ -41,6 +41,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include +#include class pqQuickLaunchDialog::pqInternal : public Ui::QuickLaunchDialog { @@ -51,6 +53,42 @@ public: QPointer ActiveAction; }; +namespace +{ + void fillPermutations(QList& list, QStringList words) + { + list.push_back(words); + words.sort(); + do + { + list.push_back(words); + } + while (std::next_permutation(words.begin(), words.end())); + } + + void fillSearchSpace(QStringList& searchSpace, + const QStringList& searchComponents, + const QList& searchExpressions, const QStringList& keys) + { + foreach (const QStringList& exp, searchExpressions) + { + QString part = exp.join("\\w*\\W+"); + QRegExp regExp("^" + part, Qt::CaseInsensitive); + searchSpace += keys.filter(regExp); + } + + // Now build up the list of matches to the search components disregarding + // word order and proximity entirely. + // (BUG #0016116). + QStringList filteredkeys = keys; + foreach (const QString &component, searchComponents) + { + filteredkeys = filteredkeys.filter(QRegExp(component, Qt::CaseInsensitive)); + } + searchSpace += filteredkeys; + } +} + //----------------------------------------------------------------------------- pqQuickLaunchDialog::pqQuickLaunchDialog(QWidget* p): Superclass(p, Qt::Dialog|Qt::FramelessWindowHint) @@ -163,16 +201,31 @@ void pqQuickLaunchDialog::updateSearch() return; } - QStringList searchComponents = this->Internal->SearchString.split(" ", - QString::SkipEmptyParts); + const QStringList keys = this->Internal->Items.keys(); + const QStringList searchComponents = this->Internal->SearchString.split(" ", QString::SkipEmptyParts); + + QList searchExpressions; + fillPermutations(searchExpressions, searchComponents); + + QStringList searchSpace; + fillSearchSpace(searchSpace, searchComponents, searchExpressions, keys); + + QStringList fuzzySearchComponents; + foreach (const QString& word, searchComponents) + { + QString newword; + for (int cc=0; cc < word.size(); cc++) + { + newword += word[cc]; + newword += "\\w*"; + } + fuzzySearchComponents.push_back(newword); + } + + searchExpressions.clear(); + fillPermutations(searchExpressions, fuzzySearchComponents); + fillSearchSpace(searchSpace, fuzzySearchComponents, searchExpressions, keys); - QString regExpStr = searchComponents.join(".*"); - QRegExp regExp("^" + regExpStr, Qt::CaseInsensitive); - QRegExp regExp2(".*" + regExpStr, Qt::CaseInsensitive); - QStringList searchSpace = this->Internal->Items.keys(); - QStringList searchSpace2 = searchSpace; - searchSpace = searchSpace.filter(regExp); - searchSpace += searchSpace2.filter(regExp2); searchSpace.removeDuplicates(); int currentRow = -1;