From 44e2704bc151cfe508b449969a4a47a2b749cbd9 Mon Sep 17 00:00:00 2001 From: con <qtc-committer@nokia.com> Date: Mon, 5 Oct 2009 16:01:50 +0200 Subject: [PATCH] Refactor search result window for use of many items and checked state. --- src/plugins/cpptools/cppfindreferences.cpp | 22 ++--- src/plugins/cpptools/cppfindreferences.h | 3 +- src/plugins/cpptools/cpptoolsplugin.cpp | 44 ++++----- src/plugins/cpptools/cpptoolsplugin.h | 5 +- src/plugins/find/searchresulttreeview.cpp | 7 +- src/plugins/find/searchresulttreeview.h | 3 +- src/plugins/find/searchresultwindow.cpp | 102 +++++++++++++-------- src/plugins/find/searchresultwindow.h | 50 ++++++---- src/plugins/texteditor/basefilefind.cpp | 12 +-- src/plugins/texteditor/basefilefind.h | 3 +- 10 files changed, 141 insertions(+), 110 deletions(-) diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 743cfae0ece..b9a22812cc0 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -493,7 +493,10 @@ static void find_helper(QFutureInterface<Core::Utils::FileSearchResult> &future, void CppFindReferences::findAll(Symbol *symbol) { - _resultWindow->clearContents(); + Find::SearchResult *search = _resultWindow->startNewSearch(); + connect(search, SIGNAL(activated(Find::SearchResultItem)), + this, SLOT(openEditor(Find::SearchResultItem))); + _resultWindow->setShowReplaceUI(true); _resultWindow->popup(true); @@ -515,14 +518,11 @@ void CppFindReferences::findAll(Symbol *symbol) void CppFindReferences::displayResult(int index) { Core::Utils::FileSearchResult result = m_watcher.future().resultAt(index); - Find::ResultWindowItem *item = _resultWindow->addResult(result.fileName, - result.lineNumber, - result.matchingLine, - result.matchStart, - result.matchLength); - if (item) - connect(item, SIGNAL(activated(const QString&,int,int)), - this, SLOT(openEditor(const QString&,int,int))); + _resultWindow->addResult(result.fileName, + result.lineNumber, + result.matchingLine, + result.matchStart, + result.matchLength); } void CppFindReferences::searchFinished() @@ -530,8 +530,8 @@ void CppFindReferences::searchFinished() emit changed(); } -void CppFindReferences::openEditor(const QString &fileName, int line, int column) +void CppFindReferences::openEditor(const Find::SearchResultItem &item) { - TextEditor::BaseTextEditor::openEditorAt(fileName, line, column); + TextEditor::BaseTextEditor::openEditorAt(item.fileName, item.lineNumber, item.searchTermStart); } diff --git a/src/plugins/cpptools/cppfindreferences.h b/src/plugins/cpptools/cppfindreferences.h index 3de964f4bd4..78bbf338384 100644 --- a/src/plugins/cpptools/cppfindreferences.h +++ b/src/plugins/cpptools/cppfindreferences.h @@ -39,6 +39,7 @@ namespace Find { class SearchResultWindow; + struct SearchResultItem; } // end of namespace Find namespace CppTools { @@ -67,7 +68,7 @@ public: private Q_SLOTS: void displayResult(int); void searchFinished(); - void openEditor(const QString&, int, int); + void openEditor(const Find::SearchResultItem &item); private: QPointer<CppModelManager> _modelManager; diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index 29453011282..b4952f334f3 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -86,7 +86,10 @@ FindClassDeclarations::FindClassDeclarations(CppModelManager *modelManager) void FindClassDeclarations::findAll(const QString &text, QTextDocument::FindFlags findFlags) { - _resultWindow->clearContents(); + Find::SearchResult *search = _resultWindow->startNewSearch(); + connect(search, SIGNAL(activated(Find::SearchResultItem)), + this, SLOT(openEditor(Find::SearchResultItem))); + _resultWindow->popup(true); Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager(); @@ -107,14 +110,11 @@ void FindClassDeclarations::findAll(const QString &text, QTextDocument::FindFlag void FindClassDeclarations::displayResult(int index) { Core::Utils::FileSearchResult result = m_watcher.future().resultAt(index); - Find::ResultWindowItem *item = _resultWindow->addResult(result.fileName, - result.lineNumber, - result.matchingLine, - result.matchStart, - result.matchLength); - if (item) - connect(item, SIGNAL(activated(const QString&,int,int)), - this, SLOT(openEditor(const QString&,int,int))); + _resultWindow->addResult(result.fileName, + result.lineNumber, + result.matchingLine, + result.matchStart, + result.matchLength); } void FindClassDeclarations::searchFinished() @@ -122,9 +122,9 @@ void FindClassDeclarations::searchFinished() emit changed(); } -void FindClassDeclarations::openEditor(const QString &fileName, int line, int column) +void FindClassDeclarations::openEditor(const Find::SearchResultItem &item) { - TextEditor::BaseTextEditor::openEditorAt(fileName, line, column); + TextEditor::BaseTextEditor::openEditorAt(item.fileName, item.lineNumber, item.searchTermStart); } ////// @@ -139,7 +139,10 @@ FindFunctionCalls::FindFunctionCalls(CppModelManager *modelManager) void FindFunctionCalls::findAll(const QString &text, QTextDocument::FindFlags findFlags) { - _resultWindow->clearContents(); + Find::SearchResult *search = _resultWindow->startNewSearch(); + connect(search, SIGNAL(activated(Find::SearchResultItem)), + this, SLOT(openEditor(Find::SearchResultItem))); + _resultWindow->popup(true); Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager(); @@ -160,14 +163,11 @@ void FindFunctionCalls::findAll(const QString &text, QTextDocument::FindFlags fi void FindFunctionCalls::displayResult(int index) { Core::Utils::FileSearchResult result = m_watcher.future().resultAt(index); - Find::ResultWindowItem *item = _resultWindow->addResult(result.fileName, - result.lineNumber, - result.matchingLine, - result.matchStart, - result.matchLength); - if (item) - connect(item, SIGNAL(activated(const QString&,int,int)), - this, SLOT(openEditor(const QString&,int,int))); + _resultWindow->addResult(result.fileName, + result.lineNumber, + result.matchingLine, + result.matchStart, + result.matchLength); } void FindFunctionCalls::searchFinished() @@ -175,9 +175,9 @@ void FindFunctionCalls::searchFinished() emit changed(); } -void FindFunctionCalls::openEditor(const QString &fileName, int line, int column) +void FindFunctionCalls::openEditor(const Find::SearchResultItem &item) { - TextEditor::BaseTextEditor::openEditorAt(fileName, line, column); + TextEditor::BaseTextEditor::openEditorAt(item.fileName, item.lineNumber, item.searchTermStart); } diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 3a86d8eb613..7084e3d2fa4 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -53,6 +53,7 @@ class Snapshot; namespace Find { class SearchResultWindow; +struct SearchResultItem; } namespace CppTools { @@ -79,7 +80,7 @@ public: protected Q_SLOTS: void displayResult(int); void searchFinished(); - void openEditor(const QString&, int, int); + void openEditor(const Find::SearchResultItem &item); private: QPointer<CppModelManager> _modelManager; @@ -104,7 +105,7 @@ public: protected Q_SLOTS: void displayResult(int); void searchFinished(); - void openEditor(const QString&, int, int); + void openEditor(const Find::SearchResultItem &item); private: QPointer<CppModelManager> _modelManager; diff --git a/src/plugins/find/searchresulttreeview.cpp b/src/plugins/find/searchresulttreeview.cpp index c5317c0fdb7..e05360a4354 100644 --- a/src/plugins/find/searchresulttreeview.cpp +++ b/src/plugins/find/searchresulttreeview.cpp @@ -81,13 +81,10 @@ void SearchResultTreeView::emitJumpToSearchResult(const QModelIndex &index) if (model()->data(index, ItemDataRoles::TypeRole).toString().compare("row") != 0) return; - QString fileName = model()->data(index, ItemDataRoles::FileNameRole).toString(); int position = model()->data(index, ItemDataRoles::ResultIndexRole).toInt(); - int lineNumber = model()->data(index, ItemDataRoles::ResultLineNumberRole).toInt(); - int searchTermStart = model()->data(index, ItemDataRoles::SearchTermStartRole).toInt(); - int searchTermLength = model()->data(index, ItemDataRoles::SearchTermLengthRole).toInt(); + int checked = model()->data(index, Qt::CheckStateRole).toBool(); - emit jumpToSearchResult(position, fileName, lineNumber, searchTermStart, searchTermLength); + emit jumpToSearchResult(position, checked); } void SearchResultTreeView::keyPressEvent(QKeyEvent *e) diff --git a/src/plugins/find/searchresulttreeview.h b/src/plugins/find/searchresulttreeview.h index c8a5cc52e51..81b767cee72 100644 --- a/src/plugins/find/searchresulttreeview.h +++ b/src/plugins/find/searchresulttreeview.h @@ -51,8 +51,7 @@ public: SearchResultTreeModel *model() const; signals: - void jumpToSearchResult(int index, const QString &fileName, int lineNumber, - int searchTermStart, int searchTermLength); + void jumpToSearchResult(int index, bool checked); public slots: void clear(); diff --git a/src/plugins/find/searchresultwindow.cpp b/src/plugins/find/searchresultwindow.cpp index 1503eb270c7..f9b6caf3cf9 100644 --- a/src/plugins/find/searchresultwindow.cpp +++ b/src/plugins/find/searchresultwindow.cpp @@ -29,8 +29,10 @@ #include "searchresultwindow.h" #include "searchresulttreemodel.h" +#include "searchresulttreeitems.h" #include <coreplugin/icore.h> +#include <utils/qtcassert.h> #include <QtCore/QFile> #include <QtCore/QTextStream> @@ -49,18 +51,9 @@ static const QString SETTINGSKEYSECTIONNAME("SearchResults"); static const QString SETTINGSKEYEXPANDRESULTS("ExpandResults"); -void ResultWindowItem::setData(const QVariant &data) -{ - m_data = data; -} - -QVariant ResultWindowItem::data() const -{ - return m_data; -} - SearchResultWindow::SearchResultWindow() - : m_isShowingReplaceUI(false) + : m_currentSearch(0), + m_isShowingReplaceUI(false) { m_widget = new QStackedWidget; m_widget->setWindowTitle(name()); @@ -91,8 +84,8 @@ SearchResultWindow::SearchResultWindow() m_replaceButton->setAutoRaise(true); m_replaceTextEdit->setTabOrder(m_replaceTextEdit, m_searchResultTreeView); - connect(m_searchResultTreeView, SIGNAL(jumpToSearchResult(int,const QString&,int,int,int)), - this, SLOT(handleJumpToSearchResult(int,const QString&,int,int,int))); + connect(m_searchResultTreeView, SIGNAL(jumpToSearchResult(int,bool)), + this, SLOT(handleJumpToSearchResult(int,bool))); connect(m_expandCollapseToolButton, SIGNAL(toggled(bool)), this, SLOT(handleExpandCollapseToolButton(bool))); connect(m_replaceButton, SIGNAL(clicked()), this, SLOT(handleReplaceButton())); @@ -103,9 +96,10 @@ SearchResultWindow::SearchResultWindow() SearchResultWindow::~SearchResultWindow() { writeSettings(); + delete m_currentSearch; + m_currentSearch = 0; delete m_widget; m_widget = 0; - qDeleteAll(m_items); m_items.clear(); } @@ -115,7 +109,6 @@ void SearchResultWindow::setShowReplaceUI(bool show) m_replaceLabel->setVisible(show); m_replaceTextEdit->setVisible(show); m_replaceButton->setVisible(show); -// TODO m_searchResultTreeView->setShowCheckboxes(show); m_isShowingReplaceUI = show; } @@ -126,18 +119,27 @@ bool SearchResultWindow::isShowingReplaceUI() const void SearchResultWindow::handleReplaceButton() { - emit replaceButtonClicked(m_replaceTextEdit->text()); + QTC_ASSERT(m_currentSearch, return); + m_currentSearch->replaceButtonClicked(m_replaceTextEdit->text(), checkedItems()); } -QList<ResultWindowItem *> SearchResultWindow::selectedItems() const +QList<SearchResultItem> SearchResultWindow::checkedItems() const { - QList<ResultWindowItem *> items; - // TODO -// foreach (ResultWindowItem *item, m_items) { -// if (item->isSelected) -// items << item; -// } - return items; + QList<SearchResultItem> result; + SearchResultTreeModel *model = m_searchResultTreeView->model(); + const int fileCount = model->rowCount(QModelIndex()); + for (int i = 0; i < fileCount; ++i) { + QModelIndex fileIndex = model->index(i, 0, QModelIndex()); + SearchResultFile *fileItem = static_cast<SearchResultFile *>(fileIndex.internalPointer()); + Q_ASSERT(fileItem != 0); + for (int rowIndex = 0; rowIndex < fileItem->childrenCount(); ++rowIndex) { + QModelIndex textIndex = model->index(rowIndex, 0, fileIndex); + SearchResultTextRow *rowItem = static_cast<SearchResultTextRow *>(textIndex.internalPointer()); + if (rowItem->checkState()) + result << m_items.at(rowItem->index()); + } + } + return result; } void SearchResultWindow::visibilityChanged(bool /*visible*/) @@ -154,18 +156,27 @@ QList<QWidget*> SearchResultWindow::toolBarWidgets() const return QList<QWidget*>() << m_expandCollapseToolButton << m_replaceLabel << m_replaceTextEdit << m_replaceButton; } +SearchResult *SearchResultWindow::startNewSearch(SearchMode searchOrSearchAndReplace) +{ + clearContents(); + setShowReplaceUI(searchOrSearchAndReplace != SearchOnly); + delete m_currentSearch; + m_currentSearch = new SearchResult; + return m_currentSearch; +} + void SearchResultWindow::clearContents() { - setShowReplaceUI(false); - m_widget->setCurrentWidget(m_searchResultTreeView); + setReplaceUIEnabled(false); m_searchResultTreeView->clear(); - qDeleteAll(m_items); m_items.clear(); + m_widget->setCurrentWidget(m_searchResultTreeView); navigateStateChanged(); } void SearchResultWindow::showNoMatchesFound() { + setReplaceUIEnabled(false); m_widget->setCurrentWidget(m_noMatchesFoundDisplay); } @@ -176,7 +187,7 @@ bool SearchResultWindow::isEmpty() const int SearchResultWindow::numberOfResults() const { - return m_searchResultTreeView->model()->rowCount(); + return m_items.count(); } bool SearchResultWindow::hasFocus() @@ -210,30 +221,41 @@ void SearchResultWindow::setTextEditorFont(const QFont &font) m_searchResultTreeView->setTextEditorFont(font); } -void SearchResultWindow::handleJumpToSearchResult(int index, const QString &fileName, int lineNumber, - int searchTermStart, int searchTermLength) +void SearchResultWindow::handleJumpToSearchResult(int index, bool checked) { - Q_UNUSED(searchTermLength) - ResultWindowItem *item = m_items.at(index); - emit item->activated(fileName, lineNumber, searchTermStart); + QTC_ASSERT(m_currentSearch, return); + m_currentSearch->activated(m_items.at(index)); } -ResultWindowItem *SearchResultWindow::addResult(const QString &fileName, int lineNumber, const QString &rowText, - int searchTermStart, int searchTermLength) +void SearchResultWindow::addResult(const QString &fileName, int lineNumber, const QString &rowText, + int searchTermStart, int searchTermLength, const QVariant &userData) { //qDebug()<<"###"<<fileName; m_widget->setCurrentWidget(m_searchResultTreeView); int index = m_items.size(); - ResultWindowItem *item = new ResultWindowItem; + SearchResultItem item; + item.fileName = fileName; + item.lineNumber = lineNumber; + item.lineText = rowText; + item.searchTermStart = searchTermStart; + item.searchTermLength = searchTermLength; + item.userData = userData; + item.index = index; m_items.append(item); m_searchResultTreeView->appendResultLine(index, fileName, lineNumber, rowText, searchTermStart, searchTermLength); if (index == 0) { + setReplaceUIEnabled(true); // We didn't have an item before, set the focus to the m_searchResultTreeView setFocus(); m_searchResultTreeView->selectionModel()->select(m_searchResultTreeView->model()->index(0, 0, QModelIndex()), QItemSelectionModel::Select); emit navigateStateChanged(); } - return item; +} + +void SearchResultWindow::setReplaceUIEnabled(bool enabled) +{ + m_replaceTextEdit->setEnabled(enabled); + m_replaceButton->setEnabled(enabled); } void SearchResultWindow::handleExpandCollapseToolButton(bool checked) @@ -272,17 +294,17 @@ int SearchResultWindow::priorityInStatusBar() const bool SearchResultWindow::canNext() { - return m_searchResultTreeView->model()->rowCount(); + return m_items.count() > 0; } bool SearchResultWindow::canPrevious() { - return m_searchResultTreeView->model()->rowCount(); + return m_items.count() > 0; } void SearchResultWindow::goToNext() { - if (!m_searchResultTreeView->model()->rowCount()) + if (m_items.count() == 0) return; QModelIndex idx = m_searchResultTreeView->model()->next(m_searchResultTreeView->currentIndex()); if (idx.isValid()) { diff --git a/src/plugins/find/searchresultwindow.h b/src/plugins/find/searchresultwindow.h index d806bf67bf6..093eb268843 100644 --- a/src/plugins/find/searchresultwindow.h +++ b/src/plugins/find/searchresultwindow.h @@ -47,19 +47,25 @@ namespace Find { class SearchResultWindow; -class FIND_EXPORT ResultWindowItem : public QObject +struct FIND_EXPORT SearchResultItem { - Q_OBJECT + QString fileName; + int lineNumber; + QString lineText; + int searchTermStart; + int searchTermLength; + int index; + QVariant userData; + // whatever information we also need here +}; -public: - void setData(const QVariant &data); - QVariant data() const; +class FIND_EXPORT SearchResult : public QObject +{ + Q_OBJECT signals: - void activated(const QString &fileName, int lineNumber, int column); - -private: - QVariant m_data; + void activated(const Find::SearchResultItem &item); + void replaceButtonClicked(const QString &replaceText, const QList<Find::SearchResultItem> &checkedItems); friend class SearchResultWindow; }; @@ -69,6 +75,11 @@ class FIND_EXPORT SearchResultWindow : public Core::IOutputPane Q_OBJECT public: + enum SearchMode { + SearchOnly, + SearchAndReplace + }; + SearchResultWindow(); ~SearchResultWindow(); @@ -90,30 +101,30 @@ public: void goToPrev(); bool canNavigate(); + void setTextEditorFont(const QFont &font); + void setShowReplaceUI(bool show); bool isShowingReplaceUI() const; - QList<ResultWindowItem *> selectedItems() const; - void setTextEditorFont(const QFont &font); - -signals: - void replaceButtonClicked(const QString &replaceText); + // search result object only lives till next startnewsearch call + SearchResult *startNewSearch(SearchMode searchOrSearchAndReplace = SearchOnly); public slots: void clearContents(); void showNoMatchesFound(); - ResultWindowItem *addResult(const QString &fileName, int lineNumber, const QString &lineText, - int searchTermStart, int searchTermLength); + void addResult(const QString &fileName, int lineNumber, const QString &lineText, + int searchTermStart, int searchTermLength, const QVariant &userData = QVariant()); private slots: void handleExpandCollapseToolButton(bool checked); - void handleJumpToSearchResult(int index, const QString &fileName, int lineNumber, - int searchTermStart, int searchTermLength); + void handleJumpToSearchResult(int index, bool checked); void handleReplaceButton(); + void setReplaceUIEnabled(bool enabled); private: void readSettings(); void writeSettings(); + QList<SearchResultItem> checkedItems() const; Internal::SearchResultTreeView *m_searchResultTreeView; QListWidget *m_noMatchesFoundDisplay; @@ -123,7 +134,8 @@ private: QToolButton *m_replaceButton; static const bool m_initiallyExpand = false; QStackedWidget *m_widget; - QList<ResultWindowItem *> m_items; + SearchResult *m_currentSearch; + QList<SearchResultItem> m_items; bool m_isShowingReplaceUI; }; diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index c0e7996fefb..480ceb9a8fa 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -91,7 +91,8 @@ void BaseFileFind::findAll(const QString &txt, QTextDocument::FindFlags findFlag if (m_filterCombo) updateComboEntries(m_filterCombo, false); m_watcher.setFuture(QFuture<FileSearchResult>()); - m_resultWindow->clearContents(); + SearchResult *result = m_resultWindow->startNewSearch(); + connect(result, SIGNAL(activated(Find::SearchResultItem)), this, SLOT(openEditor(Find::SearchResultItem))); m_resultWindow->popup(true); if (m_useRegExp) m_watcher.setFuture(Core::Utils::findInFilesRegExp(txt, files(), findFlags, ITextEditor::openedTextEditorsContents())); @@ -109,14 +110,11 @@ void BaseFileFind::findAll(const QString &txt, QTextDocument::FindFlags findFlag void BaseFileFind::displayResult(int index) { Core::Utils::FileSearchResult result = m_watcher.future().resultAt(index); - ResultWindowItem *item = m_resultWindow->addResult(result.fileName, + m_resultWindow->addResult(result.fileName, result.lineNumber, result.matchingLine, result.matchStart, result.matchLength); - if (item) - connect(item, SIGNAL(activated(const QString&,int,int)), this, SLOT(openEditor(const QString&,int,int))); - if (m_resultLabel) m_resultLabel->setText(tr("%1 found").arg(m_resultWindow->numberOfResults())); } @@ -236,7 +234,7 @@ void BaseFileFind::syncRegExpSetting(bool useRegExp) m_useRegExp = useRegExp; } -void BaseFileFind::openEditor(const QString &fileName, int line, int column) +void BaseFileFind::openEditor(const Find::SearchResultItem &item) { - TextEditor::BaseTextEditor::openEditorAt(fileName, line, column); + TextEditor::BaseTextEditor::openEditorAt(item.fileName, item.lineNumber, item.searchTermStart); } diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h index 64c45580c4d..33d9af90b84 100644 --- a/src/plugins/texteditor/basefilefind.h +++ b/src/plugins/texteditor/basefilefind.h @@ -49,6 +49,7 @@ QT_END_NAMESPACE namespace Find { class SearchResultWindow; +struct SearchResultItem; } namespace TextEditor { @@ -76,7 +77,7 @@ protected: private slots: void displayResult(int index); void searchFinished(); - void openEditor(const QString &fileName, int line, int column); + void openEditor(const Find::SearchResultItem &item); void syncRegExpSetting(bool useRegExp); private: -- GitLab