From 68c49a65e903c0b0cdda3322c843338cdf6f9900 Mon Sep 17 00:00:00 2001 From: Lasse Holmstedt Date: Fri, 12 Mar 2010 16:02:23 +0100 Subject: [PATCH] Plugin manager for enabling/disabling plugins Go to About Plugins and enable/disable plugins from there. Reviewed-by: mae --- src/app/main.cpp | 1 - src/libs/extensionsystem/extensionsystem.pro | 6 +- src/libs/extensionsystem/images/notloaded.png | Bin 0 -> 180 bytes src/libs/extensionsystem/optionsparser.cpp | 3 +- src/libs/extensionsystem/plugincollection.cpp | 37 +++ src/libs/extensionsystem/plugincollection.h | 31 +++ .../extensionsystem/plugindetailsview.cpp | 4 + src/libs/extensionsystem/plugindetailsview.ui | 41 ++- src/libs/extensionsystem/pluginmanager.cpp | 88 +++++- src/libs/extensionsystem/pluginmanager.h | 7 +- src/libs/extensionsystem/pluginmanager_p.h | 7 + src/libs/extensionsystem/pluginspec.cpp | 82 +++++- src/libs/extensionsystem/pluginspec.h | 14 + src/libs/extensionsystem/pluginspec_p.h | 4 + src/libs/extensionsystem/pluginview.cpp | 263 +++++++++++++++--- src/libs/extensionsystem/pluginview.h | 18 ++ src/libs/extensionsystem/pluginview.qrc | 3 +- src/libs/extensionsystem/pluginview.ui | 43 ++- src/plugins/bineditor/BinEditor.pluginspec | 1 + src/plugins/bookmarks/Bookmarks.pluginspec | 1 + .../CMakeProjectManager.pluginspec | 1 + src/plugins/coreplugin/Core.pluginspec | 1 + src/plugins/coreplugin/plugindialog.cpp | 31 ++- src/plugins/coreplugin/plugindialog.h | 5 + src/plugins/cppeditor/CppEditor.pluginspec | 1 + src/plugins/cpptools/CppTools.pluginspec | 1 + src/plugins/cvs/CVS.pluginspec | 1 + src/plugins/debugger/Debugger.pluginspec | 1 + src/plugins/designer/Designer.pluginspec | 1 + src/plugins/find/Find.pluginspec | 1 + .../GenericProjectManager.pluginspec | 1 + src/plugins/git/ScmGit.pluginspec | 1 + src/plugins/help/Help.pluginspec | 1 + src/plugins/locator/Locator.pluginspec | 1 + src/plugins/mercurial/Mercurial.pluginspec | 1 + src/plugins/perforce/Perforce.pluginspec | 1 + .../ProjectExplorer.pluginspec | 1 + .../qmldesigner/QmlDesigner.pluginspec | 1 + src/plugins/qmldesigner/qmldesignerplugin.cpp | 1 + .../qmlinspector/QmlInspector.pluginspec | 1 + .../qmljseditor/QmlJSEditor.pluginspec | 1 + .../QmlProjectManager.pluginspec | 1 + .../Qt4ProjectManager.pluginspec | 1 + .../resourceeditor/ResourceEditor.pluginspec | 1 + src/plugins/subversion/Subversion.pluginspec | 1 + src/plugins/texteditor/TextEditor.pluginspec | 1 + src/plugins/vcsbase/VCSBase.pluginspec | 1 + src/plugins/welcome/Welcome.pluginspec | 1 + 48 files changed, 639 insertions(+), 77 deletions(-) create mode 100644 src/libs/extensionsystem/images/notloaded.png create mode 100644 src/libs/extensionsystem/plugincollection.cpp create mode 100644 src/libs/extensionsystem/plugincollection.h diff --git a/src/app/main.cpp b/src/app/main.cpp index edfcd51efed..8aaca6ecdec 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -202,7 +202,6 @@ int main(int argc, char **argv) QLatin1String("Nokia"), QLatin1String("QtCreator")); locale = settings.value("General/OverrideLanguage", locale).toString(); - const QString &creatorTrPath = QCoreApplication::applicationDirPath() + QLatin1String(SHARE_PATH "/translations"); if (translator.load(QLatin1String("qtcreator_") + locale, creatorTrPath)) { diff --git a/src/libs/extensionsystem/extensionsystem.pro b/src/libs/extensionsystem/extensionsystem.pro index 9cacadb3306..027139c89ee 100644 --- a/src/libs/extensionsystem/extensionsystem.pro +++ b/src/libs/extensionsystem/extensionsystem.pro @@ -19,14 +19,16 @@ HEADERS += pluginerrorview.h \ pluginspec_p.h \ pluginview.h \ pluginview_p.h \ - optionsparser.h + optionsparser.h \ + plugincollection.h SOURCES += pluginerrorview.cpp \ plugindetailsview.cpp \ iplugin.cpp \ pluginmanager.cpp \ pluginspec.cpp \ pluginview.cpp \ - optionsparser.cpp + optionsparser.cpp \ + plugincollection.cpp FORMS += pluginview.ui \ pluginerrorview.ui \ plugindetailsview.ui diff --git a/src/libs/extensionsystem/images/notloaded.png b/src/libs/extensionsystem/images/notloaded.png new file mode 100644 index 0000000000000000000000000000000000000000..a72883bd40782aed509a88c94a5b964d48dbdbdd GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T47>k44ofy`glX=O&z`&N| z?e4JUl$NKWHW-DKJDxNJ#9F;9y$O%&}XF bn}OlW6wWZ;roKi71_lOCS3j3^P6pluginSpecs.removeAll(spec); - delete spec; + m_pmPrivate->removePluginSpec(spec); m_isDependencyRefreshNeeded = true; } } diff --git a/src/libs/extensionsystem/plugincollection.cpp b/src/libs/extensionsystem/plugincollection.cpp new file mode 100644 index 00000000000..f54ad4bd6db --- /dev/null +++ b/src/libs/extensionsystem/plugincollection.cpp @@ -0,0 +1,37 @@ +#include "plugincollection.h" +#include "pluginspec.h" + +namespace ExtensionSystem { + +PluginCollection::PluginCollection(const QString& name) : + m_name(name) +{ + +} + +PluginCollection::~PluginCollection() +{ + +} + +QString PluginCollection::name() const +{ + return m_name; +} + +void PluginCollection::addPlugin(PluginSpec *spec) +{ + m_plugins.append(spec); +} + +void PluginCollection::removePlugin(PluginSpec *spec) +{ + m_plugins.removeOne(spec); +} + +QList PluginCollection::plugins() const +{ + return m_plugins; +} + +} diff --git a/src/libs/extensionsystem/plugincollection.h b/src/libs/extensionsystem/plugincollection.h new file mode 100644 index 00000000000..4ff59820705 --- /dev/null +++ b/src/libs/extensionsystem/plugincollection.h @@ -0,0 +1,31 @@ +#ifndef PLUGINCOLLECTION_H +#define PLUGINCOLLECTION_H + +#include +#include +#include "extensionsystem_global.h" + + +namespace ExtensionSystem { +class PluginSpec; + +class EXTENSIONSYSTEM_EXPORT PluginCollection +{ + +public: + explicit PluginCollection(const QString& name); + ~PluginCollection(); + + QString name() const; + void addPlugin(PluginSpec *spec); + void removePlugin(PluginSpec *spec); + QList plugins() const; +private: + QString m_name; + QList m_plugins; + +}; + +} + +#endif // PLUGINCOLLECTION_H diff --git a/src/libs/extensionsystem/plugindetailsview.cpp b/src/libs/extensionsystem/plugindetailsview.cpp index 3dcd228ec90..3508b4f167c 100644 --- a/src/libs/extensionsystem/plugindetailsview.cpp +++ b/src/libs/extensionsystem/plugindetailsview.cpp @@ -78,6 +78,10 @@ void PluginDetailsView::update(PluginSpec *spec) m_ui->vendor->setText(spec->vendor()); const QString link = QString::fromLatin1("%1").arg(spec->url()); m_ui->url->setText(link); + QString component = tr("None"); + if (!spec->category().isEmpty()) + component = spec->category(); + m_ui->component->setText(component); m_ui->location->setText(QDir::toNativeSeparators(spec->filePath())); m_ui->description->setText(spec->description()); m_ui->copyright->setText(spec->copyright()); diff --git a/src/libs/extensionsystem/plugindetailsview.ui b/src/libs/extensionsystem/plugindetailsview.ui index 10d6e987f35..2d4dfb87212 100644 --- a/src/libs/extensionsystem/plugindetailsview.ui +++ b/src/libs/extensionsystem/plugindetailsview.ui @@ -66,7 +66,7 @@ - + Url: @@ -76,14 +76,14 @@ - + true - + Location: @@ -93,14 +93,14 @@ - + false - + @@ -127,7 +127,7 @@ - + true @@ -137,7 +137,7 @@ - + Copyright: @@ -147,10 +147,10 @@ - + - + @@ -177,7 +177,7 @@ - + true @@ -187,7 +187,7 @@ - + @@ -214,9 +214,26 @@ - + + + + + Group: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index f5c6994f05a..1f6baeea05f 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -33,6 +33,7 @@ #include "pluginspec_p.h" #include "optionsparser.h" #include "iplugin.h" +#include "plugincollection.h" #include #include @@ -40,11 +41,14 @@ #include #include #include +#include #include #ifdef WITH_TESTS #include #endif +static const char * const C_IGNORED_PLUGINS = "Plugins/Ignored"; + typedef QList PluginSpecSet; enum { debugLeaks = 0 }; @@ -297,6 +301,16 @@ void PluginManager::setFileExtension(const QString &extension) d->extension = extension; } +void PluginManager::loadSettings() +{ + d->loadSettings(); +} + +void PluginManager::writeSettings() +{ + d->writeSettings(); +} + /*! \fn QStringList PluginManager::arguments() const The arguments left over after parsing (Neither startup nor plugin @@ -322,6 +336,11 @@ QList PluginManager::plugins() const return d->pluginSpecs; } +QHash PluginManager::pluginCollections() const +{ + return d->pluginCategories; +} + /*! \fn QString PluginManager::serializedArguments() const @@ -593,11 +612,35 @@ PluginManagerPrivate::~PluginManagerPrivate() { stopAll(); qDeleteAll(pluginSpecs); + qDeleteAll(pluginCategories); if (!allObjects.isEmpty()) { qDebug() << "There are" << allObjects.size() << "objects left in the plugin manager pool: " << allObjects; } } +void PluginManagerPrivate::writeSettings() +{ + QSettings settings(QSettings::IniFormat, QSettings::UserScope, + QLatin1String("Nokia"), QLatin1String("QtCreator")); + + QStringList notLoadedPlugins; + foreach(PluginSpec *spec, pluginSpecs) { + if (!spec->loadOnStartup()) + notLoadedPlugins.append(spec->name()); + } + + settings.setValue(QLatin1String(C_IGNORED_PLUGINS), notLoadedPlugins); +} + +void PluginManagerPrivate::loadSettings() +{ + const QSettings settings(QSettings::IniFormat, QSettings::UserScope, + QLatin1String("Nokia"), QLatin1String("QtCreator")); + + + notLoadedPlugins = settings.value(QLatin1String(C_IGNORED_PLUGINS)).toStringList(); +} + void PluginManagerPrivate::stopAll() { QList queue = loadQueue(); @@ -719,9 +762,11 @@ bool PluginManagerPrivate::loadQueue(PluginSpec *spec, QList &queu circularityCheckQueue.append(spec); // check if we have the dependencies if (spec->state() == PluginSpec::Invalid || spec->state() == PluginSpec::Read) { - spec->d->hasError = true; - spec->d->errorString += "\n"; - spec->d->errorString += PluginManager::tr("Cannot load plugin because dependencies are not resolved"); + if (!spec->d->ignoreOnStartup && spec->d->loadOnStartup) { + spec->d->hasError = true; + spec->d->errorString += "\n"; + spec->d->errorString += PluginManager::tr("Cannot load plugin because dependencies are not resolved"); + } return false; } // add dependencies @@ -745,8 +790,9 @@ bool PluginManagerPrivate::loadQueue(PluginSpec *spec, QList &queu */ void PluginManagerPrivate::loadPlugin(PluginSpec *spec, PluginSpec::State destState) { - if (spec->hasError()) + if (spec->hasError() || spec->ignoreOnStartup()) return; + switch (destState) { case PluginSpec::Running: profilingReport(">initializeExtensions", spec); @@ -796,6 +842,7 @@ void PluginManagerPrivate::loadPlugin(PluginSpec *spec, PluginSpec::State destSt void PluginManagerPrivate::setPluginPaths(const QStringList &paths) { pluginPaths = paths; + loadSettings(); readPluginPaths(); } @@ -805,8 +852,10 @@ void PluginManagerPrivate::setPluginPaths(const QStringList &paths) */ void PluginManagerPrivate::readPluginPaths() { + qDeleteAll(pluginCategories); qDeleteAll(pluginSpecs); pluginSpecs.clear(); + pluginCategories.clear(); QStringList specFiles; QStringList searchPaths = pluginPaths; @@ -820,9 +869,25 @@ void PluginManagerPrivate::readPluginPaths() foreach (const QFileInfo &subdir, dirs) searchPaths << subdir.absoluteFilePath(); } + defaultCollection = new PluginCollection(QString()); + pluginCategories.insert("", defaultCollection); + foreach (const QString &specFile, specFiles) { PluginSpec *spec = new PluginSpec; spec->d->read(specFile); + + PluginCollection *collection = 0; + // find correct plugin collection or create a new one + if (pluginCategories.contains(spec->category())) + collection = pluginCategories.value(spec->category()); + else { + collection = new PluginCollection(spec->category()); + pluginCategories.insert(spec->category(), collection); + } + if (notLoadedPlugins.contains(spec->name())) + spec->setLoadOnStartup(false); + + collection->addPlugin(spec); pluginSpecs.append(spec); } resolveDependencies(); @@ -862,6 +927,21 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r return 0; } +void PluginManagerPrivate::removePluginSpec(PluginSpec *spec) +{ + pluginSpecs.removeAll(spec); + + if (pluginCategories.contains(spec->category())) + pluginCategories.value(spec->category())->removePlugin(spec); + + foreach(PluginSpec *dep, spec->dependencySpecs()) { + dep->removeDependentPlugin(spec); + } + + delete spec; + spec = 0; +} + PluginSpec *PluginManagerPrivate::pluginByName(const QString &name) const { foreach (PluginSpec *spec, pluginSpecs) diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 3d47fc00a37..23d011f07f8 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -42,7 +42,7 @@ class QTextStream; QT_END_NAMESPACE namespace ExtensionSystem { - +class PluginCollection; namespace Internal { class PluginManagerPrivate; } @@ -95,9 +95,14 @@ public: QStringList pluginPaths() const; void setPluginPaths(const QStringList &paths); QList plugins() const; + QHash pluginCollections() const; void setFileExtension(const QString &extension); QString fileExtension() const; + // Settings + void loadSettings(); + void writeSettings(); + // command line arguments QStringList arguments() const; bool parseOptions(const QStringList &args, diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 419ff989905..4b76c4eddb1 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -45,6 +45,7 @@ QT_END_NAMESPACE namespace ExtensionSystem { class PluginManager; +class PluginCollection; namespace Internal { @@ -68,12 +69,17 @@ public: void resolveDependencies(); void initProfiling(); void profilingReport(const char *what, const PluginSpec *spec = 0); + void loadSettings(); + void writeSettings(); + void removePluginSpec(PluginSpec *spec); + QHash pluginCategories; QList pluginSpecs; QList testSpecs; QStringList pluginPaths; QString extension; QList allObjects; // ### make this a QList > > ? + QStringList notLoadedPlugins; QStringList arguments; QScopedPointer m_profileTimer; @@ -87,6 +93,7 @@ public: static PluginSpec *createSpec(); static PluginSpecPrivate *privateSpec(PluginSpec *spec); private: + PluginCollection *defaultCollection; PluginManager *q; void readPluginPaths(); diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index 8a395c7f0f5..b4095250aec 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -226,6 +226,30 @@ QString PluginSpec::url() const return d->url; } +/*! + \fn QString PluginSpec::category() const + The category that the plugin belongs to. Categories are groups of plugins which allow for keeping them together in the UI. + Returns an empty string if the plugin does not belong to a category. +*/ +QString PluginSpec::category() const +{ + return d->category; +} + +/*! + \fn bool PluginSpec::loadOnStartup() const + True if the plugin is loaded at startup. True by default - the user can change it from the Plugin settings. +*/ +bool PluginSpec::loadOnStartup() const +{ + return d->loadOnStartup; +} + +bool PluginSpec::ignoreOnStartup() const +{ + return d->ignoreOnStartup; +} + /*! \fn QList PluginSpec::dependencies() const The plugin dependencies. This is valid after the PluginSpec::Read state is reached. @@ -358,6 +382,33 @@ QList PluginSpec::dependencySpecs() const return d->dependencySpecs; } +/*! + \fn QList PluginSpec::providesSpecs() const + Returns the list of plugins that depend on this one. + + \sa PluginSpec::dependencySpecs() +*/ +QList PluginSpec::providesSpecs() const +{ + return d->providesSpecs; +} + +/*! + \fn void PluginSpec::addDependentPlugin(PluginSpec *dependent) + Adds a dependent the list of plugins that depend on this one. + + \sa PluginSpec::providesSpecs() +*/ +void PluginSpec::addDependentPlugin(PluginSpec *dependent) +{ + d->providesSpecs.append(dependent); +} + +void PluginSpec::removeDependentPlugin(PluginSpec *dependent) +{ + d->providesSpecs.removeOne(dependent); +} + //==========PluginSpecPrivate================== namespace { @@ -370,6 +421,7 @@ namespace { const char * const LICENSE = "license"; const char * const DESCRIPTION = "description"; const char * const URL = "url"; + const char * const CATEGORY = "category"; const char * const DEPENDENCYLIST = "dependencyList"; const char * const DEPENDENCY = "dependency"; const char * const DEPENDENCY_NAME = "name"; @@ -384,7 +436,10 @@ namespace { \internal */ PluginSpecPrivate::PluginSpecPrivate(PluginSpec *spec) - : plugin(0), + : + loadOnStartup(true), + ignoreOnStartup(false), + plugin(0), state(PluginSpec::Invalid), hasError(false), q(spec) @@ -405,6 +460,7 @@ bool PluginSpecPrivate::read(const QString &fileName) = license = description = url + = category = location = ""; state = PluginSpec::Invalid; @@ -440,6 +496,16 @@ bool PluginSpecPrivate::read(const QString &fileName) return true; } +void PluginSpec::setLoadOnStartup(bool value) +{ + d->loadOnStartup = value; +} + +void PluginSpec::setIgnoreOnStartup(bool value) +{ + d->ignoreOnStartup = value; +} + /*! \fn bool PluginSpecPrivate::reportError(const QString &err) \internal @@ -523,6 +589,8 @@ void PluginSpecPrivate::readPluginSpec(QXmlStreamReader &reader) description = reader.readElementText().trimmed(); else if (element == URL) url = reader.readElementText().trimmed(); + else if (element == CATEGORY) + category = reader.readElementText().trimmed(); else if (element == DEPENDENCYLIST) readDependencies(reader); else if (element == ARGUMENTLIST) @@ -725,9 +793,15 @@ bool PluginSpecPrivate::resolveDependencies(const QList &specs) QList resolvedDependencies; foreach (const PluginDependency &dependency, dependencies) { PluginSpec *found = 0; + foreach (PluginSpec *spec, specs) { if (spec->provides(dependency.name, dependency.version)) { found = spec; + if (!spec->loadOnStartup() || spec->ignoreOnStartup()) + ignoreOnStartup = true; + + spec->addDependentPlugin(q); + break; } } @@ -743,8 +817,12 @@ bool PluginSpecPrivate::resolveDependencies(const QList &specs) } if (hasError) return false; + dependencySpecs = resolvedDependencies; - state = PluginSpec::Resolved; + + if (loadOnStartup && !ignoreOnStartup) + state = PluginSpec::Resolved; + return true; } diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h index dc24239ee47..405651886fe 100644 --- a/src/libs/extensionsystem/pluginspec.h +++ b/src/libs/extensionsystem/pluginspec.h @@ -78,6 +78,10 @@ public: QString license() const; QString description() const; QString url() const; + QString category() const; + bool loadOnStartup() const; + // true if loading was not done due to user unselecting this plugin or its dependencies + bool ignoreOnStartup() const; QList dependencies() const; typedef QList PluginArgumentDescriptions; @@ -87,6 +91,9 @@ public: QString location() const; QString filePath() const; + void setLoadOnStartup(bool value); + void setIgnoreOnStartup(bool value); + QStringList arguments() const; void setArguments(const QStringList &arguments); void addArgument(const QString &argument); @@ -96,6 +103,13 @@ public: // dependency specs, valid after 'Resolved' state is reached QList dependencySpecs() const; + // list of plugins that depend on this - e.g. this plugins provides for them + QList providesSpecs() const; + + // add/remove from providesSpecs + void addDependentPlugin(PluginSpec *dependent); + void removeDependentPlugin(PluginSpec *dependent); + // linked plugin instance, valid after 'Loaded' state is reached IPlugin *plugin() const; diff --git a/src/libs/extensionsystem/pluginspec_p.h b/src/libs/extensionsystem/pluginspec_p.h index 687dab72176..245142ce996 100644 --- a/src/libs/extensionsystem/pluginspec_p.h +++ b/src/libs/extensionsystem/pluginspec_p.h @@ -67,12 +67,16 @@ public: QString license; QString description; QString url; + QString category; QList dependencies; + bool loadOnStartup; + bool ignoreOnStartup; QString location; QString filePath; QStringList arguments; + QList providesSpecs; QList dependencySpecs; PluginSpec::PluginArgumentDescriptions argumentDescriptions; IPlugin *plugin; diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp index c1c36de9364..286e12f7875 100644 --- a/src/libs/extensionsystem/pluginview.cpp +++ b/src/libs/extensionsystem/pluginview.cpp @@ -31,11 +31,14 @@ #include "pluginview_p.h" #include "pluginmanager.h" #include "pluginspec.h" +#include "plugincollection.h" #include "ui_pluginview.h" #include #include #include +#include + #include /*! @@ -65,6 +68,7 @@ using namespace ExtensionSystem; Q_DECLARE_METATYPE(ExtensionSystem::PluginSpec*); +Q_DECLARE_METATYPE(ExtensionSystem::PluginCollection*); /*! \fn PluginView::PluginView(PluginManager *manager, QWidget *parent) @@ -74,20 +78,30 @@ Q_DECLARE_METATYPE(ExtensionSystem::PluginSpec*); PluginView::PluginView(PluginManager *manager, QWidget *parent) : QWidget(parent), m_ui(new Internal::Ui::PluginView), - p(new Internal::PluginViewPrivate) + p(new Internal::PluginViewPrivate), + m_allowCheckStateUpdate(true), + C_LOAD(1) { m_ui->setupUi(this); - QHeaderView *header = m_ui->pluginWidget->header(); + QHeaderView *header = m_ui->categoryWidget->header(); header->setResizeMode(0, QHeaderView::ResizeToContents); - header->setResizeMode(1, QHeaderView::ResizeToContents); header->setResizeMode(2, QHeaderView::ResizeToContents); - m_ui->pluginWidget->sortItems(1, Qt::AscendingOrder); + + m_okIcon = QIcon(QLatin1String(":/extensionsystem/images/ok.png")); + m_errorIcon = QIcon(QLatin1String(":/extensionsystem/images/error.png")); + m_notLoadedIcon = QIcon(QLatin1String(":/extensionsystem/images/notloaded.png")); + + // cannot disable these + m_whitelist << QString("Core") << QString("Locator") + << QString("Find") << QString("TextEditor"); + p->manager = manager; connect(p->manager, SIGNAL(pluginsChanged()), this, SLOT(updateList())); - connect(m_ui->pluginWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), + connect(m_ui->categoryWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(selectPlugin(QTreeWidgetItem*))); - connect(m_ui->pluginWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), + connect(m_ui->categoryWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(activatePlugin(QTreeWidgetItem*))); + updateList(); } @@ -107,51 +121,230 @@ PluginView::~PluginView() */ PluginSpec *PluginView::currentPlugin() const { - if (!m_ui->pluginWidget->currentItem()) + if (!m_ui->categoryWidget->currentItem()) return 0; - return m_ui->pluginWidget->currentItem()->data(0, Qt::UserRole).value(); + if (!m_ui->categoryWidget->currentItem()->data(0, Qt::UserRole).isNull()) + return m_ui->categoryWidget->currentItem()->data(0, Qt::UserRole).value(); + return 0; } void PluginView::updateList() { - const QIcon okIcon(QLatin1String(":/extensionsystem/images/ok.png")); - const QIcon errorIcon(QLatin1String(":/extensionsystem/images/error.png")); - QList items; - QTreeWidgetItem *currentItem = 0; - PluginSpec *currPlugin = currentPlugin(); - foreach (PluginSpec *spec, p->manager->plugins()) { - QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() - << QString() - << spec->name() - << QString::fromLatin1("%1 (%2)").arg(spec->version(), spec->compatVersion()) - << spec->vendor() - << QDir::toNativeSeparators(spec->filePath())); - item->setToolTip(4, QDir::toNativeSeparators(spec->filePath())); - item->setIcon(0, spec->hasError() ? errorIcon : okIcon); - item->setData(0, Qt::UserRole, qVariantFromValue(spec)); - items.append(item); - if (currPlugin == spec) - currentItem = item; + connect(m_ui->categoryWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), + this, SLOT(updatePluginSettings(QTreeWidgetItem*, int))); + + PluginCollection *defaultCollection = 0; + foreach(PluginCollection *collection, p->manager->pluginCollections()) { + if (collection->name().isEmpty()) { + defaultCollection = collection; + continue; + } + // State, name, load, version, vendor. + QTreeWidgetItem *collectionItem = new QTreeWidgetItem(QStringList() + << collection->name() + << QString() // state + << QString() // load + << QString() // version + << QString()); // vendor + m_items.append(collectionItem); + + Qt::CheckState groupState = Qt::Unchecked; + bool hasErrors = parsePluginSpecs(collectionItem, groupState, collection->plugins()); + + collectionItem->setIcon(0, hasErrors ? m_errorIcon : m_okIcon); + collectionItem->setData(C_LOAD, Qt::CheckStateRole, QVariant(groupState)); + collectionItem->setToolTip(C_LOAD, tr("Load on Startup")); + collectionItem->setData(0, Qt::UserRole, qVariantFromValue(collection)); } - m_ui->pluginWidget->clear(); - if (!items.isEmpty()) - m_ui->pluginWidget->addTopLevelItems(items); - if (currentItem) - m_ui->pluginWidget->setCurrentItem(currentItem); - else if (!items.isEmpty()) - m_ui->pluginWidget->setCurrentItem(items.first()); + + // add all non-categorized plugins into utilities. could also be added as root items + // but that makes the tree ugly. + QTreeWidgetItem *defaultCollectionItem = new QTreeWidgetItem(QStringList() + << QString(tr("Utilities")) + << QString() + << QString() + << QString() + << QString()); + + m_items.append(defaultCollectionItem); + Qt::CheckState groupState = Qt::Unchecked; + bool hasErrors = parsePluginSpecs(defaultCollectionItem, groupState, defaultCollection->plugins()); + + defaultCollectionItem->setIcon(0, hasErrors ? m_errorIcon : m_okIcon); + defaultCollectionItem->setData(C_LOAD, Qt::CheckStateRole, QVariant(groupState)); + defaultCollectionItem->setToolTip(C_LOAD, tr("Load on Startup")); + defaultCollectionItem->setData(0, Qt::UserRole, qVariantFromValue(defaultCollection)); + + + foreach (PluginSpec *spec, m_specToItem.keys()) + toggleRelatedPlugins(spec, spec->loadOnStartup() && !spec->ignoreOnStartup()); + + m_ui->categoryWidget->clear(); + if (!m_items.isEmpty()) { + m_ui->categoryWidget->addTopLevelItems(m_items); + m_ui->categoryWidget->expandAll(); + } + + m_ui->categoryWidget->sortItems(0, Qt::AscendingOrder); + if (m_ui->categoryWidget->topLevelItemCount()) + m_ui->categoryWidget->setCurrentItem(m_ui->categoryWidget->topLevelItem(0)); +} + +bool PluginView::parsePluginSpecs(QTreeWidgetItem *parentItem, Qt::CheckState &groupState, QList plugins) +{ + bool hasErrors = false; + int loadCount = 0; + for (int i = 0; i < plugins.length(); ++i) { + PluginSpec *spec = plugins[i]; + if (spec->hasError()) + hasErrors = true; + + QTreeWidgetItem *pluginItem = new QTreeWidgetItem(QStringList() + << spec->name() + << QString() // load on startup + << QString::fromLatin1("%1 (%2)").arg(spec->version(), spec->compatVersion()) + << spec->vendor()); + + pluginItem->setToolTip(0, QDir::toNativeSeparators(spec->filePath())); + bool ok = !spec->hasError(); + QIcon &icon = ok ? m_okIcon : m_errorIcon; + if (ok && (spec->state() != PluginSpec::Running)) + icon = m_notLoadedIcon; + + pluginItem->setIcon(0, icon); + pluginItem->setData(0, Qt::UserRole, qVariantFromValue(spec)); + + Qt::CheckState state = Qt::Unchecked; + if (spec->loadOnStartup()) { + state = Qt::Checked; + //if (!spec->ignoreOnStartup()) + ++loadCount; + } else + hasErrors = true; + + if (!m_whitelist.contains(spec->name())) + pluginItem->setData(C_LOAD, Qt::CheckStateRole, state); + else { + QColor disabledColor = palette().color(QPalette::Disabled,QPalette::WindowText).lighter(120); + pluginItem->setData(C_LOAD, Qt::CheckStateRole, Qt::Checked); + pluginItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + pluginItem->setSizeHint(C_LOAD, QSize(1,1)); + pluginItem->setForeground(C_LOAD, QBrush(disabledColor)); // QBrush(Qt::white, Qt::NoBrush)); + //pluginItem->setBackground(C_LOAD, QBrush(Qt::white, Qt::NoBrush)); + } + pluginItem->setToolTip(C_LOAD, tr("Load on Startup")); + + m_specToItem.insert(spec, pluginItem); + + if (parentItem) + parentItem->addChild(pluginItem); + else + m_items.append(pluginItem); + + } + + if (loadCount == plugins.length()) + groupState = Qt::Checked; + else if (loadCount == 0) + groupState = Qt::Unchecked; + else + groupState = Qt::PartiallyChecked; + + return hasErrors; } void PluginView::selectPlugin(QTreeWidgetItem *current) { if (!current) emit currentPluginChanged(0); - else + else if (current->data(0, Qt::UserRole).canConvert()) emit currentPluginChanged(current->data(0, Qt::UserRole).value()); + else + emit currentPluginChanged(0); + } void PluginView::activatePlugin(QTreeWidgetItem *item) { - emit pluginActivated(item->data(0, Qt::UserRole).value()); + if (item->data(0, Qt::UserRole).canConvert()) { + emit pluginActivated(item->data(0, Qt::UserRole).value()); + } else + emit pluginActivated(0); +} + +void PluginView::updatePluginSettings(QTreeWidgetItem *item, int column) +{ + if (!m_allowCheckStateUpdate) + return; + + m_allowCheckStateUpdate = false; + + bool loadOnStartup = item->data(C_LOAD, Qt::CheckStateRole).toBool(); + + if (item->data(0, Qt::UserRole).canConvert()) { + PluginSpec *spec = item->data(0, Qt::UserRole).value(); + + if (column == C_LOAD) { + + spec->setLoadOnStartup(loadOnStartup); + toggleRelatedPlugins(spec, loadOnStartup); + + if (item->parent()) { + PluginCollection *collection = item->parent()->data(0, Qt::UserRole).value(); + Qt::CheckState state = Qt::PartiallyChecked; + int loadCount = 0; + for (int i = 0; i < collection->plugins().length(); ++i) { + if (collection->plugins().at(i)->loadOnStartup()) + ++loadCount; + } + if (loadCount == collection->plugins().length()) + state = Qt::Checked; + else if (loadCount == 0) + state = Qt::Unchecked; + + item->parent()->setData(C_LOAD, Qt::CheckStateRole, state); + } + + emit pluginSettingsChanged(spec); + } + + } else { + PluginCollection *collection = item->data(0, Qt::UserRole).value(); + for (int i = 0; i < collection->plugins().length(); ++i) { + PluginSpec *spec = collection->plugins().at(i); + QTreeWidgetItem *child = m_specToItem.value(spec); + + if (!m_whitelist.contains(spec->name())) { + spec->setLoadOnStartup(loadOnStartup); + Qt::CheckState state = (loadOnStartup ? Qt::Checked : Qt::Unchecked); + child->setData(C_LOAD, Qt::CheckStateRole, state); + toggleRelatedPlugins(spec, loadOnStartup); + } else { + child->setData(C_LOAD, Qt::CheckStateRole, Qt::Checked); + child->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } + } + emit pluginSettingsChanged(collection->plugins().first()); + } + + m_allowCheckStateUpdate = true; +} + +void PluginView::toggleRelatedPlugins(PluginSpec *modifiedPlugin, bool isPluginEnabled) +{ + + for(int i = 0; i < modifiedPlugin->providesSpecs().length(); ++i) { + PluginSpec *spec = modifiedPlugin->providesSpecs().at(i); + QTreeWidgetItem *childItem = m_specToItem.value(spec); + + if (childItem->isDisabled() != !isPluginEnabled) { + childItem->setDisabled(!isPluginEnabled); + if (childItem->parent() && !childItem->parent()->isExpanded()) + childItem->parent()->setExpanded(true); + + + toggleRelatedPlugins(spec, isPluginEnabled); + } + } } diff --git a/src/libs/extensionsystem/pluginview.h b/src/libs/extensionsystem/pluginview.h index 47fae9b9231..28d410035e7 100644 --- a/src/libs/extensionsystem/pluginview.h +++ b/src/libs/extensionsystem/pluginview.h @@ -32,7 +32,9 @@ #include "extensionsystem_global.h" +#include #include +#include QT_BEGIN_NAMESPACE class QTreeWidgetItem; @@ -42,6 +44,7 @@ namespace ExtensionSystem { class PluginManager; class PluginSpec; +class PluginCollection; namespace Internal { class PluginViewPrivate; @@ -63,15 +66,30 @@ public: signals: void currentPluginChanged(ExtensionSystem::PluginSpec *spec); void pluginActivated(ExtensionSystem::PluginSpec *spec); + void pluginSettingsChanged(ExtensionSystem::PluginSpec *spec); private slots: + void updatePluginSettings(QTreeWidgetItem *item, int column); void updateList(); void selectPlugin(QTreeWidgetItem *current); void activatePlugin(QTreeWidgetItem *item); private: + void toggleRelatedPlugins(PluginSpec *spec, bool isPluginEnabled = true); + bool parsePluginSpecs(QTreeWidgetItem *parentItem, Qt::CheckState &groupState, QList plugins); + Internal::Ui::PluginView *m_ui; Internal::PluginViewPrivate *p; + QList m_items; + QHash m_specToItem; + + QStringList m_whitelist; + QIcon m_okIcon; + QIcon m_errorIcon; + QIcon m_notLoadedIcon; + bool m_allowCheckStateUpdate; + + const int C_LOAD; }; } // namespae ExtensionSystem diff --git a/src/libs/extensionsystem/pluginview.qrc b/src/libs/extensionsystem/pluginview.qrc index 7b78566568f..aa772f9547c 100644 --- a/src/libs/extensionsystem/pluginview.qrc +++ b/src/libs/extensionsystem/pluginview.qrc @@ -1,6 +1,7 @@ - + images/ok.png images/error.png + images/notloaded.png diff --git a/src/libs/extensionsystem/pluginview.ui b/src/libs/extensionsystem/pluginview.ui index a995bbe8ed7..8dfb08ae2c1 100644 --- a/src/libs/extensionsystem/pluginview.ui +++ b/src/libs/extensionsystem/pluginview.ui @@ -14,37 +14,55 @@ 2 - - + + true - 0 + 20 - false - - true - + false + + true + true - 5 + 4 + + 120 + + + false + + + 35 + + + 120 + + + 35 + + + false + - State + Name - Name + Load @@ -57,11 +75,6 @@ Vendor - - - Location - - diff --git a/src/plugins/bineditor/BinEditor.pluginspec b/src/plugins/bineditor/BinEditor.pluginspec index 3b60fcc7816..4091f86779d 100644 --- a/src/plugins/bineditor/BinEditor.pluginspec +++ b/src/plugins/bineditor/BinEditor.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Binary editor component. http://qt.nokia.com diff --git a/src/plugins/bookmarks/Bookmarks.pluginspec b/src/plugins/bookmarks/Bookmarks.pluginspec index 247b4ad9b51..654377aa5f2 100644 --- a/src/plugins/bookmarks/Bookmarks.pluginspec +++ b/src/plugins/bookmarks/Bookmarks.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Bookmarks in text editors. http://qt.nokia.com diff --git a/src/plugins/cmakeprojectmanager/CMakeProjectManager.pluginspec b/src/plugins/cmakeprojectmanager/CMakeProjectManager.pluginspec index 3e0281d01e8..41f798d5011 100644 --- a/src/plugins/cmakeprojectmanager/CMakeProjectManager.pluginspec +++ b/src/plugins/cmakeprojectmanager/CMakeProjectManager.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Build Systems CMake support http://qt.nokia.com diff --git a/src/plugins/coreplugin/Core.pluginspec b/src/plugins/coreplugin/Core.pluginspec index a2f4f95086d..b33392833e6 100644 --- a/src/plugins/coreplugin/Core.pluginspec +++ b/src/plugins/coreplugin/Core.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator The core plugin for the Qt IDE. http://qt.nokia.com diff --git a/src/plugins/coreplugin/plugindialog.cpp b/src/plugins/coreplugin/plugindialog.cpp index 8549d356c61..7d9387f4bdc 100644 --- a/src/plugins/coreplugin/plugindialog.cpp +++ b/src/plugins/coreplugin/plugindialog.cpp @@ -40,10 +40,13 @@ #include #include #include +#include #include using namespace Core::Internal; +bool PluginDialog::m_isRestartRequired = false; + PluginDialog::PluginDialog(QWidget *parent) : QDialog(parent), m_view(new ExtensionSystem::PluginView(ExtensionSystem::PluginManager::instance(), this)) @@ -59,14 +62,21 @@ PluginDialog::PluginDialog(QWidget *parent) m_closeButton->setEnabled(true); m_closeButton->setDefault(true); + m_restartRequired = new QLabel(tr("Restart required."), this); + if (!m_isRestartRequired) + m_restartRequired->setVisible(false); + QHBoxLayout *hl = new QHBoxLayout; hl->addWidget(m_detailsButton); hl->addWidget(m_errorDetailsButton); + hl->addSpacing(10); + hl->addWidget(m_restartRequired); hl->addStretch(5); hl->addWidget(m_closeButton); vl->addLayout(hl); + resize(650, 400); setWindowTitle(tr("Installed Plugins")); @@ -74,18 +84,35 @@ PluginDialog::PluginDialog(QWidget *parent) this, SLOT(updateButtons())); connect(m_view, SIGNAL(pluginActivated(ExtensionSystem::PluginSpec*)), this, SLOT(openDetails(ExtensionSystem::PluginSpec*))); + connect(m_view, SIGNAL(pluginSettingsChanged(ExtensionSystem::PluginSpec*)), + this, SLOT(updateRestartRequired())); connect(m_detailsButton, SIGNAL(clicked()), this, SLOT(openDetails())); connect(m_errorDetailsButton, SIGNAL(clicked()), this, SLOT(openErrorDetails())); - connect(m_closeButton, SIGNAL(clicked()), this, SLOT(accept())); + connect(m_closeButton, SIGNAL(clicked()), this, SLOT(closeDialog())); updateButtons(); } +void PluginDialog::closeDialog() +{ + ExtensionSystem::PluginManager::instance()->writeSettings(); + accept(); +} + +void PluginDialog::updateRestartRequired() +{ + // just display the notice all the time after once changing something + m_isRestartRequired = true; + m_restartRequired->setVisible(true); +} + void PluginDialog::updateButtons() { ExtensionSystem::PluginSpec *selectedSpec = m_view->currentPlugin(); if (selectedSpec) { m_detailsButton->setEnabled(true); - m_errorDetailsButton->setEnabled(selectedSpec->hasError()); + m_errorDetailsButton->setEnabled(selectedSpec->hasError() + || selectedSpec->ignoreOnStartup() + || !selectedSpec->loadOnStartup()); } else { m_detailsButton->setEnabled(false); m_errorDetailsButton->setEnabled(false); diff --git a/src/plugins/coreplugin/plugindialog.h b/src/plugins/coreplugin/plugindialog.h index 30aa1a5b2c6..56200aa1824 100644 --- a/src/plugins/coreplugin/plugindialog.h +++ b/src/plugins/coreplugin/plugindialog.h @@ -34,6 +34,7 @@ QT_BEGIN_NAMESPACE class QPushButton; +class QLabel; QT_END_NAMESPACE namespace ExtensionSystem { @@ -52,10 +53,12 @@ public: explicit PluginDialog(QWidget *parent); private slots: + void updateRestartRequired(); void updateButtons(); void openDetails(); void openDetails(ExtensionSystem::PluginSpec *spec); void openErrorDetails(); + void closeDialog(); private: ExtensionSystem::PluginView *m_view; @@ -63,6 +66,8 @@ private: QPushButton *m_detailsButton; QPushButton *m_errorDetailsButton; QPushButton *m_closeButton; + QLabel *m_restartRequired; + static bool m_isRestartRequired; }; } // namespace Internal diff --git a/src/plugins/cppeditor/CppEditor.pluginspec b/src/plugins/cppeditor/CppEditor.pluginspec index 19d693127a2..167900e3621 100644 --- a/src/plugins/cppeditor/CppEditor.pluginspec +++ b/src/plugins/cppeditor/CppEditor.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + C++ C/C++ editor component. http://qt.nokia.com diff --git a/src/plugins/cpptools/CppTools.pluginspec b/src/plugins/cpptools/CppTools.pluginspec index c8685ddd2e8..c6b53bdfbf2 100644 --- a/src/plugins/cpptools/CppTools.pluginspec +++ b/src/plugins/cpptools/CppTools.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + C++ Tools for analyzing C/C++ code. http://qt.nokia.com diff --git a/src/plugins/cvs/CVS.pluginspec b/src/plugins/cvs/CVS.pluginspec index e6e28e074be..ee3148cb855 100644 --- a/src/plugins/cvs/CVS.pluginspec +++ b/src/plugins/cvs/CVS.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Version Control CVS integration. http://qt.nokia.com diff --git a/src/plugins/debugger/Debugger.pluginspec b/src/plugins/debugger/Debugger.pluginspec index 4e10ecff6a3..4194600ee94 100644 --- a/src/plugins/debugger/Debugger.pluginspec +++ b/src/plugins/debugger/Debugger.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Debugger integration. http://qt.nokia.com diff --git a/src/plugins/designer/Designer.pluginspec b/src/plugins/designer/Designer.pluginspec index 94cdf064148..c56bf55f822 100644 --- a/src/plugins/designer/Designer.pluginspec +++ b/src/plugins/designer/Designer.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Qt Designer integration. http://qt.nokia.com diff --git a/src/plugins/find/Find.pluginspec b/src/plugins/find/Find.pluginspec index 1cd1cd35174..a62a6099b6c 100644 --- a/src/plugins/find/Find.pluginspec +++ b/src/plugins/find/Find.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Provides the find widget and the hooks for find implementations. http://qt.nokia.com diff --git a/src/plugins/genericprojectmanager/GenericProjectManager.pluginspec b/src/plugins/genericprojectmanager/GenericProjectManager.pluginspec index c735fa2b7cc..8a4edee5514 100644 --- a/src/plugins/genericprojectmanager/GenericProjectManager.pluginspec +++ b/src/plugins/genericprojectmanager/GenericProjectManager.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Build Systems Generic support http://qt.nokia.com diff --git a/src/plugins/git/ScmGit.pluginspec b/src/plugins/git/ScmGit.pluginspec index 87ef25a05a5..822d26afb35 100644 --- a/src/plugins/git/ScmGit.pluginspec +++ b/src/plugins/git/ScmGit.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Version Control Git integration. http://qt.nokia.com diff --git a/src/plugins/help/Help.pluginspec b/src/plugins/help/Help.pluginspec index 9b06871d63d..ce7d606b8e2 100644 --- a/src/plugins/help/Help.pluginspec +++ b/src/plugins/help/Help.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Help system. http://qt.nokia.com diff --git a/src/plugins/locator/Locator.pluginspec b/src/plugins/locator/Locator.pluginspec index dc25c5bbb29..a71278899f9 100644 --- a/src/plugins/locator/Locator.pluginspec +++ b/src/plugins/locator/Locator.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Provides the Locator widget and the hooks for Locator filter implementations. http://qt.nokia.com diff --git a/src/plugins/mercurial/Mercurial.pluginspec b/src/plugins/mercurial/Mercurial.pluginspec index 029767a34c8..b054669a2e8 100644 --- a/src/plugins/mercurial/Mercurial.pluginspec +++ b/src/plugins/mercurial/Mercurial.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Version Control Mercurial integration. http://qt.nokia.com diff --git a/src/plugins/perforce/Perforce.pluginspec b/src/plugins/perforce/Perforce.pluginspec index 75acf2800a8..c82605c826b 100644 --- a/src/plugins/perforce/Perforce.pluginspec +++ b/src/plugins/perforce/Perforce.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Version Control Perforce integration. http://qt.nokia.com diff --git a/src/plugins/projectexplorer/ProjectExplorer.pluginspec b/src/plugins/projectexplorer/ProjectExplorer.pluginspec index 138b35cc550..772f357b4e1 100644 --- a/src/plugins/projectexplorer/ProjectExplorer.pluginspec +++ b/src/plugins/projectexplorer/ProjectExplorer.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator ProjectExplorer framework that can be extended with different kind of project types. http://qt.nokia.com diff --git a/src/plugins/qmldesigner/QmlDesigner.pluginspec b/src/plugins/qmldesigner/QmlDesigner.pluginspec index 6cecd7dc57d..70bab152f88 100644 --- a/src/plugins/qmldesigner/QmlDesigner.pluginspec +++ b/src/plugins/qmldesigner/QmlDesigner.pluginspec @@ -16,6 +16,7 @@ General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + QML Editor for QML. http://qt.nokia.com diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 91d02d7cae9..07aff5d0e37 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -80,6 +80,7 @@ BauhausPlugin::BauhausPlugin() : m_closeAllEditorsAction(new QAction(this)), m_closeOtherEditorsAction(new QAction(this)) { + // Exceptions should never ever assert: they are handled in a number of // places where it is actually VALID AND EXPECTED BEHAVIOUR to get an // exception. diff --git a/src/plugins/qmlinspector/QmlInspector.pluginspec b/src/plugins/qmlinspector/QmlInspector.pluginspec index 0756edfb54a..46f2903c7c3 100644 --- a/src/plugins/qmlinspector/QmlInspector.pluginspec +++ b/src/plugins/qmlinspector/QmlInspector.pluginspec @@ -16,6 +16,7 @@ General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + QML Qml support http://qt.nokia.com diff --git a/src/plugins/qmljseditor/QmlJSEditor.pluginspec b/src/plugins/qmljseditor/QmlJSEditor.pluginspec index 16a858ff27c..2a9f5abee14 100644 --- a/src/plugins/qmljseditor/QmlJSEditor.pluginspec +++ b/src/plugins/qmljseditor/QmlJSEditor.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + QML Editor for QML and JavaScript. http://qt.nokia.com diff --git a/src/plugins/qmlprojectmanager/QmlProjectManager.pluginspec b/src/plugins/qmlprojectmanager/QmlProjectManager.pluginspec index dc72d700381..ed511bd1b05 100644 --- a/src/plugins/qmlprojectmanager/QmlProjectManager.pluginspec +++ b/src/plugins/qmlprojectmanager/QmlProjectManager.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + QML Qml support http://qt.nokia.com diff --git a/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec b/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec index 62810ae00b4..b5c0fa54db1 100644 --- a/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec +++ b/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Build Systems Provides project type for Qt 4 pro files and tools. http://qt.nokia.com diff --git a/src/plugins/resourceeditor/ResourceEditor.pluginspec b/src/plugins/resourceeditor/ResourceEditor.pluginspec index ce931a12b13..fead8f7a5d0 100644 --- a/src/plugins/resourceeditor/ResourceEditor.pluginspec +++ b/src/plugins/resourceeditor/ResourceEditor.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Editor for qrc files. http://qt.nokia.com diff --git a/src/plugins/subversion/Subversion.pluginspec b/src/plugins/subversion/Subversion.pluginspec index 97ac13bd264..8a939f78c8d 100644 --- a/src/plugins/subversion/Subversion.pluginspec +++ b/src/plugins/subversion/Subversion.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Version Control Subversion integration. http://qt.nokia.com diff --git a/src/plugins/texteditor/TextEditor.pluginspec b/src/plugins/texteditor/TextEditor.pluginspec index 5d5a09b0bf2..19d2e755c20 100644 --- a/src/plugins/texteditor/TextEditor.pluginspec +++ b/src/plugins/texteditor/TextEditor.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Text editor framework and the implementation of the basic text editor. http://qt.nokia.com diff --git a/src/plugins/vcsbase/VCSBase.pluginspec b/src/plugins/vcsbase/VCSBase.pluginspec index 565b1341b7d..90d1207bec0 100644 --- a/src/plugins/vcsbase/VCSBase.pluginspec +++ b/src/plugins/vcsbase/VCSBase.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Version Control Version Control System Base Plugin http://qt.nokia.com diff --git a/src/plugins/welcome/Welcome.pluginspec b/src/plugins/welcome/Welcome.pluginspec index f475c877567..139a9a6f7b0 100644 --- a/src/plugins/welcome/Welcome.pluginspec +++ b/src/plugins/welcome/Welcome.pluginspec @@ -10,6 +10,7 @@ GNU Lesser General Public License Usage Alternatively, this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Qt Creator Default Welcome Screen Plugin http://qt.nokia.com