From 9b19a9c8e2142c60f5c43788fe58cd6e24656ff7 Mon Sep 17 00:00:00 2001
From: Nicolas Arnaud-Cormos <nicolas@kdab.com>
Date: Wed, 28 Dec 2011 11:15:23 +0100
Subject: [PATCH] Analyzer: refactor global and project tool settings usage.

IAnalyzerTool has now 2 new virtual methods used to create the global and per-project settings.
No need to create any static factory method and pass a pointer to them to the AnalyzerGlobalSettings
instance anymore.

The Valgrind plugin is now using it, the memchecktool creates the settings for all
valgrind tools.

Change-Id: I3c5845ceb7151130032cfff4ab5b7b36ca2459d9
Reviewed-by: hjk <qthjk@ovi.com>
---
 src/plugins/analyzerbase/analyzermanager.cpp  |  7 +++++
 src/plugins/analyzerbase/analyzermanager.h    |  1 +
 src/plugins/analyzerbase/analyzersettings.cpp | 29 +++++++++----------
 src/plugins/analyzerbase/analyzersettings.h   |  8 ++---
 src/plugins/analyzerbase/ianalyzertool.cpp    | 10 +++++++
 src/plugins/analyzerbase/ianalyzertool.h      |  7 +++++
 src/plugins/valgrind/memchecktool.cpp         | 12 +++++++-
 src/plugins/valgrind/memchecktool.h           |  4 +++
 src/plugins/valgrind/valgrindplugin.cpp       | 13 ---------
 9 files changed, 56 insertions(+), 35 deletions(-)

diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp
index e57110177dd..a994fd2f065 100644
--- a/src/plugins/analyzerbase/analyzermanager.cpp
+++ b/src/plugins/analyzerbase/analyzermanager.cpp
@@ -41,6 +41,7 @@
 #include "analyzerstartparameters.h"
 #include "analyzerutils.h"
 #include "ianalyzertool.h"
+#include "analyzersettings.h"
 
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/findplaceholder.h>
@@ -809,6 +810,7 @@ void AnalyzerManager::shutdown()
 void AnalyzerManager::addTool(IAnalyzerTool *tool, const StartModes &modes)
 {
     m_instance->d->addTool(tool, modes);
+    AnalyzerGlobalSettings::instance()->registerTool(tool);
 }
 
 QDockWidget *AnalyzerManager::createDockWidget(IAnalyzerTool *tool, const QString &title,
@@ -829,6 +831,11 @@ IAnalyzerTool *AnalyzerManager::currentSelectedTool()
     return m_instance->d->m_currentTool;
 }
 
