From b5d6bf73d6d4bfc132a33dd00766e426d42ec6dd Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 5 Oct 2009 13:43:05 +0200
Subject: [PATCH] Ensure the user can stop a semantic search and added a method
 to get a pointer to the ModelManagerInterface.

---
 src/plugins/cpptools/cppfindreferences.cpp      | 6 ++++++
 src/plugins/cpptools/cppmodelmanager.cpp        | 9 +++++++++
 src/plugins/cpptools/cppmodelmanagerinterface.h | 2 ++
 src/plugins/cpptools/cppsemanticsearch.cpp      | 6 ++++++
 4 files changed, 23 insertions(+)

diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index fcbce895bf5..a55a9e95eb1 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -466,6 +466,12 @@ static void find_helper(QFutureInterface<Utils::FileSearchResult> &future,
     future.setProgressRange(0, files.size());
 
     for (int i = 0; i < files.size(); ++i) {
+        if (future.isPaused())
+            future.waitForResume();
+
+        if (future.isCanceled())
+            break;
+
         const QString &fileName = files.at(i);
         future.setProgressValueAndText(i, QFileInfo(fileName).fileName());
 
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 8aa6bdf7672..4d5f0bd2c4d 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -56,6 +56,8 @@
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/progressmanager/progressmanager.h>
 
+#include <extensionsystem/pluginmanager.h>
+
 #include <utils/qtcassert.h>
 
 #include <TranslationUnit.h>
@@ -588,6 +590,13 @@ Document::Ptr CppPreprocessor::switchDocument(Document::Ptr doc)
 }
 
 
+CppTools::CppModelManagerInterface *CppTools::CppModelManagerInterface::instance()
+{
+    ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
+    return pluginManager->getObject<CppTools::CppModelManagerInterface>();
+
+}
+
 
 /*!
     \class CppTools::CppModelManager
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h
index 0a2ba32e380..4bb7a109cb4 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -81,6 +81,8 @@ public:
     CppModelManagerInterface(QObject *parent = 0) : QObject(parent) {}
     virtual ~CppModelManagerInterface() {}
 
+    static CppModelManagerInterface *instance();
+
     virtual void GC() = 0;
     virtual void updateSourceFiles(const QStringList &sourceFiles) = 0;
 
diff --git a/src/plugins/cpptools/cppsemanticsearch.cpp b/src/plugins/cpptools/cppsemanticsearch.cpp
index 9d35f7aed48..bc8510625bb 100644
--- a/src/plugins/cpptools/cppsemanticsearch.cpp
+++ b/src/plugins/cpptools/cppsemanticsearch.cpp
@@ -272,6 +272,12 @@ static void semanticSearch_helper(QFutureInterface<Utils::FileSearchResult> &fut
 
     int progress = 0;
     foreach (Document::Ptr doc, snapshot) {
+        if (future.isPaused())
+            future.waitForResume();
+
+        if (future.isCanceled())
+            break;
+
         const QString fileName = doc->fileName();
 
         QByteArray source;
-- 
GitLab