From b9f9cf3d79bfac287def555f73cd1d0eed91e394 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Thu, 6 Jan 2011 11:01:57 +0100
Subject: [PATCH] Also look for tools in user's resource path

---
 src/plugins/coreplugin/externaltool.cpp | 56 +++++++++++++++----------
 src/plugins/coreplugin/externaltool.h   |  3 ++
 2 files changed, 36 insertions(+), 23 deletions(-)

diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp
index 3806175dea2..f1ad60023a1 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 a5b307c6f14..53b02b712a3 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;
-- 
GitLab