summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpptools/searchsymbols.h1
-rw-r--r--src/plugins/cpptools/symbolsfindfilter.cpp52
-rw-r--r--src/plugins/cpptools/symbolsfindfilter.h14
3 files changed, 54 insertions, 13 deletions
diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h
index 5a2c7ba29c..a93f0b352d 100644
--- a/src/plugins/cpptools/searchsymbols.h
+++ b/src/plugins/cpptools/searchsymbols.h
@@ -184,6 +184,7 @@ private:
} // namespace CppTools
Q_DECLARE_OPERATORS_FOR_FLAGS(CppTools::SearchSymbols::SymbolTypes)
+Q_DECLARE_METATYPE(CppTools::SearchSymbols::SymbolTypes)
Q_DECLARE_METATYPE(CppTools::ModelItemInfo)
#endif // SEARCHSYMBOLS_H
diff --git a/src/plugins/cpptools/symbolsfindfilter.cpp b/src/plugins/cpptools/symbolsfindfilter.cpp
index 8b4b94b98e..e29528ad81 100644
--- a/src/plugins/cpptools/symbolsfindfilter.cpp
+++ b/src/plugins/cpptools/symbolsfindfilter.cpp
@@ -59,22 +59,24 @@ namespace {
const char * const SETTINGS_SEARCHSCOPE = "SearchScope";
void runSearch(QFutureInterface<Find::SearchResultItem> &future,
- QString txt, Find::FindFlags findFlags, CPlusPlus::Snapshot snapshot,
- SearchSymbols::SymbolTypes types, QSet<QString> fileNames)
+ SymbolsFindParameters parameters, CPlusPlus::Snapshot snapshot,
+ QSet<QString> fileNames)
{
future.setProgressRange(0, snapshot.size());
future.setProgressValue(0);
int progress = 0;
SearchSymbols search;
- search.setSymbolsToSearchFor(types);
+ search.setSymbolsToSearchFor(parameters.types);
search.setSeparateScope(true);
CPlusPlus::Snapshot::const_iterator it = snapshot.begin();
- QString findString = (findFlags & Find::FindRegularExpression ? txt : QRegExp::escape(txt));
- if (findFlags & Find::FindWholeWords)
+ QString findString = (parameters.flags & Find::FindRegularExpression
+ ? parameters.text : QRegExp::escape(parameters.text));
+ if (parameters.flags & Find::FindWholeWords)
findString = QString::fromLatin1("\\b%1\\b").arg(findString);
- QRegExp matcher(findString, (findFlags & Find::FindCaseSensitively ? Qt::CaseSensitive : Qt::CaseInsensitive));
+ QRegExp matcher(findString, (parameters.flags & Find::FindCaseSensitively
+ ? Qt::CaseSensitive : Qt::CaseInsensitive));
while (it != snapshot.end() && !future.isCanceled()) {
if (fileNames.isEmpty() || fileNames.contains(it.value()->fileName())) {
QVector<Find::SearchResultItem> resultItems;
@@ -82,7 +84,8 @@ namespace {
foreach (const ModelItemInfo &info, modelInfos) {
int index = matcher.indexIn(info.symbolName);
if (index != -1) {
- QStringList path = info.fullyQualifiedName.mid(0, info.fullyQualifiedName.size() - 1);
+ QStringList path = info.fullyQualifiedName.mid(0,
+ info.fullyQualifiedName.size() - 1);
Find::SearchResultItem item;
item.path = path;
item.text = info.symbolName;
@@ -150,12 +153,28 @@ void SymbolsFindFilter::findAll(const QString &txt, Find::FindFlags findFlags)
{
Find::SearchResultWindow *window = Find::SearchResultWindow::instance();
Find::SearchResult *search = window->startNewSearch(label(), toolTip(findFlags), txt);
- connect(search, SIGNAL(activated(Find::SearchResultItem)), this, SLOT(openEditor(Find::SearchResultItem)));
+ search->setSearchAgainSupported(true);
+ connect(search, SIGNAL(activated(Find::SearchResultItem)),
+ this, SLOT(openEditor(Find::SearchResultItem)));
connect(search, SIGNAL(cancelled()), this, SLOT(cancel()));
+ connect(search, SIGNAL(searchAgainRequested()), this, SLOT(searchAgain()));
+ connect(this, SIGNAL(enabledChanged(bool)), search, SLOT(setSearchAgainEnabled(bool)));
window->popup(true);
+ SymbolsFindParameters parameters;
+ parameters.text = txt;
+ parameters.flags = findFlags;
+ parameters.types = m_symbolsToSearch;
+ parameters.scope = m_scope;
+ search->setUserData(qVariantFromValue(parameters));
+ startSearch(search);
+}
+
+void SymbolsFindFilter::startSearch(Find::SearchResult *search)
+{
+ SymbolsFindParameters parameters = search->userData().value<SymbolsFindParameters>();
QSet<QString> projectFileNames;
- if (m_scope == SymbolsFindFilter::SearchProjectsOnly) {
+ if (parameters.scope == SymbolsFindFilter::SearchProjectsOnly) {
foreach (ProjectExplorer::Project *project,
ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects()) {
projectFileNames += project->files(ProjectExplorer::Project::AllFiles).toSet();
@@ -168,10 +187,9 @@ void SymbolsFindFilter::findAll(const QString &txt, Find::FindFlags findFlags)
this, SLOT(finish()));
connect(watcher, SIGNAL(resultsReadyAt(int,int)),
this, SLOT(addResults(int, int)));
- watcher->setFuture(QtConcurrent::run<Find::SearchResultItem, QString,
- Find::FindFlags, CPlusPlus::Snapshot,
- SearchSymbols::SymbolTypes, QSet<QString> >(runSearch, txt, findFlags, m_manager->snapshot(),
- m_symbolsToSearch, projectFileNames));
+ watcher->setFuture(QtConcurrent::run<Find::SearchResultItem, SymbolsFindParameters,
+ CPlusPlus::Snapshot, QSet<QString> >(runSearch, parameters,
+ m_manager->snapshot(), projectFileNames));
Core::ICore::instance()->progressManager()->addTask(watcher->future(),
tr("Searching"),
Find::Constants::TASK_SEARCH);
@@ -254,6 +272,14 @@ void SymbolsFindFilter::onAllTasksFinished(const QString &type)
}
}
+void SymbolsFindFilter::searchAgain()
+{
+ Find::SearchResult *search = qobject_cast<Find::SearchResult *>(sender());
+ QTC_ASSERT(search, return);
+ search->reset();
+ startSearch(search);
+}
+
QString SymbolsFindFilter::label() const
{
return tr("C++ Symbols:");
diff --git a/src/plugins/cpptools/symbolsfindfilter.h b/src/plugins/cpptools/symbolsfindfilter.h
index 5a8dd43195..b0ddd19e7e 100644
--- a/src/plugins/cpptools/symbolsfindfilter.h
+++ b/src/plugins/cpptools/symbolsfindfilter.h
@@ -89,10 +89,12 @@ private slots:
void cancel();
void onTaskStarted(const QString &type);
void onAllTasksFinished(const QString &type);
+ void searchAgain();
private:
QString label() const;
QString toolTip(Find::FindFlags findFlags) const;
+ void startSearch(Find::SearchResult *search);
CppModelManager *m_manager;
bool m_enabled;
@@ -102,6 +104,15 @@ private:
SearchScope m_scope;
};
+class SymbolsFindParameters
+{
+public:
+ QString text;
+ Find::FindFlags flags;
+ SearchSymbols::SymbolTypes types;
+ SymbolsFindFilter::SearchScope scope;
+};
+
class SymbolsFindFilterConfigWidget : public QWidget
{
Q_OBJECT
@@ -128,4 +139,7 @@ private:
} // Internal
} // CppTools
+Q_DECLARE_METATYPE(CppTools::Internal::SymbolsFindFilter::SearchScope)
+Q_DECLARE_METATYPE(CppTools::Internal::SymbolsFindParameters)
+
#endif // SYMBOLSFINDFILTER_H