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>
This commit is contained in:
Przemyslaw Gorszkowski
2016-03-16 22:37:24 +01:00
parent 4ae07377db
commit 6b2cf5cd03
6 changed files with 168 additions and 89 deletions

View File

@@ -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 {