From 5740bd641063c3adb19783125d3931046dfd1213 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 29 Apr 2009 09:04:59 +0200
Subject: [PATCH] Made cpp file suffixes take effect after restart.

In CppTools, keep cpp file settings in plugin and settings page
via shared pointer and apply to mime DB in
extensionsInitialized() (after CppEditor has loaded
and registered the mime types).

Task-number: 252299
---
 src/plugins/cpptools/cppfilesettingspage.cpp | 24 ++++++++++----------
 src/plugins/cpptools/cppfilesettingspage.h   |  9 +++++---
 src/plugins/cpptools/cpptoolsplugin.cpp      | 13 ++++++++---
 src/plugins/cpptools/cpptoolsplugin.h        |  5 +++-
 4 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp
index cdebf13a7c5..12fe50fcb0a 100644
--- a/src/plugins/cpptools/cppfilesettingspage.cpp
+++ b/src/plugins/cpptools/cppfilesettingspage.cpp
@@ -69,11 +69,11 @@ void CppFileSettings::fromSettings(QSettings *s)
     s->endGroup();
 }
 
-void CppFileSettings::applySuffixesToMimeDB()
+bool CppFileSettings::applySuffixesToMimeDB()
 {
     Core::MimeDatabase *mdb = Core::ICore::instance()->mimeDatabase();
-    mdb->setPreferredSuffix(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE), sourceSuffix);
-    mdb->setPreferredSuffix(QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE), headerSuffix);
+    return mdb->setPreferredSuffix(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE), sourceSuffix)
+            && mdb->setPreferredSuffix(QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE), headerSuffix);
 }
 
 bool CppFileSettings::equals(const CppFileSettings &rhs) const
@@ -129,11 +129,11 @@ void CppFileSettingsWidget::setSettings(const CppFileSettings &s)
 }
 
 // --------------- CppFileSettingsPage
-CppFileSettingsPage::CppFileSettingsPage(QObject *parent) :
-    Core::IOptionsPage(parent)
+CppFileSettingsPage::CppFileSettingsPage(QSharedPointer<CppFileSettings> &settings,
+                                         QObject *parent) :
+    Core::IOptionsPage(parent),
+    m_settings(settings)
 {
-    m_settings.fromSettings(Core::ICore::instance()->settings());
-    m_settings.applySuffixesToMimeDB();
 }
 
 CppFileSettingsPage::~CppFileSettingsPage()
@@ -164,7 +164,7 @@ QWidget *CppFileSettingsPage::createPage(QWidget *parent)
 {
 
     m_widget = new CppFileSettingsWidget(parent);
-    m_widget->setSettings(m_settings);
+    m_widget->setSettings(*m_settings);
     return m_widget;
 }
 
@@ -172,10 +172,10 @@ void CppFileSettingsPage::apply()
 {
     if (m_widget) {
         const CppFileSettings newSettings = m_widget->settings();
-        if (newSettings != m_settings) {
-            m_settings = newSettings;
-            m_settings.toSettings(Core::ICore::instance()->settings());
-            m_settings.applySuffixesToMimeDB();
+        if (newSettings != *m_settings) {
+            *m_settings = newSettings;
+            m_settings->toSettings(Core::ICore::instance()->settings());
+            m_settings->applySuffixesToMimeDB();
         }
     }
 }
diff --git a/src/plugins/cpptools/cppfilesettingspage.h b/src/plugins/cpptools/cppfilesettingspage.h
index 53abb7788a5..94e0a103e40 100644
--- a/src/plugins/cpptools/cppfilesettingspage.h
+++ b/src/plugins/cpptools/cppfilesettingspage.h
@@ -32,6 +32,7 @@
 
 #include <coreplugin/dialogs/ioptionspage.h>
 #include <QtCore/QPointer>
+#include <QtCore/QSharedPointer>
 #include <QtGui/QWidget>
 
 QT_BEGIN_NAMESPACE
@@ -53,7 +54,7 @@ struct CppFileSettings {
 
     void toSettings(QSettings *) const;
     void fromSettings(QSettings *);
-    void applySuffixesToMimeDB();
+    bool applySuffixesToMimeDB();
 
     bool equals(const CppFileSettings &rhs) const;
 };
@@ -76,8 +77,10 @@ private:
 
 class CppFileSettingsPage : public Core::IOptionsPage
 {
+    Q_DISABLE_COPY(CppFileSettingsPage)
 public:
-    explicit CppFileSettingsPage(QObject *parent = 0);
+    explicit CppFileSettingsPage(QSharedPointer<CppFileSettings> &settings,
+                                 QObject *parent = 0);
     virtual ~CppFileSettingsPage();
 
     virtual QString id() const;
@@ -90,8 +93,8 @@ public:
     virtual void finish() { }
 
 private:
+    const QSharedPointer<CppFileSettings> m_settings;
     QPointer<CppFileSettingsWidget> m_widget;
-    CppFileSettings m_settings;
 };
 
 } // namespace Internal
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 301935530da..cdfda4c24bd 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -61,8 +61,10 @@ enum { debug = 0 };
 
 CppToolsPlugin *CppToolsPlugin::m_instance = 0;
 
-CppToolsPlugin::CppToolsPlugin()
-    : m_context(-1), m_modelManager(0)
+CppToolsPlugin::CppToolsPlugin() :
+    m_context(-1),
+    m_modelManager(0),
+    m_fileSettings(new CppFileSettings)
 {
     m_instance = this;
 }
@@ -91,7 +93,7 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error)
     addAutoReleasedObject(new CppClassesFilter(m_modelManager, core->editorManager()));
     addAutoReleasedObject(new CppFunctionsFilter(m_modelManager, core->editorManager()));
     addAutoReleasedObject(new CompletionSettingsPage(m_completion));
-    addAutoReleasedObject(new CppFileSettingsPage);
+    addAutoReleasedObject(new CppFileSettingsPage(m_fileSettings));
 
     // Menus
     Core::ActionContainer *mtools = am->actionContainer(Core::Constants::M_TOOLS);
@@ -127,6 +129,11 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error)
 
 void CppToolsPlugin::extensionsInitialized()
 {
+    // The Cpp editor plugin, which is loaded later on, registers the Cpp mime types,
+    // so, apply settings here
+    m_fileSettings->fromSettings(Core::ICore::instance()->settings());
+    if (!m_fileSettings->applySuffixesToMimeDB())
+        qWarning("Unable to apply cpp suffixes to mime database (cpp mime types not found).\n");
 }
 
 void CppToolsPlugin::shutdown()
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index 40e8d1a62cd..dacc946fe10 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -32,6 +32,7 @@
 
 #include <extensionsystem/iplugin.h>
 #include <projectexplorer/projectexplorer.h>
+#include <QtCore/QSharedPointer>
 
 QT_BEGIN_NAMESPACE
 class QFileInfo;
@@ -43,11 +44,12 @@ namespace Internal {
 
 class CppCodeCompletion;
 class CppModelManager;
+struct CppFileSettings;
 
 class CppToolsPlugin : public ExtensionSystem::IPlugin
 {
+    Q_DISABLE_COPY(CppToolsPlugin)
     Q_OBJECT
-
 public:
     static CppToolsPlugin *instance() { return m_instance; }
 
@@ -70,6 +72,7 @@ private:
     int m_context;
     CppModelManager *m_modelManager;
     CppCodeCompletion *m_completion;
+    QSharedPointer<CppFileSettings> m_fileSettings;
 
     static CppToolsPlugin *m_instance;
 };
-- 
GitLab