diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp index 3806175dea2984772edc609c4b4684406eb13922..f1ad60023a17289a61d5eb799557e8036c5b0b79 100644 --- a/src/plugins/coreplugin/externaltool.cpp +++ b/src/plugins/coreplugin/externaltool.cpp @@ -30,7 +30,6 @@ #include "externaltool.h" #include "actionmanager/actionmanager.h" #include "actionmanager/actioncontainer.h" -#include "actionmanager/command.h" #include "coreconstants.h" #include "variablemanager.h" @@ -446,13 +445,40 @@ void ExternalToolManager::initialize() ActionContainer *mexternaltools = am->createMenu(Id(Constants::M_TOOLS_EXTERNAL)); mexternaltools->menu()->setTitle(tr("External")); ActionContainer *mtools = am->actionContainer(Constants::M_TOOLS); - Command *cmd; mtools->addMenu(mexternaltools, Constants::G_DEFAULT_THREE); QMap<QString, QMultiMap<int, Command*> > categoryMenus; - QDir dir(m_core->resourcePath() + QLatin1String("/externaltools"), - QLatin1String("*.xml"), QDir::Unsorted, QDir::Files | QDir::Readable); + parseDirectory(m_core->userResourcePath() + QLatin1String("/externaltools"), + &categoryMenus); + parseDirectory(m_core->resourcePath() + QLatin1String("/externaltools"), + &categoryMenus, true); + + // add all the category menus, QMap is nicely sorted + QMapIterator<QString, QMultiMap<int, Command*> > it(categoryMenus); + while (it.hasNext()) { + it.next(); + ActionContainer *container = 0; + if (it.key() == QString()) { // no displayCategory, so put into external tools menu directly + container = mexternaltools; + } else { + container = am->createMenu(Id("Tools.External.Category." + it.key())); + mexternaltools->addMenu(container, Constants::G_DEFAULT_ONE); + container->menu()->setTitle(it.key()); + } + foreach (Command *cmd, it.value().values()) { + container->addAction(cmd, Constants::G_DEFAULT_TWO); + } + } +} + +void ExternalToolManager::parseDirectory(const QString &directory, QMap<QString, QMultiMap<int, Command*> > *categoryMenus, + bool ignoreDuplicates) +{ + QTC_ASSERT(categoryMenus, return); + ActionManager *am = m_core->actionManager(); + Command *cmd; + QDir dir(directory, QLatin1String("*.xml"), QDir::Unsorted, QDir::Files | QDir::Readable); foreach (const QFileInfo &info, dir.entryInfoList()) { QFile file(info.absoluteFilePath()); if (file.open(QIODevice::ReadOnly)) { @@ -467,7 +493,8 @@ void ExternalToolManager::initialize() } if (m_tools.contains(tool->id())) { // TODO error handling - qDebug() << tr("Error: External tool in %1 has duplicate id").arg(file.fileName()); + if (!ignoreDuplicates) + qDebug() << tr("Error: External tool in %1 has duplicate id").arg(file.fileName()); delete tool; continue; } @@ -480,24 +507,7 @@ void ExternalToolManager::initialize() action->setData(tool->id()); cmd = am->registerAction(action, Id("Tools.External." + tool->id()), Context(Constants::C_GLOBAL)); connect(action, SIGNAL(triggered()), this, SLOT(menuActivated())); - categoryMenus[tool->displayCategory()].insert(tool->order(), cmd); - } - } - - // add all the category menus, QMap is nicely sorted - QMapIterator<QString, QMultiMap<int, Command*> > it(categoryMenus); - while (it.hasNext()) { - it.next(); - ActionContainer *container = 0; - if (it.key() == QString()) { // no displayCategory, so put into external tools menu directly - container = mexternaltools; - } else { - container = am->createMenu(Id("Tools.External.Category." + it.key())); - mexternaltools->addMenu(container, Constants::G_DEFAULT_ONE); - container->menu()->setTitle(it.key()); - } - foreach (Command *cmd, it.value().values()) { - container->addAction(cmd, Constants::G_DEFAULT_TWO); + (*categoryMenus)[tool->displayCategory()].insert(tool->order(), cmd); } } } diff --git a/src/plugins/coreplugin/externaltool.h b/src/plugins/coreplugin/externaltool.h index a5b307c6f14a974d1a8e161fc5e5f68948172480..53b02b712a38abd8e54d56a6452b97e60ca4637b 100644 --- a/src/plugins/coreplugin/externaltool.h +++ b/src/plugins/coreplugin/externaltool.h @@ -32,6 +32,7 @@ #include "icore.h" #include "core_global.h" +#include "actionmanager/command.h" #include <utils/qtcprocess.h> @@ -138,6 +139,8 @@ private slots: private: void initialize(); + void parseDirectory(const QString &directory, QMap<QString, QMultiMap<int, Command*> > *categoryMenus, + bool ignoreDuplicates = false); static ExternalToolManager *m_instance; Core::ICore *m_core;