From 8234858b468ea9a44b90e28adec668d23907457a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com>
Date: Wed, 15 Jul 2009 11:20:24 +0200
Subject: [PATCH] Register C++ header and source file icons by mime type

Makes sure that all files recognized by the CppEditorFactory get the
proper icon.
---
 src/plugins/coreplugin/fileiconprovider.cpp | 19 ++++++++--
 src/plugins/coreplugin/fileiconprovider.h   |  6 ++-
 src/plugins/cppeditor/cppplugin.cpp         | 42 +++++++--------------
 src/plugins/cppeditor/cppplugin.h           |  3 --
 4 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/src/plugins/coreplugin/fileiconprovider.cpp b/src/plugins/coreplugin/fileiconprovider.cpp
index 04f5e9589d7..a52bc8ec78d 100644
--- a/src/plugins/coreplugin/fileiconprovider.cpp
+++ b/src/plugins/coreplugin/fileiconprovider.cpp
@@ -28,6 +28,8 @@
 **************************************************************************/
 
 #include "fileiconprovider.h"
+#include "mimedatabase.h"
+
 #include <QtGui/QApplication>
 #include <QtGui/QStyle>
 #include <QtGui/QPainter>
@@ -88,7 +90,9 @@ QIcon FileIconProvider::icon(const QFileInfo &fileInfo)
     return icon;
 }
 