+QList<IAnalyzerTool *> AnalyzerManager::tools()
+{
+    return m_instance->d->m_tools;
+}
+
 void AnalyzerManager::selectTool(IAnalyzerTool *tool, StartMode mode)
 {
     m_instance->d->selectTool(tool, mode);
diff --git a/src/plugins/analyzerbase/analyzermanager.h b/src/plugins/analyzerbase/analyzermanager.h
index 5883304bcd6..a7453568e63 100644
--- a/src/plugins/analyzerbase/analyzermanager.h
+++ b/src/plugins/analyzerbase/analyzermanager.h
@@ -82,6 +82,7 @@ public:
 
     static void showMode();
     static IAnalyzerTool *currentSelectedTool();
+    static QList<IAnalyzerTool *> tools();
     static void selectTool(IAnalyzerTool *tool, StartMode mode);
     static void startTool(IAnalyzerTool *tool, StartMode mode);
     static void stopTool();
diff --git a/src/plugins/analyzerbase/analyzersettings.cpp b/src/plugins/analyzerbase/analyzersettings.cpp
index d32ee4fd270..e9cb39ee041 100644
--- a/src/plugins/analyzerbase/analyzersettings.cpp
+++ b/src/plugins/analyzerbase/analyzersettings.cpp
@@ -95,6 +95,7 @@ QVariantMap AnalyzerSettings::toMap(const QList<AbstractAnalyzerSubConfig *> &su
     return map;
 }
 
+
 AnalyzerGlobalSettings::AnalyzerGlobalSettings(QObject *parent)
 : AnalyzerSettings(parent)
 {
@@ -143,30 +144,26 @@ void AnalyzerGlobalSettings::writeSettings() const
     settings->endGroup();
 }
 
-void AnalyzerGlobalSettings::registerSubConfigs
-    (AnalyzerSubConfigFactory globalCreator, AnalyzerSubConfigFactory projectCreator)
+void AnalyzerGlobalSettings::registerTool(IAnalyzerTool *tool)
 {
-    m_projectSubConfigFactories.append(projectCreator);
-
-    AbstractAnalyzerSubConfig *config = globalCreator();
-    m_subConfigs.append(config);
-    AnalyzerPlugin::instance()->addAutoReleasedObject(new AnalyzerOptionsPage(config));
-
-    readSettings();
+    AbstractAnalyzerSubConfig *config = tool->createGlobalSettings();
+    if (config) {
+        m_subConfigs.append(config);
+        AnalyzerPlugin::instance()->addAutoReleasedObject(new AnalyzerOptionsPage(config));
+        readSettings();
+    }
 }
 
-QList<AnalyzerSubConfigFactory> AnalyzerGlobalSettings::projectSubConfigFactories() const
-{
-    return m_projectSubConfigFactories;
-}
 
 AnalyzerProjectSettings::AnalyzerProjectSettings(QObject *parent)
     : AnalyzerSettings(parent), m_useGlobalSettings(true)
 {
+    QList<IAnalyzerTool*> tools = AnalyzerManager::tools();
     // add sub configs
-    foreach (AnalyzerSubConfigFactory factory, AnalyzerGlobalSettings::instance()->projectSubConfigFactories()) {
-        AbstractAnalyzerSubConfig *config = factory();
-        m_customConfigurations.append(config);
+    foreach (IAnalyzerTool *tool, tools) {
+        AbstractAnalyzerSubConfig *config = tool->createProjectSettings();
+        if (config)
+            m_customConfigurations.append(config);
     }
 
     m_subConfigs = AnalyzerGlobalSettings::instance()->subConfigs();
diff --git a/src/plugins/analyzerbase/analyzersettings.h b/src/plugins/analyzerbase/analyzersettings.h
index 8d462ac9ddf..baedfe5c0d7 100644
--- a/src/plugins/analyzerbase/analyzersettings.h
+++ b/src/plugins/analyzerbase/analyzersettings.h
@@ -44,6 +44,8 @@
 
 namespace Analyzer {
 
+class IAnalyzerTool;
+
 /**
  * Utility function to set @p val if @p key is present in @p map.
  */
@@ -121,8 +123,6 @@ protected:
 };
 
 
-typedef AbstractAnalyzerSubConfig *(*AnalyzerSubConfigFactory)();
-
 // global and local settings are loaded and saved differently, and they also handle suppressions
 // differently.
 /**
@@ -144,13 +144,11 @@ public:
     void writeSettings() const;
     void readSettings();
 
-    void registerSubConfigs(AnalyzerSubConfigFactory globalFactory, AnalyzerSubConfigFactory projectFactory);
-    QList<AnalyzerSubConfigFactory> projectSubConfigFactories() const;
+    void registerTool(IAnalyzerTool *tool);
 
 private:
     AnalyzerGlobalSettings(QObject *parent);
     static AnalyzerGlobalSettings *m_instance;
-    QList<AnalyzerSubConfigFactory> m_projectSubConfigFactories;
 };
 
 /**
diff --git a/src/plugins/analyzerbase/ianalyzertool.cpp b/src/plugins/analyzerbase/ianalyzertool.cpp
index 7818a071462..722defcea5d 100644
--- a/src/plugins/analyzerbase/ianalyzertool.cpp
+++ b/src/plugins/analyzerbase/ianalyzertool.cpp
@@ -70,4 +70,14 @@ QString IAnalyzerTool::defaultActionName(const IAnalyzerTool *tool, StartMode mo
     return base;
 }
 
+AbstractAnalyzerSubConfig *IAnalyzerTool::createGlobalSettings()
+{
+    return 0;
+}
+
+AbstractAnalyzerSubConfig *IAnalyzerTool::createProjectSettings()
+{
+    return 0;
+}
+
 } // namespace Analyzer
diff --git a/src/plugins/analyzerbase/ianalyzertool.h b/src/plugins/analyzerbase/ianalyzertool.h
index 8ceafae63ed..5f696546081 100644
--- a/src/plugins/analyzerbase/ianalyzertool.h
+++ b/src/plugins/analyzerbase/ianalyzertool.h
@@ -51,6 +51,7 @@ namespace Analyzer {
 
 class IAnalyzerOutputPaneAdapter;
 class IAnalyzerEngine;
+class AbstractAnalyzerSubConfig;
 
 
 /**
@@ -137,6 +138,12 @@ public:
 
     /// Called when tools gets deselected.
     virtual void toolDeselected() const {}
+
+    /// Factory method to create the global tool setting
+    virtual AbstractAnalyzerSubConfig *createGlobalSettings();
+
+    /// Factory method to create the project tool setting
+    virtual AbstractAnalyzerSubConfig *createProjectSettings();
 };
 
 } // namespace Analyzer
diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp
index ecd4082601a..437d4b979f8 100644
--- a/src/plugins/valgrind/memchecktool.cpp
+++ b/src/plugins/valgrind/memchecktool.cpp
@@ -298,7 +298,17 @@ QString MemcheckTool::displayName() const
 QString MemcheckTool::description() const
 {
     return tr("Valgrind Analyze Memory uses the \"memcheck\" tool to find "
-        "memory leaks");
+              "memory leaks");
+}
+
+AbstractAnalyzerSubConfig *MemcheckTool::createGlobalSettings()
+{
+    return new ValgrindGlobalSettings();
+}
+
+AbstractAnalyzerSubConfig *MemcheckTool::createProjectSettings()
+{
+    return new ValgrindProjectSettings();
 }
 
 IAnalyzerTool::ToolMode MemcheckTool::toolMode() const
diff --git a/src/plugins/valgrind/memchecktool.h b/src/plugins/valgrind/memchecktool.h
index f5c1d3f48b4..1dcba3a3456 100644
--- a/src/plugins/valgrind/memchecktool.h
+++ b/src/plugins/valgrind/memchecktool.h
@@ -97,6 +97,10 @@ public:
     QString displayName() const;
     QString description() const;
 
+    // Create the valgrind settings (for all valgrind tools)
+    Analyzer::AbstractAnalyzerSubConfig *createGlobalSettings();
+    Analyzer::AbstractAnalyzerSubConfig *createProjectSettings();
+
 private slots:
     void settingsDestroyed(QObject *settings);
     void maybeActiveRunConfigurationChanged();
diff --git a/src/plugins/valgrind/valgrindplugin.cpp b/src/plugins/valgrind/valgrindplugin.cpp
index b083510412f..5f4f97c0c53 100644
--- a/src/plugins/valgrind/valgrindplugin.cpp
+++ b/src/plugins/valgrind/valgrindplugin.cpp
@@ -36,7 +36,6 @@
 
 #include "callgrindtool.h"
 #include "memchecktool.h"
-#include "valgrindsettings.h"
 
 #include <analyzerbase/analyzerconstants.h>
 #include <analyzerbase/analyzermanager.h>
@@ -96,20 +95,8 @@ void ValgrindPlugin::startValgrindTool(IAnalyzerTool *tool, StartMode mode)
         startRemoteTool(tool);
 }
 
-static AbstractAnalyzerSubConfig *globalValgrindFactory()
-{
-    return new ValgrindGlobalSettings();
-}
-
-static AbstractAnalyzerSubConfig *projectValgrindFactory()
-{
-    return new ValgrindProjectSettings();
-}
-
 bool ValgrindPlugin::initialize(const QStringList &, QString *)
 {
-    AnalyzerGlobalSettings::instance()->registerSubConfigs(&globalValgrindFactory, &projectValgrindFactory);
-
     StartModes modes;
 #ifndef Q_OS_WIN
     modes.append(StartMode(StartLocal));
-- 
GitLab