diff options
author | Eike Ziller <eike.ziller@qt.io> | 2016-12-09 13:33:12 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2017-02-28 10:48:23 +0000 |
commit | 1f8b2dc3610635f019b7fef8192171f4e085f814 (patch) | |
tree | 3611fc53841940069d7adc70a42865c781932b4a /src/plugins/texteditor | |
parent | 99a6d78bba07a40a8407f1b7ba44b57f7da1983e (diff) |
Advanced search: Add exclusion patterns
All files with full file path matching one of the exclusion patterns are
ignored in the search.
Searching with "git grep" now requires git >= 1.9
Change-Id: Ied5d11499bc1ff21247e50f8e146e8e5011dd2c1
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/texteditor')
-rw-r--r-- | src/plugins/texteditor/basefilefind.cpp | 131 | ||||
-rw-r--r-- | src/plugins/texteditor/basefilefind.h | 11 | ||||
-rw-r--r-- | src/plugins/texteditor/findincurrentfile.cpp | 4 | ||||
-rw-r--r-- | src/plugins/texteditor/findincurrentfile.h | 1 | ||||
-rw-r--r-- | src/plugins/texteditor/findinfiles.cpp | 23 | ||||
-rw-r--r-- | src/plugins/texteditor/findinfiles.h | 1 | ||||
-rw-r--r-- | src/plugins/texteditor/findinopenfiles.cpp | 6 | ||||
-rw-r--r-- | src/plugins/texteditor/findinopenfiles.h | 1 |
8 files changed, 128 insertions, 50 deletions
diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index d6a24dd653..96e812c096 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -36,6 +36,7 @@ #include <coreplugin/find/ifindsupport.h> #include <texteditor/texteditor.h> #include <texteditor/refactoringchanges.h> +#include <utils/algorithm.h> #include <utils/fadingindicator.h> #include <utils/filesearch.h> #include <utils/qtcassert.h> @@ -78,7 +79,8 @@ public: : Utils::findInFiles; return func(parameters.text, - baseFileFind->files(parameters.nameFilters, parameters.additionalParameters), + baseFileFind->files(parameters.nameFilters, parameters.exclusionFilters, + parameters.additionalParameters), textDocumentFlagsForFindFlags(parameters.flags), TextDocument::openedTextDocumentContents()); @@ -114,9 +116,14 @@ public: QPointer<IFindSupport> m_currentFindSupport; QLabel *m_resultLabel = 0; + // models in native path format QStringListModel m_filterStrings; + QStringListModel m_exclusionStrings; + // current filter in portable path format QString m_filterSetting; + QString m_exclusionSetting; QPointer<QComboBox> m_filterCombo; + QPointer<QComboBox> m_exclusionCombo; QVector<SearchEngine *> m_searchEngines; SearchEngine *m_internalSearchEngine; int m_currentSearchEngineIndex = -1; @@ -128,9 +135,10 @@ static void syncComboWithSettings(QComboBox *combo, const QString &setting) { if (!combo) return; - int index = combo->findText(setting); + const QString &nativeSettings = QDir::toNativeSeparators(setting); + int index = combo->findText(nativeSettings); if (index < 0) - combo->setEditText(setting); + combo->setEditText(nativeSettings); else combo->setCurrentIndex(index); } @@ -188,18 +196,27 @@ bool BaseFileFind::isEnabled() const return true; } +static QStringList splitFilterUiText(const QString &text) +{ + const QStringList parts = text.split(','); + const QStringList trimmedPortableParts = Utils::transform(parts, [](const QString &s) { + return QDir::fromNativeSeparators(s.trimmed()); + }); + return Utils::filtered(trimmedPortableParts, [](const QString &s) { return !s.isEmpty(); }); +} + QStringList BaseFileFind::fileNameFilters() const { - QStringList filters; - if (d->m_filterCombo && !d->m_filterCombo->currentText().isEmpty()) { - const QStringList parts = d->m_filterCombo->currentText().split(','); - foreach (const QString &part, parts) { - const QString filter = part.trimmed(); - if (!filter.isEmpty()) - filters << filter; - } - } - return filters; + if (d->m_filterCombo) + return splitFilterUiText(d->m_filterCombo->currentText()); + return QStringList(); +} + +QStringList BaseFileFind::fileExclusionFilters() const +{ + if (d->m_exclusionCombo) + return splitFilterUiText(d->m_exclusionCombo->currentText()); + return QStringList(); } SearchEngine *BaseFileFind::currentSearchEngine() const @@ -248,6 +265,8 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, d->m_currentFindSupport = 0; if (d->m_filterCombo) updateComboEntries(d->m_filterCombo, true); + if (d->m_exclusionCombo) + updateComboEntries(d->m_exclusionCombo, true); QString tooltip = toolTip(); SearchResult *search = SearchResultWindow::instance()->startNewSearch( @@ -261,6 +280,7 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, parameters.text = txt; parameters.flags = findFlags; parameters.nameFilters = fileNameFilters(); + parameters.exclusionFilters = fileExclusionFilters(); parameters.additionalParameters = additionalParameters(); parameters.searchEngineParameters = currentSearchEngine()->parameters(); parameters.searchEngineIndex = d->m_currentSearchEngineIndex; @@ -340,46 +360,93 @@ void BaseFileFind::doReplace(const QString &text, } } -QWidget *BaseFileFind::createPatternWidget() +static QComboBox *createCombo(QAbstractItemModel *model) { - QString filterToolTip = tr("List of comma separated wildcard filters"); - d->m_filterCombo = new QComboBox; - d->m_filterCombo->setEditable(true); - d->m_filterCombo->setModel(&d->m_filterStrings); - d->m_filterCombo->setMaxCount(10); - d->m_filterCombo->setMinimumContentsLength(10); - d->m_filterCombo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); - d->m_filterCombo->setInsertPolicy(QComboBox::InsertAtBottom); - d->m_filterCombo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + auto combo = new QComboBox; + combo->setEditable(true); + combo->setModel(model); + combo->setMaxCount(10); + combo->setMinimumContentsLength(10); + combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); + combo->setInsertPolicy(QComboBox::InsertAtBottom); + combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + return combo; +} + +static QLabel *createLabel(const QString &text) +{ + auto filePatternLabel = new QLabel(text); + filePatternLabel->setMinimumWidth(80); + filePatternLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + filePatternLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + return filePatternLabel; +} + +QList<QPair<QWidget *, QWidget *>> BaseFileFind::createPatternWidgets() +{ + static const QString filterToolTip = tr("List of comma separated wildcard filters. " + "Files with file name or full file path matching any filter are included."); + QLabel *filterLabel = createLabel(tr("Fi&le pattern:")); + d->m_filterCombo = createCombo(&d->m_filterStrings); d->m_filterCombo->setToolTip(filterToolTip); + filterLabel->setBuddy(d->m_filterCombo); syncComboWithSettings(d->m_filterCombo, d->m_filterSetting); - return d->m_filterCombo; + QLabel *exclusionLabel = createLabel(tr("Exclusion pattern:")); + d->m_exclusionCombo = createCombo(&d->m_exclusionStrings); + d->m_exclusionCombo->setToolTip(filterToolTip); + exclusionLabel->setBuddy(d->m_exclusionCombo); + syncComboWithSettings(d->m_exclusionCombo, d->m_exclusionSetting); + return { qMakePair(filterLabel, d->m_filterCombo), + qMakePair(exclusionLabel, d->m_exclusionCombo) }; } void BaseFileFind::writeCommonSettings(QSettings *settings) { - settings->setValue("filters", d->m_filterStrings.stringList()); + std::function<QStringList(const QStringList &)> fromNativeSeparators = [](const QStringList &files) { + return Utils::transform(files, &QDir::fromNativeSeparators); + }; + + settings->setValue("filters", fromNativeSeparators(d->m_filterStrings.stringList())); if (d->m_filterCombo) - settings->setValue("currentFilter", d->m_filterCombo->currentText()); + settings->setValue("currentFilter", + QDir::fromNativeSeparators(d->m_filterCombo->currentText())); + settings->setValue("exclusionFilters", fromNativeSeparators(d->m_exclusionStrings.stringList())); + if (d->m_exclusionCombo) + settings->setValue("currentExclusionFilter", + QDir::fromNativeSeparators(d->m_exclusionCombo->currentText())); foreach (SearchEngine *searchEngine, d->m_searchEngines) searchEngine->writeSettings(settings); settings->setValue("currentSearchEngineIndex", d->m_currentSearchEngineIndex); } -void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaultFilter) +void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaultFilter, + const QString &defaultExclusionFilter) { + std::function<QStringList(const QStringList &)> toNativeSeparators = [](const QStringList &files) { + return Utils::transform(files, &QDir::toNativeSeparators); + }; + QStringList filters = settings->value("filters").toStringList(); - const QVariant currentFilter = settings->value("currentFilter"); - d->m_filterSetting = currentFilter.toString(); if (filters.isEmpty()) filters << defaultFilter; - if (!currentFilter.isValid()) - d->m_filterSetting = filters.first(); - d->m_filterStrings.setStringList(filters); + const QVariant currentFilter = settings->value("currentFilter"); + d->m_filterSetting = currentFilter.isValid() ? currentFilter.toString() + : filters.first(); + d->m_filterStrings.setStringList(toNativeSeparators(filters)); if (d->m_filterCombo) syncComboWithSettings(d->m_filterCombo, d->m_filterSetting); + QStringList exclusionFilters = settings->value("exclusionFilters").toStringList(); + if (exclusionFilters.isEmpty()) + exclusionFilters << defaultExclusionFilter; + const QVariant currentExclusionFilter = settings->value("currentExclusionFilter"); + d->m_exclusionSetting = currentExclusionFilter.isValid() ? currentExclusionFilter.toString() + : exclusionFilters.first(); + d->m_exclusionStrings.setStringList(toNativeSeparators(exclusionFilters)); + if (d->m_exclusionCombo) + syncComboWithSettings(d->m_exclusionCombo, d->m_exclusionSetting); + foreach (SearchEngine* searchEngine, d->m_searchEngines) searchEngine->readSettings(settings); const int currentSearchEngineIndex = settings->value("currentSearchEngineIndex", 0).toInt(); diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h index 2a7b2bc151..56bbb4e5fd 100644 --- a/src/plugins/texteditor/basefilefind.h +++ b/src/plugins/texteditor/basefilefind.h @@ -57,11 +57,12 @@ class TEXTEDITOR_EXPORT FileFindParameters { public: QString text; - Core::FindFlags flags; QStringList nameFilters; + QStringList exclusionFilters; QVariant additionalParameters; - int searchEngineIndex; QVariant searchEngineParameters; + int searchEngineIndex; + Core::FindFlags flags; }; class BaseFileFind; @@ -111,6 +112,7 @@ public: const QList<Core::SearchResultItem> &items, bool preserveCase = false); virtual Utils::FileIterator *files(const QStringList &nameFilters, + const QStringList &exclusionFilters, const QVariant &additionalParameters) const = 0; protected: @@ -122,9 +124,10 @@ protected: QFuture<Utils::FileSearchResultList> executeSearch(const FileFindParameters ¶meters); void writeCommonSettings(QSettings *settings); - void readCommonSettings(QSettings *settings, const QString &defaultFilter); - QWidget *createPatternWidget(); + void readCommonSettings(QSettings *settings, const QString &defaultFilter, const QString &defaultExclusionFilter); + QList<QPair<QWidget *, QWidget *>> createPatternWidgets(); QStringList fileNameFilters() const; + QStringList fileExclusionFilters() const; SearchEngine *currentSearchEngine() const; QVector<SearchEngine *> searchEngines() const; diff --git a/src/plugins/texteditor/findincurrentfile.cpp b/src/plugins/texteditor/findincurrentfile.cpp index 03395955dd..df568a1311 100644 --- a/src/plugins/texteditor/findincurrentfile.cpp +++ b/src/plugins/texteditor/findincurrentfile.cpp @@ -57,9 +57,11 @@ QString FindInCurrentFile::displayName() const } Utils::FileIterator *FindInCurrentFile::files(const QStringList &nameFilters, + const QStringList &exclusionFilters, const QVariant &additionalParameters) const { Q_UNUSED(nameFilters) + Q_UNUSED(exclusionFilters) QString fileName = additionalParameters.toString(); QMap<QString, QTextCodec *> openEditorEncodings = TextDocument::openedTextDocumentEncodings(); QTextCodec *codec = openEditorEncodings.value(fileName); @@ -116,6 +118,6 @@ void FindInCurrentFile::writeSettings(QSettings *settings) void FindInCurrentFile::readSettings(QSettings *settings) { settings->beginGroup(QLatin1String("FindInCurrentFile")); - readCommonSettings(settings, QLatin1String("*")); + readCommonSettings(settings, "*", ""); settings->endGroup(); } diff --git a/src/plugins/texteditor/findincurrentfile.h b/src/plugins/texteditor/findincurrentfile.h index 354680d63d..4f1295d818 100644 --- a/src/plugins/texteditor/findincurrentfile.h +++ b/src/plugins/texteditor/findincurrentfile.h @@ -52,6 +52,7 @@ public: protected: Utils::FileIterator *files(const QStringList &nameFilters, + const QStringList &exclusionFilters, const QVariant &additionalParameters) const; QVariant additionalParameters() const; QString label() const; diff --git a/src/plugins/texteditor/findinfiles.cpp b/src/plugins/texteditor/findinfiles.cpp index 8c882e2d85..72ec48f204 100644 --- a/src/plugins/texteditor/findinfiles.cpp +++ b/src/plugins/texteditor/findinfiles.cpp @@ -80,10 +80,12 @@ QString FindInFiles::displayName() const } FileIterator *FindInFiles::files(const QStringList &nameFilters, + const QStringList &exclusionFilters, const QVariant &additionalParameters) const { return new SubDirFileIterator(QStringList() << additionalParameters.toString(), nameFilters, + exclusionFilters, EditorManager::defaultTextCodec()); } @@ -107,9 +109,10 @@ QString FindInFiles::label() const QString FindInFiles::toolTip() const { //: the last arg is filled by BaseFileFind::runNewSearch - QString tooltip = tr("Path: %1\nFilter: %2\n%3") + QString tooltip = tr("Path: %1\nFilter: %2\nExcluding: %3\n%4") .arg(path().toUserOutput()) - .arg(fileNameFilters().join(QLatin1Char(','))); + .arg(fileNameFilters().join(',')) + .arg(fileExclusionFilters().join(',')); const QString searchEngineToolTip = currentSearchEngine()->toolTip(); if (!searchEngineToolTip.isEmpty()) @@ -183,14 +186,12 @@ QWidget *FindInFiles::createConfigWidget() dirLabel->setBuddy(m_directory); gridLayout->addWidget(m_directory, row++, 1, 1, 2); - QLabel * const filePatternLabel = new QLabel(tr("Fi&le pattern:")); - filePatternLabel->setMinimumWidth(80); - filePatternLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); - filePatternLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - QWidget *patternWidget = createPatternWidget(); - filePatternLabel->setBuddy(patternWidget); - gridLayout->addWidget(filePatternLabel, row, 0); - gridLayout->addWidget(patternWidget, row++, 1, 1, 2); + const QList<QPair<QWidget *, QWidget *>> patternWidgets = createPatternWidgets(); + for (const QPair<QWidget *, QWidget *> &p : patternWidgets) { + gridLayout->addWidget(p.first, row, 0, Qt::AlignRight); + gridLayout->addWidget(p.second, row, 1, 1, 2); + ++row; + } m_configWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // validity @@ -221,7 +222,7 @@ void FindInFiles::writeSettings(QSettings *settings) void FindInFiles::readSettings(QSettings *settings) { settings->beginGroup(QLatin1String("FindInFiles")); - readCommonSettings(settings, QLatin1String("*.cpp,*.h")); + readCommonSettings(settings, "*.cpp,*.h", "*/.git/*,*/.cvs/*,*/.svn/*"); settings->endGroup(); } diff --git a/src/plugins/texteditor/findinfiles.h b/src/plugins/texteditor/findinfiles.h index e27c445b15..eb69ced567 100644 --- a/src/plugins/texteditor/findinfiles.h +++ b/src/plugins/texteditor/findinfiles.h @@ -66,6 +66,7 @@ signals: protected: Utils::FileIterator *files(const QStringList &nameFilters, + const QStringList &exclusionFilters, const QVariant &additionalParameters) const override; QVariant additionalParameters() const override; QString label() const override; diff --git a/src/plugins/texteditor/findinopenfiles.cpp b/src/plugins/texteditor/findinopenfiles.cpp index 8aa8289522..80f0e13097 100644 --- a/src/plugins/texteditor/findinopenfiles.cpp +++ b/src/plugins/texteditor/findinopenfiles.cpp @@ -56,9 +56,11 @@ QString FindInOpenFiles::displayName() const } Utils::FileIterator *FindInOpenFiles::files(const QStringList &nameFilters, - const QVariant &additionalParameters) const + const QStringList &exclusionFilters, + const QVariant &additionalParameters) const { Q_UNUSED(nameFilters) + Q_UNUSED(exclusionFilters) Q_UNUSED(additionalParameters) QMap<QString, QTextCodec *> openEditorEncodings = TextDocument::openedTextDocumentEncodings(); @@ -110,7 +112,7 @@ void FindInOpenFiles::writeSettings(QSettings *settings) void FindInOpenFiles::readSettings(QSettings *settings) { settings->beginGroup(QLatin1String("FindInOpenFiles")); - readCommonSettings(settings, QLatin1String("*")); + readCommonSettings(settings, "*", ""); settings->endGroup(); } diff --git a/src/plugins/texteditor/findinopenfiles.h b/src/plugins/texteditor/findinopenfiles.h index 759636c1ae..6caf7936af 100644 --- a/src/plugins/texteditor/findinopenfiles.h +++ b/src/plugins/texteditor/findinopenfiles.h @@ -45,6 +45,7 @@ public: protected: Utils::FileIterator *files(const QStringList &nameFilters, + const QStringList &exclusionFilters, const QVariant &additionalParameters) const; QVariant additionalParameters() const; QString label() const; |