diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp index 2ea43aca6c1a2340067cfefe9027b4fc779b4af6..ece27b9ccbb9be360c0f97511f896878fd47c0ba 100644 --- a/src/plugins/bineditor/bineditorplugin.cpp +++ b/src/plugins/bineditor/bineditorplugin.cpp @@ -93,6 +93,11 @@ public: m_incrementalStartPos = m_contPos = -1; } + virtual void highlightAll(const QString &txt, Find::FindFlags findFlags) + { + m_editor->highlightSearchResults(txt.toLatin1(), Find::textDocumentFlagsForFindFlags(findFlags)); + } + void clearResults() { m_editor->highlightSearchResults(QByteArray()); } QString currentFindString() const { return QString(); } QString completedFindString() const { return QString(); } diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index 3badc8aa83184dc8d999a6a72736450209d8a276..41624408f6da9eb70a2ea31da9551197ffcbf207 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -486,8 +486,10 @@ Bookmark *BookmarkManager::bookmarkForIndex(const QModelIndex &index) bool BookmarkManager::gotoBookmark(Bookmark *bookmark) { using namespace TextEditor; - if (ITextEditor *editor = BaseTextEditorWidget::openEditorAt(bookmark->filePath(), bookmark->lineNumber())) + if (ITextEditor *editor = qobject_cast<ITextEditor *>(BaseTextEditorWidget::openEditorAt(bookmark->filePath(), + bookmark->lineNumber()))) { return (editor->currentLine() == bookmark->lineNumber()); + } return false; } diff --git a/src/plugins/find/currentdocumentfind.cpp b/src/plugins/find/currentdocumentfind.cpp index b1d401db417b9dac9fcad8842725072b482d551b..383e21e5954fe0bef199e20d4cd5fefdc412929a 100644 --- a/src/plugins/find/currentdocumentfind.cpp +++ b/src/plugins/find/currentdocumentfind.cpp @@ -181,7 +181,7 @@ void CurrentDocumentFind::acceptCandidate() return; removeFindSupportConnections(); if (m_currentFind) - m_currentFind->highlightAll(QString(), 0); + m_currentFind->clearResults(); if (m_currentWidget) disconnect(Aggregation::Aggregate::parentAggregate(m_currentWidget), SIGNAL(changed()), diff --git a/src/plugins/find/searchresultwindow.cpp b/src/plugins/find/searchresultwindow.cpp index 2fdc86cdab1c95090801a5d81d6547e5df327e92..c5a622d7bc5552303e5cfb7eaa2c8b1b5bb7e9c7 100644 --- a/src/plugins/find/searchresultwindow.cpp +++ b/src/plugins/find/searchresultwindow.cpp @@ -486,8 +486,10 @@ QList<SearchResultItem> SearchResultWindow::checkedItems() const \fn void SearchResultWindow::visibilityChanged(bool) \internal */ -void SearchResultWindow::visibilityChanged(bool /*visible*/) +void SearchResultWindow::visibilityChanged(bool visible) { + if (d->m_currentSearch) + d->m_currentSearch->visibilityChanged(visible); } /*! diff --git a/src/plugins/find/searchresultwindow.h b/src/plugins/find/searchresultwindow.h index 386f75245b2fdf1545f233e1d1d589b82d2328f7..748d30c3e6650ef20569a3ac6b30c031792315ec 100644 --- a/src/plugins/find/searchresultwindow.h +++ b/src/plugins/find/searchresultwindow.h @@ -88,11 +88,19 @@ class FIND_EXPORT SearchResult : public QObject { Q_OBJECT +public: + void setUserData(const QVariant &data) { m_userData = data; } + QVariant userData() const { return m_userData; } + signals: void activated(const Find::SearchResultItem &item); void replaceButtonClicked(const QString &replaceText, const QList<Find::SearchResultItem> &checkedItems); + void visibilityChanged(bool visible); friend class SearchResultWindow; + +private: + QVariant m_userData; }; class FIND_EXPORT SearchResultWindow : public Core::IOutputPane diff --git a/src/plugins/find/textfindconstants.h b/src/plugins/find/textfindconstants.h index 47474de9320002b8ac9d1690bfb3275afdab297e..3a51299b3973fb6cc8a3a460bfeee2393383b0b1 100644 --- a/src/plugins/find/textfindconstants.h +++ b/src/plugins/find/textfindconstants.h @@ -35,6 +35,7 @@ #include "find_global.h" +#include <QtCore/QMetaType> #include <QtCore/QFlags> #include <QtGui/QTextDocument> @@ -77,5 +78,6 @@ QTextDocument::FindFlags FIND_EXPORT textDocumentFlagsForFindFlags(Find::FindFla } // namespace Find Q_DECLARE_OPERATORS_FOR_FLAGS(Find::FindFlags) +Q_DECLARE_METATYPE(Find::FindFlags) #endif // TEXTFINDCONSTANTS_H diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index 5a8ff5f382feaf4788adff5df5694ce38fa2ad42..47619264cd8f40d5d32f4c1e9a3322501c5e121e 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -32,17 +32,19 @@ #include "basefilefind.h" +#include <aggregation/aggregate.h> #include <coreplugin/icore.h> #include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/progressmanager/futureprogress.h> #include <coreplugin/editormanager/editormanager.h> +#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/filemanager.h> #include <find/textfindconstants.h> -#include <find/searchresultwindow.h> #include <texteditor/itexteditor.h> #include <texteditor/basetexteditor.h> #include <utils/stylehelper.h> #include <utils/fileutils.h> +#include <utils/qtcassert.h> #include <QtCore/QDebug> #include <QtCore/QDirIterator> @@ -100,15 +102,28 @@ QStringList BaseFileFind::fileNameFilters() const return filters; } -void BaseFileFind::findAll(const QString &txt, Find::FindFlags findFlags) +void BaseFileFind::runNewSearch(const QString &txt, Find::FindFlags findFlags, + SearchResultWindow::SearchMode searchMode) { m_isSearching = true; + m_currentFindSupport = 0; emit changed(); if (m_filterCombo) updateComboEntries(m_filterCombo, true); m_watcher.setFuture(QFuture<FileSearchResultList>()); - SearchResult *result = m_resultWindow->startNewSearch(); + SearchResult *result = m_resultWindow->startNewSearch(searchMode, + searchMode == SearchResultWindow::SearchAndReplace + ? QString::fromLatin1("TextEditor") + : QString()); + QVariantList searchParameters; + searchParameters << qVariantFromValue(txt) << qVariantFromValue(findFlags); + result->setUserData(searchParameters); connect(result, SIGNAL(activated(Find::SearchResultItem)), this, SLOT(openEditor(Find::SearchResultItem))); + if (searchMode == SearchResultWindow::SearchAndReplace) { + connect(result, SIGNAL(replaceButtonClicked(QString,QList<Find::SearchResultItem>)), + this, SLOT(doReplace(QString,QList<Find::SearchResultItem>))); + } + connect(result, SIGNAL(visibilityChanged(bool)), this, SLOT(hideHighlightAll(bool))); m_resultWindow->popup(true); if (findFlags & Find::FindRegularExpression) { m_watcher.setFuture(Utils::findInFilesRegExp(txt, files(), @@ -125,32 +140,14 @@ void BaseFileFind::findAll(const QString &txt, Find::FindFlags findFlags) connect(progress, SIGNAL(clicked()), m_resultWindow, SLOT(popup())); } +void BaseFileFind::findAll(const QString &txt, Find::FindFlags findFlags) +{ + runNewSearch(txt, findFlags, SearchResultWindow::SearchOnly); +} + void BaseFileFind::replaceAll(const QString &txt, Find::FindFlags findFlags) { - m_isSearching = true; - emit changed(); - if (m_filterCombo) - updateComboEntries(m_filterCombo, true); - m_watcher.setFuture(QFuture<FileSearchResultList>()); - SearchResult *result = m_resultWindow->startNewSearch( - SearchResultWindow::SearchAndReplace, QLatin1String("TextEditor")); - connect(result, SIGNAL(activated(Find::SearchResultItem)), this, SLOT(openEditor(Find::SearchResultItem))); - connect(result, SIGNAL(replaceButtonClicked(QString,QList<Find::SearchResultItem>)), - this, SLOT(doReplace(QString,QList<Find::SearchResultItem>))); - m_resultWindow->popup(true); - if (findFlags & Find::FindRegularExpression) { - m_watcher.setFuture(Utils::findInFilesRegExp(txt, files(), - textDocumentFlagsForFindFlags(findFlags), ITextEditor::openedTextEditorsContents())); - } else { - m_watcher.setFuture(Utils::findInFiles(txt, files(), - textDocumentFlagsForFindFlags(findFlags), ITextEditor::openedTextEditorsContents())); - } - Core::FutureProgress *progress = - Core::ICore::instance()->progressManager()->addTask(m_watcher.future(), - tr("Search"), - Constants::TASK_SEARCH); - progress->setWidget(createProgressWidget()); - connect(progress, SIGNAL(clicked()), m_resultWindow, SLOT(popup())); + runNewSearch(txt, findFlags, SearchResultWindow::SearchAndReplace); } void BaseFileFind::doReplace(const QString &text, @@ -166,7 +163,7 @@ void BaseFileFind::doReplace(const QString &text, void BaseFileFind::displayResult(int index) { Utils::FileSearchResultList results = m_watcher.future().resultAt(index); - QList<Find::SearchResultItem> items; // this conversion is stupid... + QList<Find::SearchResultItem> items; foreach (const Utils::FileSearchResult &result, results) { Find::SearchResultItem item; item.path = QStringList() << QDir::toNativeSeparators(result.fileName); @@ -267,14 +264,40 @@ void BaseFileFind::updateComboEntries(QComboBox *combo, bool onTop) void BaseFileFind::openEditor(const Find::SearchResultItem &item) { + SearchResult *result = qobject_cast<SearchResult *>(sender()); + Core::IEditor *openedEditor = 0; if (item.path.size() > 0) { - TextEditor::BaseTextEditorWidget::openEditorAt(QDir::fromNativeSeparators(item.path.first()), item.lineNumber, item.textMarkPos, - QString(), Core::EditorManager::ModeSwitch); + openedEditor = TextEditor::BaseTextEditorWidget::openEditorAt(QDir::fromNativeSeparators(item.path.first()), + item.lineNumber, + item.textMarkPos, + QString(), + Core::EditorManager::ModeSwitch); } else { - Core::EditorManager::instance()->openEditor(item.text, QString(), Core::EditorManager::ModeSwitch); + openedEditor = Core::EditorManager::instance()->openEditor(item.text, QString(), + Core::EditorManager::ModeSwitch); + } + if (m_currentFindSupport) + m_currentFindSupport->clearResults(); + m_currentFindSupport = 0; + if (!openedEditor) + return; + // highlight results + if (IFindSupport *findSupport = Aggregation::query<IFindSupport>(openedEditor->widget())) { + if (result) { + QVariantList userData = result->userData().value<QVariantList>(); + QTC_ASSERT(userData.size() != 0, return); + m_currentFindSupport = findSupport; + m_currentFindSupport->highlightAll(userData.at(0).toString(), userData.at(1).value<FindFlags>()); + } } } +void BaseFileFind::hideHighlightAll(bool visible) +{ + if (!visible && m_currentFindSupport) + m_currentFindSupport->clearResults(); +} + // #pragma mark Static methods static void applyChanges(QTextDocument *doc, const QString &text, const QList<Find::SearchResultItem> &items) diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h index 9cde6378bdb0f0c6e794794de5465094925dcb99..de6e1c0b3af3155906ab6d611daffc485456aab2 100644 --- a/src/plugins/texteditor/basefilefind.h +++ b/src/plugins/texteditor/basefilefind.h @@ -36,6 +36,8 @@ #include "texteditor_global.h" #include <find/ifindfilter.h> +#include <find/ifindsupport.h> +#include <find/searchresultwindow.h> #include <utils/filesearch.h> #include <QtCore/QFutureWatcher> @@ -88,13 +90,19 @@ private slots: void openEditor(const Find::SearchResultItem &item); void doReplace(const QString &txt, const QList<Find::SearchResultItem> &items); + void hideHighlightAll(bool visible); private: QWidget *createProgressWidget(); + void runNewSearch(const QString &txt, Find::FindFlags findFlags, + Find::SearchResultWindow::SearchMode searchMode); Find::SearchResultWindow *m_resultWindow; + QFutureWatcher<Utils::FileSearchResultList> m_watcher; bool m_isSearching; + QPointer<Find::IFindSupport> m_currentFindSupport; + QLabel *m_resultLabel; QStringListModel m_filterStrings; QString m_filterSetting; diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 3c84096a5c39be6eff83c3982b8c502c2f44e279..ddd30dfe8fa04d6b614fab689326c6dbbcf4c8ed 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -154,7 +154,7 @@ protected: } // namespace Internal } // namespace TextEditor -ITextEditor *BaseTextEditorWidget::openEditorAt(const QString &fileName, int line, int column, +Core::IEditor *BaseTextEditorWidget::openEditorAt(const QString &fileName, int line, int column, const QString &editorKind, Core::EditorManager::OpenEditorFlags flags, bool *newEditor) @@ -170,7 +170,7 @@ ITextEditor *BaseTextEditorWidget::openEditorAt(const QString &fileName, int lin return texteditor; } - return 0; + return editor; } static void convertToPlainText(QString &txt) diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h index f64d8aad82cb0461e412bdffbd739110416551a7..a163daa1a8eab13a4fa1f7d854db488ca73bf6fb 100644 --- a/src/plugins/texteditor/basetexteditor.h +++ b/src/plugins/texteditor/basetexteditor.h @@ -132,7 +132,7 @@ public: BaseTextEditorWidget(QWidget *parent); ~BaseTextEditorWidget(); - static ITextEditor *openEditorAt(const QString &fileName, int line, int column = 0, + static Core::IEditor *openEditorAt(const QString &fileName, int line, int column = 0, const QString &editorId = QString(), Core::EditorManager::OpenEditorFlags flags = Core::EditorManager::IgnoreNavigationHistory, bool *newEditor = 0);