aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/texteditor/basefilefind.cpp
diff options
context:
space:
mode:
authorPrzemyslaw Gorszkowski <pgorszkowski@gmail.com>2016-03-16 22:37:24 +0100
committerPrzemyslaw Gorszkowski <pgorszkowski@gmail.com>2016-11-16 09:52:05 +0000
commit6b2cf5cd03073ee8e7b319f68f7dce43c7984622 (patch)
treea8aec1772eb4fa09881b8858aef47c360ed25518 /src/plugins/texteditor/basefilefind.cpp
parent4ae07377db1f587b5d49a46c355d46c97a6c59fc (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>
Diffstat (limited to 'src/plugins/texteditor/basefilefind.cpp')
-rw-r--r--src/plugins/texteditor/basefilefind.cpp124
1 files changed, 86 insertions, 38 deletions
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 &parameters,
+ 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 &parameters)
{
- 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 {