-// Creates a pixmap with baseicon at size and overlayous overlayIcon over it.
+/*!
+  Creates a pixmap with baseicon at size and overlays overlayIcon over it.
+  */
 QPixmap FileIconProvider::overlayIcon(QStyle::StandardPixmap baseIcon, const QIcon &overlayIcon, const QSize &size) const
 {
     QPixmap iconPixmap = qApp->style()->standardIcon(baseIcon).pixmap(size);
@@ -99,7 +103,7 @@ QPixmap FileIconProvider::overlayIcon(QStyle::StandardPixmap baseIcon, const QIc
 }
 
 /*!
-  Registers an icon for a given suffix, overlaying the system file icon
+  Registers an icon for a given suffix, overlaying the system file icon.
   */
 void FileIconProvider::registerIconOverlayForSuffix(const QIcon &icon, const QString &suffix)
 {
@@ -117,13 +121,22 @@ void FileIconProvider::registerIconOverlayForSuffix(const QIcon &icon, const QSt
     m_cache.append(newEntry);
 }
 
+/*!
+  Registers an icon for all the suffixes of a given mime type, overlaying the system file icon.
+  */
+void FileIconProvider::registerIconOverlayForMimeType(const QIcon &icon, const MimeType &mimeType)
+{
+    foreach (const QString &suffix, mimeType.suffixes())
+        registerIconOverlayForSuffix(icon, suffix);
+}
+
 /*!
   Returns an icon for the given suffix, or an empty one if none registered.
   */
 QIcon FileIconProvider::iconForSuffix(const QString &suffix) const
 {
     QIcon icon;
-#if defined(Q_WS_WIN) || defined(Q_WS_MAC) // On windows we use the file system icons
+#if defined(Q_WS_WIN) || defined(Q_WS_MAC) // On Windows and Mac we use the file system icons
     Q_UNUSED(suffix)
 #else
     if (suffix.isEmpty())
diff --git a/src/plugins/coreplugin/fileiconprovider.h b/src/plugins/coreplugin/fileiconprovider.h
index 8d8bb7d1f0d..9ee5ed9c615 100644
--- a/src/plugins/coreplugin/fileiconprovider.h
+++ b/src/plugins/coreplugin/fileiconprovider.h
@@ -40,13 +40,17 @@
 
 namespace Core {
 
-class CORE_EXPORT FileIconProvider {
+class MimeType;
+
+class CORE_EXPORT FileIconProvider
+{
 public:
     ~FileIconProvider(); // used to clear the cache
     QIcon icon(const QFileInfo &fileInfo);
 
     QPixmap overlayIcon(QStyle::StandardPixmap baseIcon, const QIcon &overlayIcon, const QSize &size) const;
     void registerIconOverlayForSuffix(const QIcon &icon, const QString &suffix);
+    void registerIconOverlayForMimeType(const QIcon &icon, const MimeType &mimeType);
 
     static FileIconProvider *instance();
 
diff --git a/src/plugins/cppeditor/cppplugin.cpp b/src/plugins/cppeditor/cppplugin.cpp
index b97918b2fc5..b1ee04b131e 100644
--- a/src/plugins/cppeditor/cppplugin.cpp
+++ b/src/plugins/cppeditor/cppplugin.cpp
@@ -65,29 +65,19 @@ CppEditorFactory::CppEditorFactory(CppPlugin *owner) :
     m_owner(owner)
 {
     m_mimeTypes << QLatin1String(CppEditor::Constants::C_SOURCE_MIMETYPE)
-        << QLatin1String(CppEditor::Constants::C_HEADER_MIMETYPE)
-        << QLatin1String(CppEditor::Constants::CPP_SOURCE_MIMETYPE)
-        << QLatin1String(CppEditor::Constants::CPP_HEADER_MIMETYPE);
-    Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance();
+            << QLatin1String(CppEditor::Constants::C_HEADER_MIMETYPE)
+            << QLatin1String(CppEditor::Constants::CPP_SOURCE_MIMETYPE)
+            << QLatin1String(CppEditor::Constants::CPP_HEADER_MIMETYPE);
+
 #ifndef Q_WS_MAC
-    // ### It would be really cool if we could get the stuff from the XML file here and not play "catch up" all the time.
-    QIcon cppIcon(":/cppeditor/images/qt_cpp.png");
-    iconProvider->registerIconOverlayForSuffix(cppIcon, QLatin1String("cpp"));
-    iconProvider->registerIconOverlayForSuffix(cppIcon, QLatin1String("cp"));
-    iconProvider->registerIconOverlayForSuffix(cppIcon, QLatin1String("cc"));
-    iconProvider->registerIconOverlayForSuffix(cppIcon, QLatin1String("cxx"));
-    iconProvider->registerIconOverlayForSuffix(cppIcon, QLatin1String("C"));
-    iconProvider->registerIconOverlayForSuffix(cppIcon, QLatin1String("c++"));
-    iconProvider->registerIconOverlayForSuffix(QIcon(":/cppeditor/images/qt_c.png"),
-                                        QLatin1String("c"));
-    QIcon headerIcon(":/cppeditor/images/qt_h.png");
-    iconProvider->registerIconOverlayForSuffix(headerIcon, QLatin1String("hpp"));
-    iconProvider->registerIconOverlayForSuffix(headerIcon, QLatin1String("hh"));
-    iconProvider->registerIconOverlayForSuffix(headerIcon, QLatin1String("h"));
-    iconProvider->registerIconOverlayForSuffix(headerIcon, QLatin1String("hxx"));
-    iconProvider->registerIconOverlayForSuffix(headerIcon, QLatin1String("H"));
-    iconProvider->registerIconOverlayForSuffix(headerIcon, QLatin1String("hp"));
-    iconProvider->registerIconOverlayForSuffix(headerIcon, QLatin1String("h++"));
+    Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance();
+    Core::MimeDatabase *mimeDatabase = Core::ICore::instance()->mimeDatabase();
+    iconProvider->registerIconOverlayForMimeType(QIcon(":/cppeditor/images/qt_cpp.png"),
+                                                 mimeDatabase->findByType(QLatin1String(CppEditor::Constants::CPP_SOURCE_MIMETYPE)));
+    iconProvider->registerIconOverlayForMimeType(QIcon(":/cppeditor/images/qt_c.png"),
+                                                 mimeDatabase->findByType(QLatin1String(CppEditor::Constants::C_SOURCE_MIMETYPE)));
+    iconProvider->registerIconOverlayForMimeType(QIcon(":/cppeditor/images/qt_h.png"),
+                                                 mimeDatabase->findByType(QLatin1String(CppEditor::Constants::CPP_HEADER_MIMETYPE)));
 #endif
 }
 
@@ -122,7 +112,6 @@ CppPlugin *CppPlugin::m_instance = 0;
 
 CppPlugin::CppPlugin() :
     m_actionHandler(0),
-    m_factory(0),
     m_sortedMethodOverview(false)
 {
     m_instance = this;
@@ -130,8 +119,6 @@ CppPlugin::CppPlugin() :
 
 CppPlugin::~CppPlugin()
 {
-    removeObject(m_factory);
-    delete m_factory;
     delete m_actionHandler;
     m_instance = 0;
 }
@@ -174,12 +161,11 @@ bool CppPlugin::sortedMethodOverview() const
 bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage)
 {
     Core::ICore *core = Core::ICore::instance();
+
     if (!core->mimeDatabase()->addMimeTypes(QLatin1String(":/cppeditor/CppEditor.mimetypes.xml"), errorMessage))
         return false;
 
-    m_factory = new CppEditorFactory(this);
-    addObject(m_factory);
-
+    addAutoReleasedObject(new CppEditorFactory(this));
     addAutoReleasedObject(new CppHoverHandler);
 
     CppFileWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard);
diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h
index ce4f0d08990..9e5cc9eeade 100644
--- a/src/plugins/cppeditor/cppplugin.h
+++ b/src/plugins/cppeditor/cppplugin.h
@@ -44,7 +44,6 @@ namespace CppEditor {
 namespace Internal {
 
 class CPPEditor;
-class CppEditorFactory;
 
 class CppPlugin : public ExtensionSystem::IPlugin
 {
@@ -76,7 +75,6 @@ private slots:
     void jumpToDefinition();
 
 private:
-    friend class CppEditorFactory;
     Core::IEditor *createEditor(QWidget *parent);
     void writeSettings();
     void readSettings();
@@ -84,7 +82,6 @@ private:
     static CppPlugin *m_instance;
 
     TextEditor::TextEditorActionHandler *m_actionHandler;
-    CppEditorFactory *m_factory;
     bool m_sortedMethodOverview;
 };
 
-- 
GitLab