diff options
author | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2016-03-16 22:37:24 +0100 |
---|---|---|
committer | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2016-11-16 09:52:05 +0000 |
commit | 6b2cf5cd03073ee8e7b319f68f7dce43c7984622 (patch) | |
tree | a8aec1772eb4fa09881b8858aef47c360ed25518 | |
parent | 4ae07377db1f587b5d49a46c355d46c97a6c59fc (diff) |
FindInFiles: make possible to have more than one extension
This change adds a possibility to add more than
one external tool which can be used instead of internal finder.
Currently there is one extension: 'gitgrep'.
By default we use internal finder.
Change-Id: If644358552f3cea9ebda8308539322a1b6d3ab77
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
-rw-r--r-- | src/plugins/git/gitgrep.cpp | 29 | ||||
-rw-r--r-- | src/plugins/git/gitgrep.h | 9 | ||||
-rw-r--r-- | src/plugins/texteditor/basefilefind.cpp | 124 | ||||
-rw-r--r-- | src/plugins/texteditor/basefilefind.h | 25 | ||||
-rw-r--r-- | src/plugins/texteditor/findinfiles.cpp | 61 | ||||
-rw-r--r-- | src/plugins/texteditor/findinfiles.h | 9 |
6 files changed, 168 insertions, 89 deletions
diff --git a/src/plugins/git/gitgrep.cpp b/src/plugins/git/gitgrep.cpp index 05060f413b..85547807e0 100644 --- a/src/plugins/git/gitgrep.cpp +++ b/src/plugins/git/gitgrep.cpp @@ -42,7 +42,6 @@ #include <utils/synchronousprocess.h> #include <utils/textfileformat.h> -#include <QCheckBox> #include <QFuture> #include <QFutureWatcher> #include <QHBoxLayout> @@ -58,7 +57,6 @@ class GitGrepParameters { public: QString ref; - bool isEnabled = false; }; using namespace Core; @@ -67,7 +65,6 @@ using VcsBase::VcsCommand; namespace { -const char EnableGitGrep[] = "EnableGitGrep"; const char GitGrepRef[] = "GitGrepRef"; class GitGrepRunner : public QObject @@ -155,7 +152,7 @@ public: else arguments << "-F"; arguments << m_parameters.text; - GitGrepParameters params = m_parameters.extensionParameters.value<GitGrepParameters>(); + GitGrepParameters params = m_parameters.searchEngineParameters.value<GitGrepParameters>(); if (!params.ref.isEmpty()) { arguments << params.ref; m_ref = params.ref + ':'; @@ -213,10 +210,6 @@ GitGrep::GitGrep() m_widget = new QWidget; auto layout = new QHBoxLayout(m_widget); layout->setMargin(0); - m_enabledCheckBox = new QCheckBox(tr("&Use Git Grep")); - m_enabledCheckBox->setToolTip(tr("Use Git Grep for searching. This includes only files " - "that are managed by Git.")); - layout->addWidget(m_enabledCheckBox); m_treeLineEdit = new FancyLineEdit; m_treeLineEdit->setPlaceholderText(tr("Tree (optional)")); m_treeLineEdit->setToolTip(tr("Can be HEAD, tag, local or remote branch, or a commit hash.\n" @@ -230,7 +223,7 @@ GitGrep::GitGrep() m_widget, [this](const QString &path) { m_widget->setEnabled(validateDirectory(path)); }); - findInFiles->setFindExtension(this); + findInFiles->addSearchEngine(this); } GitGrep::~GitGrep() @@ -258,36 +251,28 @@ QWidget *GitGrep::widget() const bool GitGrep::isEnabled() const { - return m_widget->isEnabled() && m_enabledCheckBox->isChecked(); -} - -bool GitGrep::isEnabled(const TextEditor::FileFindParameters ¶meters) const -{ - return parameters.extensionParameters.value<GitGrepParameters>().isEnabled; + return m_widget->isEnabled(); } QVariant GitGrep::parameters() const { GitGrepParameters params; - params.isEnabled = isEnabled(); params.ref = m_treeLineEdit->text(); return qVariantFromValue(params); } void GitGrep::readSettings(QSettings *settings) { - m_enabledCheckBox->setChecked(settings->value(EnableGitGrep, false).toBool()); m_treeLineEdit->setText(settings->value(GitGrepRef).toString()); } void GitGrep::writeSettings(QSettings *settings) const { - settings->setValue(EnableGitGrep, m_enabledCheckBox->isChecked()); settings->setValue(GitGrepRef, m_treeLineEdit->text()); } -QFuture<FileSearchResultList> GitGrep::executeSearch( - const TextEditor::FileFindParameters ¶meters) +QFuture<FileSearchResultList> GitGrep::executeSearch(const TextEditor::FileFindParameters ¶meters, + TextEditor::BaseFileFind * /*baseFileFind*/) { return Utils::runAsync(GitGrepRunner::run, parameters); } @@ -295,8 +280,8 @@ QFuture<FileSearchResultList> GitGrep::executeSearch( IEditor *GitGrep::openEditor(const SearchResultItem &item, const TextEditor::FileFindParameters ¶meters) { - GitGrepParameters params = parameters.extensionParameters.value<GitGrepParameters>(); - if (!params.isEnabled || params.ref.isEmpty() || item.path.isEmpty()) + GitGrepParameters params = parameters.searchEngineParameters.value<GitGrepParameters>(); + if (params.ref.isEmpty() || item.path.isEmpty()) return nullptr; const QString path = QDir::fromNativeSeparators(item.path.first()); QByteArray content; diff --git a/src/plugins/git/gitgrep.h b/src/plugins/git/gitgrep.h index 1bcec59d39..3adc487f9f 100644 --- a/src/plugins/git/gitgrep.h +++ b/src/plugins/git/gitgrep.h @@ -29,14 +29,12 @@ #include <QCoreApplication> -QT_FORWARD_DECLARE_CLASS(QCheckBox) - namespace Utils { class FancyLineEdit; } namespace Git { namespace Internal { -class GitGrep : public TextEditor::FileFindExtension +class GitGrep : public TextEditor::SearchEngine { Q_DECLARE_TR_FUNCTIONS(GitGrep) @@ -47,18 +45,17 @@ public: QString toolTip() const override; QWidget *widget() const override; bool isEnabled() const override; - bool isEnabled(const TextEditor::FileFindParameters ¶meters) const override; QVariant parameters() const override; void readSettings(QSettings *settings) override; void writeSettings(QSettings *settings) const override; QFuture<Utils::FileSearchResultList> executeSearch( - const TextEditor::FileFindParameters ¶meters) override; + const TextEditor::FileFindParameters ¶meters, + TextEditor::BaseFileFind *baseFileFind) override; Core::IEditor *openEditor(const Core::SearchResultItem &item, const TextEditor::FileFindParameters ¶meters) override; private: QWidget *m_widget; - QCheckBox *m_enabledCheckBox; Utils::FancyLineEdit *m_treeLineEdit; }; diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index 46ab0f2b48..df5ac05fe6 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -50,7 +50,6 @@ #include <QPointer> #include <QComboBox> #include <QLabel> -#include <QLabel> using namespace Utils; using namespace Core; @@ -58,6 +57,45 @@ using namespace Core; namespace TextEditor { namespace Internal { +namespace { +class InternalEngine : public TextEditor::SearchEngine +{ +public: + InternalEngine() : m_widget(new QWidget) {} + ~InternalEngine() override { delete m_widget;} + QString title() const override { return tr("Internal"); } + QString toolTip() const override { return QString(); } + QWidget *widget() const override { return m_widget; } + bool isEnabled() const override { return true; } + QVariant parameters() const override { return QVariant(); } + void readSettings(QSettings */*settings*/) override {} + void writeSettings(QSettings */*settings*/) const override {} + QFuture<Utils::FileSearchResultList> executeSearch( + const TextEditor::FileFindParameters ¶meters, + BaseFileFind *baseFileFind) override + { + auto func = parameters.flags & FindRegularExpression + ? Utils::findInFilesRegExp + : Utils::findInFiles; + + return func(parameters.text, + baseFileFind->files(parameters.nameFilters, parameters.additionalParameters), + textDocumentFlagsForFindFlags(parameters.flags), + TextDocument::openedTextDocumentContents()); + + } + Core::IEditor *openEditor(const Core::SearchResultItem &/*item*/, + const TextEditor::FileFindParameters &/*parameters*/) override + { + return nullptr; + } + +private: + QWidget *m_widget; +}; +} + + class CountingLabel : public QLabel { public: @@ -68,6 +106,7 @@ public: class BaseFileFindPrivate { public: + ~BaseFileFindPrivate() { delete m_internalSearchEngine; } QMap<QFutureWatcher<FileSearchResultList> *, QPointer<SearchResult> > m_watchers; QPointer<IFindSupport> m_currentFindSupport; @@ -75,7 +114,9 @@ public: QStringListModel m_filterStrings; QString m_filterSetting; QPointer<QComboBox> m_filterCombo; - QPointer<FileFindExtension> m_extension; + QVector<SearchEngine *> m_searchEngines; + SearchEngine *m_internalSearchEngine; + int m_currentSearchEngineIndex = 0; }; } // namespace Internal @@ -84,6 +125,8 @@ using namespace Internal; BaseFileFind::BaseFileFind() : d(new BaseFileFindPrivate) { + d->m_internalSearchEngine = new InternalEngine; + addSearchEngine(d->m_internalSearchEngine); } BaseFileFind::~BaseFileFind() @@ -119,7 +162,7 @@ QStringList BaseFileFind::fileNameFilters() const { QStringList filters; if (d->m_filterCombo && !d->m_filterCombo->currentText().isEmpty()) { - const QStringList parts = d->m_filterCombo->currentText().split(QLatin1Char(',')); + const QStringList parts = d->m_filterCombo->currentText().split(','); foreach (const QString &part, parts) { const QString filter = part.trimmed(); if (!filter.isEmpty()) @@ -129,9 +172,21 @@ QStringList BaseFileFind::fileNameFilters() const return filters; } -FileFindExtension *BaseFileFind::extension() const +SearchEngine *BaseFileFind::currentSearchEngine() const { - return d->m_extension.data(); + if (d->m_searchEngines.isEmpty() || d->m_currentSearchEngineIndex == -1) + return nullptr; + return d->m_searchEngines[d->m_currentSearchEngineIndex]; +} + +QVector<SearchEngine *> BaseFileFind::searchEngines() const +{ + return d->m_searchEngines; +} + +void BaseFileFind::setCurrentSearchEngine(int index) +{ + d->m_currentSearchEngineIndex = index; } void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, @@ -141,12 +196,12 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, if (d->m_filterCombo) updateComboEntries(d->m_filterCombo, true); QString tooltip = toolTip(); - if (d->m_extension) - tooltip = tooltip.arg(d->m_extension->toolTip()); - SearchResult *search = SearchResultWindow::instance()->startNewSearch(label(), - tooltip.arg(IFindFilter::descriptionForFindFlags(findFlags)), - txt, searchMode, SearchResultWindow::PreserveCaseEnabled, - QString::fromLatin1("TextEditor")); + + SearchResult *search = SearchResultWindow::instance()->startNewSearch( + label(), + tooltip.arg(IFindFilter::descriptionForFindFlags(findFlags)), + txt, searchMode, SearchResultWindow::PreserveCaseEnabled, + QString::fromLatin1("TextEditor")); search->setTextToReplace(txt); search->setSearchAgainSupported(true); FileFindParameters parameters; @@ -154,8 +209,8 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, parameters.flags = findFlags; parameters.nameFilters = fileNameFilters(); parameters.additionalParameters = additionalParameters(); - if (d->m_extension) - parameters.extensionParameters = d->m_extension->parameters(); + parameters.searchEngineParameters = currentSearchEngine()->parameters(); + parameters.searchEngineIndex = d->m_currentSearchEngineIndex; search->setUserData(qVariantFromValue(parameters)); connect(search, &SearchResult::activated, this, &BaseFileFind::openEditor); if (searchMode == SearchResultWindow::SearchAndReplace) @@ -201,10 +256,9 @@ void BaseFileFind::replaceAll(const QString &txt, FindFlags findFlags) runNewSearch(txt, findFlags, SearchResultWindow::SearchAndReplace); } -void BaseFileFind::setFindExtension(FileFindExtension *extension) +void BaseFileFind::addSearchEngine(SearchEngine *searchEngine) { - QTC_ASSERT(!d->m_extension, return); - d->m_extension = extension; + d->m_searchEngines.push_back(searchEngine); } void BaseFileFind::doReplace(const QString &text, @@ -275,17 +329,19 @@ QWidget *BaseFileFind::createPatternWidget() void BaseFileFind::writeCommonSettings(QSettings *settings) { - settings->setValue(QLatin1String("filters"), d->m_filterStrings.stringList()); + settings->setValue("filters", d->m_filterStrings.stringList()); if (d->m_filterCombo) - settings->setValue(QLatin1String("currentFilter"), d->m_filterCombo->currentText()); - if (d->m_extension) - d->m_extension->writeSettings(settings); + settings->setValue("currentFilter", d->m_filterCombo->currentText()); + + foreach (SearchEngine *searchEngine, d->m_searchEngines) + searchEngine->writeSettings(settings); + settings->setValue("currentSearchEngineIndex", d->m_currentSearchEngineIndex); } void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaultFilter) { - QStringList filters = settings->value(QLatin1String("filters")).toStringList(); - const QVariant currentFilter = settings->value(QLatin1String("currentFilter")); + QStringList filters = settings->value("filters").toStringList(); + const QVariant currentFilter = settings->value("currentFilter"); d->m_filterSetting = currentFilter.toString(); if (filters.isEmpty()) filters << defaultFilter; @@ -294,8 +350,11 @@ void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaul d->m_filterStrings.setStringList(filters); if (d->m_filterCombo) syncComboWithSettings(d->m_filterCombo, d->m_filterSetting); - if (d->m_extension) - d->m_extension->readSettings(settings); + + foreach (SearchEngine* searchEngine, d->m_searchEngines) + searchEngine->readSettings(settings); + const int currentSearchEngineIndex = settings->value("currentSearchEngineIndex", 0).toInt(); + syncSearchEngineCombo(currentSearchEngineIndex); } void BaseFileFind::syncComboWithSettings(QComboBox *combo, const QString &setting) @@ -325,9 +384,8 @@ void BaseFileFind::openEditor(const SearchResultItem &item) { SearchResult *result = qobject_cast<SearchResult *>(sender()); FileFindParameters parameters = result->userData().value<FileFindParameters>(); - IEditor *openedEditor = 0; - if (d->m_extension) - openedEditor = d->m_extension->openEditor(item, parameters); + IEditor *openedEditor = + d->m_searchEngines[parameters.searchEngineIndex]->openEditor(item, parameters); if (!openedEditor) { if (item.path.size() > 0) { openedEditor = EditorManager::openEditorAt(QDir::fromNativeSeparators(item.path.first()), @@ -447,17 +505,7 @@ QVariant BaseFileFind::getAdditionalParameters(SearchResult *search) QFuture<FileSearchResultList> BaseFileFind::executeSearch(const FileFindParameters ¶meters) { - if (d->m_extension && d->m_extension->isEnabled(parameters)) - return d->m_extension->executeSearch(parameters); - - auto func = parameters.flags & FindRegularExpression - ? Utils::findInFilesRegExp - : Utils::findInFiles; - - return func(parameters.text, - files(parameters.nameFilters, parameters.additionalParameters), - textDocumentFlagsForFindFlags(parameters.flags), - TextDocument::openedTextDocumentContents()); + return d->m_searchEngines[parameters.searchEngineIndex]->executeSearch(parameters,this); } namespace Internal { diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h index 428296c3ec..a681010225 100644 --- a/src/plugins/texteditor/basefilefind.h +++ b/src/plugins/texteditor/basefilefind.h @@ -57,25 +57,28 @@ public: Core::FindFlags flags; QStringList nameFilters; QVariant additionalParameters; - QVariant extensionParameters; + int searchEngineIndex; + QVariant searchEngineParameters; }; -class TEXTEDITOR_EXPORT FileFindExtension : public QObject +class BaseFileFind; + +class TEXTEDITOR_EXPORT SearchEngine : public QObject { public: - virtual ~FileFindExtension() {} + virtual ~SearchEngine() {} virtual QString title() const = 0; virtual QString toolTip() const = 0; // add %1 placeholder where the find flags should be put virtual QWidget *widget() const = 0; virtual bool isEnabled() const = 0; - virtual bool isEnabled(const FileFindParameters ¶meters) const = 0; virtual QVariant parameters() const = 0; virtual void readSettings(QSettings *settings) = 0; virtual void writeSettings(QSettings *settings) const = 0; virtual QFuture<Utils::FileSearchResultList> executeSearch( - const FileFindParameters ¶meters) = 0; + const FileFindParameters ¶meters, BaseFileFind *baseFileFind) = 0; virtual Core::IEditor *openEditor(const Core::SearchResultItem &item, const FileFindParameters ¶meters) = 0; + }; class TEXTEDITOR_EXPORT BaseFileFind : public Core::IFindFilter @@ -90,16 +93,16 @@ public: bool isReplaceSupported() const { return true; } void findAll(const QString &txt, Core::FindFlags findFlags); void replaceAll(const QString &txt, Core::FindFlags findFlags); - void setFindExtension(FileFindExtension *extension); + void addSearchEngine(SearchEngine *searchEngine); /* returns the list of unique files that were passed in items */ static QStringList replaceAll(const QString &txt, const QList<Core::SearchResultItem> &items, bool preserveCase = false); - -protected: virtual Utils::FileIterator *files(const QStringList &nameFilters, const QVariant &additionalParameters) const = 0; + +protected: virtual QVariant additionalParameters() const = 0; QVariant getAdditionalParameters(Core::SearchResult *search); virtual QString label() const = 0; // see Core::SearchResultWindow::startNewSearch @@ -113,7 +116,11 @@ protected: void syncComboWithSettings(QComboBox *combo, const QString &setting); void updateComboEntries(QComboBox *combo, bool onTop); QStringList fileNameFilters() const; - FileFindExtension *extension() const; + + SearchEngine *currentSearchEngine() const; + QVector<SearchEngine *> searchEngines() const; + void setCurrentSearchEngine(int index); + virtual void syncSearchEngineCombo(int /*selectedSearchEngineIndex*/) {} private: void displayResult(int index); diff --git a/src/plugins/texteditor/findinfiles.cpp b/src/plugins/texteditor/findinfiles.cpp index 3fa85c07ed..207172311a 100644 --- a/src/plugins/texteditor/findinfiles.cpp +++ b/src/plugins/texteditor/findinfiles.cpp @@ -41,6 +41,8 @@ #include <QFileDialog> #include <QLabel> #include <QHBoxLayout> +#include <QStackedWidget> +#include <QComboBox> using namespace Core; using namespace TextEditor; @@ -64,7 +66,7 @@ FindInFiles::~FindInFiles() bool FindInFiles::isValid() const { - return m_directory->isValid(); + return m_directory->isValid() && currentSearchEngine()->isEnabled(); } QString FindInFiles::id() const @@ -92,11 +94,8 @@ QVariant FindInFiles::additionalParameters() const QString FindInFiles::label() const { - QString title = tr("Directory"); - if (FileFindExtension *ext = extension()) { - if (ext->isEnabled()) - title = ext->title(); - } + QString title = currentSearchEngine()->title(); + const QChar slash = QLatin1Char('/'); const QStringList &nonEmptyComponents = path().toFileInfo().absoluteFilePath() .split(slash, QString::SkipEmptyParts); @@ -107,10 +106,31 @@ QString FindInFiles::label() const QString FindInFiles::toolTip() const { - //: %3 is filled by BaseFileFind::runNewSearch - return tr("Path: %1\nFilter: %2\n%3") + //: the last arg is filled by BaseFileFind::runNewSearch + QString tooltip = tr("Path: %1\nFilter: %2\n%3") .arg(path().toUserOutput()) .arg(fileNameFilters().join(QLatin1Char(','))); + + const QString searchEngineToolTip = currentSearchEngine()->toolTip(); + if (!searchEngineToolTip.isEmpty()) + tooltip = tooltip.arg(searchEngineToolTip); + + return tooltip; +} + +void FindInFiles::syncSearchEngineCombo(int selectedSearchEngineIndex) +{ + QTC_ASSERT(m_searchEngineCombo && selectedSearchEngineIndex >= 0 + && selectedSearchEngineIndex < searchEngines().size(), return); + + m_searchEngineCombo->setCurrentIndex(selectedSearchEngineIndex); + searchEnginesSelectionChanged(selectedSearchEngineIndex); +} + +void FindInFiles::searchEnginesSelectionChanged(int index) +{ + setCurrentSearchEngine(index); + m_searchEngineWidget->setCurrentIndex(index); } QWidget *FindInFiles::createConfigWidget() @@ -122,8 +142,22 @@ QWidget *FindInFiles::createConfigWidget() m_configWidget->setLayout(gridLayout); int row = 0; - if (FileFindExtension *ext = extension()) - gridLayout->addWidget(ext->widget(), row++, 1, 1, 2); + auto searchEngineLabel = new QLabel(tr("Search engine:")); + gridLayout->addWidget(searchEngineLabel, row, 0, Qt::AlignRight); + + m_searchEngineCombo = new QComboBox; + auto cc = static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged); + connect(m_searchEngineCombo, cc, this, &FindInFiles::searchEnginesSelectionChanged); + connect(m_searchEngineCombo, cc, this, &FindInFiles::enabledChanged); + searchEngineLabel->setBuddy(m_searchEngineCombo); + gridLayout->addWidget(m_searchEngineCombo, row, 1); + + m_searchEngineWidget = new QStackedWidget(m_configWidget); + foreach (SearchEngine *searchEngine, searchEngines()) { + m_searchEngineWidget->addWidget(searchEngine->widget()); + m_searchEngineCombo->addItem(searchEngine->title()); + } + gridLayout->addWidget(m_searchEngineWidget, row++, 2); QLabel *dirLabel = new QLabel(tr("Director&y:")); gridLayout->addWidget(dirLabel, row, 0, Qt::AlignRight); @@ -131,9 +165,10 @@ QWidget *FindInFiles::createConfigWidget() m_directory->setExpectedKind(PathChooser::ExistingDirectory); m_directory->setPromptDialogTitle(tr("Directory to Search")); connect(m_directory.data(), &PathChooser::pathChanged, - this, &FindInFiles::pathChanged); - connect(m_directory.data(), &PathChooser::validChanged, - this, &FindInFiles::enabledChanged); + this, [this](const QString &path) { + emit FindInFiles::pathChanged(path); + emit FindInFiles::enabledChanged(isEnabled()); + }); m_directory->setHistoryCompleter(QLatin1String(HistoryKey), /*restoreLastItemFromHistory=*/ true); if (!HistoryCompleter::historyExistsFor(QLatin1String(HistoryKey))) { diff --git a/src/plugins/texteditor/findinfiles.h b/src/plugins/texteditor/findinfiles.h index 71416aba22..4f37497091 100644 --- a/src/plugins/texteditor/findinfiles.h +++ b/src/plugins/texteditor/findinfiles.h @@ -32,7 +32,10 @@ #include <QPointer> #include <QStringListModel> -QT_FORWARD_DECLARE_CLASS(QLabel) +QT_BEGIN_NAMESPACE +class QLabel; +class QStackedWidget; +QT_END_NAMESPACE namespace Utils { class PathChooser; } @@ -67,12 +70,16 @@ protected: QVariant additionalParameters() const; QString label() const; QString toolTip() const; + void syncSearchEngineCombo(int selectedSearchEngineIndex) override; private: + void searchEnginesSelectionChanged(int index); Utils::FileName path() const; QPointer<QWidget> m_configWidget; QPointer<Utils::PathChooser> m_directory; + QStackedWidget *m_searchEngineWidget = nullptr; + QComboBox *m_searchEngineCombo = nullptr; }; } // namespace TextEditor |