2 Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 // PlugInManager.cpp: implementation of the CPlugInManager class.
24 //////////////////////////////////////////////////////////////////////
26 #include "pluginmanager.h"
28 #include "modulesystem.h"
29 #include "qerplugin.h"
32 #include "math/vector.h"
33 #include "string/string.h"
39 #include "modulesystem.h"
43 /* plugin manager --------------------------------------- */
44 class CPluginSlot : public IPlugIn {
45 CopiedString m_menu_name;
46 const _QERPluginTable *mpTable;
47 std::list<CopiedString> m_CommandStrings;
48 std::list<CopiedString> m_CommandTitleStrings;
49 std::list<std::size_t> m_CommandIDs;
53 build directly from a SYN_PROVIDE interface
55 CPluginSlot(ui::Widget main_window, const char *name, const _QERPluginTable &table);
58 dispatching a command by name to the plugin
60 void Dispatch(const char *p);
62 // IPlugIn ------------------------------------------------------------
63 const char *getMenuName();
65 std::size_t getCommandCount();
67 const char *getCommand(std::size_t n);
69 const char *getCommandTitle(std::size_t n);
71 void addMenuID(std::size_t n);
73 bool ownsCommandID(std::size_t n);
77 CPluginSlot::CPluginSlot(ui::Widget main_window, const char *name, const _QERPluginTable &table)
82 const char *commands = mpTable->m_pfnQERPlug_GetCommandList();
83 const char *titles = mpTable->m_pfnQERPlug_GetCommandTitleList();
85 StringTokeniser commandTokeniser(commands, ",;");
86 StringTokeniser titleTokeniser(titles, ",;");
88 const char *cmdToken = commandTokeniser.getToken();
89 const char *titleToken = titleTokeniser.getToken();
90 while (!string_empty(cmdToken)) {
91 if (string_empty(titleToken)) {
92 m_CommandStrings.push_back(cmdToken);
93 m_CommandTitleStrings.push_back(cmdToken);
94 cmdToken = commandTokeniser.getToken();
97 m_CommandStrings.push_back(cmdToken);
98 m_CommandTitleStrings.push_back(titleToken);
99 cmdToken = commandTokeniser.getToken();
100 titleToken = titleTokeniser.getToken();
103 mpTable->m_pfnQERPlug_Init(0, (void *) main_window);
106 const char *CPluginSlot::getMenuName()
108 return m_menu_name.c_str();
111 std::size_t CPluginSlot::getCommandCount()
113 return m_CommandStrings.size();
116 const char *CPluginSlot::getCommand(std::size_t n)
118 std::list<CopiedString>::iterator i = m_CommandStrings.begin();
125 const char *CPluginSlot::getCommandTitle(std::size_t n)
127 std::list<CopiedString>::iterator i = m_CommandTitleStrings.begin();
134 void CPluginSlot::addMenuID(std::size_t n)
136 m_CommandIDs.push_back(n);
139 bool CPluginSlot::ownsCommandID(std::size_t n)
141 for (std::list<std::size_t>::iterator i = m_CommandIDs.begin(); i != m_CommandIDs.end(); ++i) {
149 void CPluginSlot::Dispatch(const char *p)
152 Select_GetBounds(vMin, vMax);
153 mpTable->m_pfnQERPlug_Dispatch(p, reinterpret_cast<float *>( &vMin ), reinterpret_cast<float *>( &vMax ),
154 true); //QE_SingleBrush(true));
159 std::list<CPluginSlot *> mSlots;
161 virtual ~CPluginSlots();
163 void AddPluginSlot(ui::Widget main_window, const char *name, const _QERPluginTable &table)
165 mSlots.push_back(new CPluginSlot(main_window, name, table));
168 void PopulateMenu(PluginsVisitor &menu);
170 bool Dispatch(std::size_t n, const char *p);
173 CPluginSlots::~CPluginSlots()
175 std::list<CPluginSlot *>::iterator iSlot;
176 for (iSlot = mSlots.begin(); iSlot != mSlots.end(); ++iSlot) {
182 void CPluginSlots::PopulateMenu(PluginsVisitor &menu)
184 std::list<CPluginSlot *>::iterator iPlug;
185 for (iPlug = mSlots.begin(); iPlug != mSlots.end(); ++iPlug) {
186 menu.visit(*(*iPlug));
190 bool CPluginSlots::Dispatch(std::size_t n, const char *p)
192 std::list<CPluginSlot *>::iterator iPlug;
193 for (iPlug = mSlots.begin(); iPlug != mSlots.end(); ++iPlug) {
194 CPluginSlot *pPlug = *iPlug;
195 if (pPlug->ownsCommandID(n)) {
203 CPluginSlots g_plugin_slots;
206 void FillPluginSlots(CPluginSlots &slots, ui::Widget main_window)
208 class AddPluginVisitor : public PluginModules::Visitor {
209 CPluginSlots &m_slots;
210 ui::Widget m_main_window;
212 AddPluginVisitor(CPluginSlots &slots, ui::Widget main_window)
213 : m_slots(slots), m_main_window(main_window)
217 void visit(const char *name, const _QERPluginTable &table) const
219 m_slots.AddPluginSlot(m_main_window, name, table);
221 } visitor(slots, main_window);
223 Radiant_getPluginModules().foreachModule(visitor);
227 #include "pluginmanager.h"
229 CPlugInManager g_PlugInMgr;
231 CPlugInManager &GetPlugInMgr()
236 void CPlugInManager::Dispatch(std::size_t n, const char *p)
238 g_plugin_slots.Dispatch(n, p);
241 void CPlugInManager::Init(ui::Widget main_window)
243 FillPluginSlots(g_plugin_slots, main_window);
246 void CPlugInManager::constructMenu(PluginsVisitor &menu)
248 g_plugin_slots.PopulateMenu(menu);
251 void CPlugInManager::Shutdown()