diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 1457d52b968..8a99a4b2fde 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -35,6 +35,7 @@ #include "mimedatabase.h" #include "modemanager.h" #include "infobar.h" +#include "iwizardfactory.h" #include #include @@ -60,6 +61,8 @@ CorePlugin::CorePlugin() : m_editMode(0), m_designMode(0) CorePlugin::~CorePlugin() { + IWizardFactory::destroyFeatureProvider(); + delete m_findPlugin; delete m_locator; diff --git a/src/plugins/coreplugin/featureprovider.h b/src/plugins/coreplugin/featureprovider.h index 5a62a82ac3a..9114cb1a45c 100644 --- a/src/plugins/coreplugin/featureprovider.h +++ b/src/plugins/coreplugin/featureprovider.h @@ -42,10 +42,8 @@ namespace Core { class CORE_EXPORT FeatureSet; -class CORE_EXPORT IFeatureProvider : public QObject +class CORE_EXPORT IFeatureProvider { - Q_OBJECT - public: IFeatureProvider() {} virtual ~IFeatureProvider() {} diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp index 81a071d9f1d..4d7dfd47ab3 100644 --- a/src/plugins/coreplugin/iwizardfactory.cpp +++ b/src/plugins/coreplugin/iwizardfactory.cpp @@ -35,6 +35,7 @@ #include #include +#include #include @@ -145,6 +146,10 @@ using namespace Core; +namespace { +static QList s_providerList; +} + /* A utility to find all wizards supporting a view mode and matching a predicate */ template QList findWizardFactories(Predicate predicate) @@ -201,10 +206,7 @@ bool IWizardFactory::isAvailable(const QString &platformName) const foreach (const QString &n, plugins) availableFeatures |= Feature(Core::Id::fromString(n)); - const QList featureManagers - = ExtensionSystem::PluginManager::getObjects(); - - foreach (const Core::IFeatureProvider *featureManager, featureManagers) + foreach (const Core::IFeatureProvider *featureManager, s_providerList) availableFeatures |= featureManager->availableFeatures(platformName); return availableFeatures.contains(requiredFeatures()); @@ -226,10 +228,7 @@ QStringList IWizardFactory::allAvailablePlatforms() { QStringList platforms; - const QList featureManagers = - ExtensionSystem::PluginManager::getObjects(); - - foreach (const Core::IFeatureProvider *featureManager, featureManagers) + foreach (const Core::IFeatureProvider *featureManager, s_providerList) platforms.append(featureManager->availablePlatforms()); return platforms; @@ -237,13 +236,22 @@ QStringList IWizardFactory::allAvailablePlatforms() QString IWizardFactory::displayNameForPlatform(const QString &string) { - const QList featureManagers = - ExtensionSystem::PluginManager::getObjects(); - - foreach (const Core::IFeatureProvider *featureManager, featureManagers) { + foreach (const Core::IFeatureProvider *featureManager, s_providerList) { QString displayName = featureManager->displayNameForPlatform(string); if (!displayName.isEmpty()) return displayName; } return QString(); } + +void IWizardFactory::registerFeatureProvider(IFeatureProvider *provider) +{ + QTC_ASSERT(!s_providerList.contains(provider), return); + s_providerList.append(provider); +} + +void IWizardFactory::destroyFeatureProvider() +{ + qDeleteAll(s_providerList); + s_providerList.clear(); +} diff --git a/src/plugins/coreplugin/iwizardfactory.h b/src/plugins/coreplugin/iwizardfactory.h index 9269e9f9705..361aaec2d81 100644 --- a/src/plugins/coreplugin/iwizardfactory.h +++ b/src/plugins/coreplugin/iwizardfactory.h @@ -40,6 +40,8 @@ namespace Core { +namespace Internal { class CorePlugin; } + class CORE_EXPORT IWizardFactory : public QObject { @@ -94,7 +96,11 @@ public: static QStringList allAvailablePlatforms(); static QString displayNameForPlatform(const QString &string); + static void registerFeatureProvider(IFeatureProvider *provider); + private: + static void destroyFeatureProvider(); + IWizardFactory::WizardKind m_kind; QIcon m_icon; QString m_description; @@ -105,6 +111,8 @@ private: FeatureSet m_requiredFeatures; WizardFlags m_flags; QString m_descriptionImage; + + friend class Internal::CorePlugin; }; } // namespace Core diff --git a/src/plugins/projectexplorer/kitfeatureprovider.h b/src/plugins/projectexplorer/kitfeatureprovider.h index 4bb3adadcc3..788ddedcfab 100644 --- a/src/plugins/projectexplorer/kitfeatureprovider.h +++ b/src/plugins/projectexplorer/kitfeatureprovider.h @@ -38,11 +38,6 @@ namespace Internal { class KitFeatureProvider : public Core::IFeatureProvider { - Q_OBJECT - -public: - - // IFeatureProvider interface public: Core::FeatureSet availableFeatures(const QString &platform) const; QStringList availablePlatforms() const; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index fd11f88598e..5ce433f1fdf 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -389,7 +389,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er d->m_kitManager = new KitManager; // register before ToolChainManager d->m_toolChainManager = new ToolChainManager; - addAutoReleasedObject(new Internal::KitFeatureProvider); + Core::IWizardFactory::registerFeatureProvider(new Internal::KitFeatureProvider); // Register KitInformation: KitManager::registerKitInformation(new DeviceTypeKitInformation);