From b1c881ceaa7796553aee5f205ac30641d7827346 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 9 Aug 2011 11:08:01 +0200 Subject: [PATCH] Highlight matches when opening editor from advanced text search. When you close the search pane it will remove the highlight, even if the find tool bar is open with a different search, though. Task-number: QTCREATORBUG-2606 Change-Id: I7defe15c844d37ae80ab66c6b9e68e1ef1afdf92 Reviewed-on: http://codereview.qt.nokia.com/2786 Reviewed-by: Eike Ziller --- src/plugins/bineditor/bineditorplugin.cpp | 5 ++ src/plugins/bookmarks/bookmarkmanager.cpp | 4 +- src/plugins/find/currentdocumentfind.cpp | 2 +- src/plugins/find/searchresultwindow.cpp | 4 +- src/plugins/find/searchresultwindow.h | 8 +++ src/plugins/find/textfindconstants.h | 2 + src/plugins/texteditor/basefilefind.cpp | 85 ++++++++++++++--------- src/plugins/texteditor/basefilefind.h | 8 +++ src/plugins/texteditor/basetexteditor.cpp | 4 +- src/plugins/texteditor/basetexteditor.h | 2 +- 10 files changed, 87 insertions(+), 37 deletions(-) diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp index 2ea43aca6c1..ece27b9ccbb 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 3badc8aa831..41624408f6d 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(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 b1d401db417..383e21e5954 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 2fdc86cdab1..c5a622d7bc5 100644 --- a/src/plugins/find/searchresultwindow.cpp +++ b/src/plugins/find/searchresultwindow.cpp @@ -486,8 +486,10 @@ QList 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 386f75245b2..748d30c3e66 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 &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 47474de9320..3a51299b397 100644 --- a/src/plugins/find/textfindconstants.h +++ b/src/plugins/find/textfindconstants.h @@ -35,6 +35,7 @@ #include "find_global.h" +#include #include #include @@ -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 5a8ff5f382f..47619264cd8 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -32,17 +32,19 @@ #include "basefilefind.h" +#include #include #include #include #include +#include #include #include -#include #include #include #include #include +#include #include #include @@ -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()); - 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)), + this, SLOT(doReplace(QString,QList))); + } + 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()); - 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)), - this, SLOT(doReplace(QString,QList))); - 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 items; // this conversion is stupid... + QList items; foreach (const Utils::FileSearchResult &result, results) { Find::SearchResultItem item; item.path = QStringList() << QDir::toNativeSeparators(result.fileName); @@ -267,12 +264,38 @@ void BaseFileFind::updateComboEntries(QComboBox *combo, bool onTop) void BaseFileFind::openEditor(const Find::SearchResultItem &item) { + SearchResult *result = qobject_cast(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(openedEditor->widget())) { + if (result) { + QVariantList userData = result->userData().value(); + QTC_ASSERT(userData.size() != 0, return); + m_currentFindSupport = findSupport; + m_currentFindSupport->highlightAll(userData.at(0).toString(), userData.at(1).value()); + } + } +} + +void BaseFileFind::hideHighlightAll(bool visible) +{ + if (!visible && m_currentFindSupport) + m_currentFindSupport->clearResults(); } // #pragma mark Static methods diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h index 9cde6378bdb..de6e1c0b3af 100644 --- a/src/plugins/texteditor/basefilefind.h +++ b/src/plugins/texteditor/basefilefind.h @@ -36,6 +36,8 @@ #include "texteditor_global.h" #include +#include +#include #include #include @@ -88,13 +90,19 @@ private slots: void openEditor(const Find::SearchResultItem &item); void doReplace(const QString &txt, const QList &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 m_watcher; bool m_isSearching; + QPointer 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 3c84096a5c3..ddd30dfe8fa 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 f64d8aad82c..a163daa1a8e 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);