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
46 CopiedString m_menu_name;
47 const _QERPluginTable *mpTable;
48 std::list<CopiedString> m_CommandStrings;
49 std::list<CopiedString> m_CommandTitleStrings;
50 std::list<std::size_t> m_CommandIDs;
54 build directly from a SYN_PROVIDE interface
56 CPluginSlot( GtkWidget* 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();
64 std::size_t getCommandCount();
65 const char* getCommand( std::size_t n );
66 const char* getCommandTitle( std::size_t n );
67 void addMenuID( std::size_t n );
68 bool ownsCommandID( std::size_t n );
72 CPluginSlot::CPluginSlot( GtkWidget* main_window, const char* name, const _QERPluginTable& table ){
76 const char* commands = mpTable->m_pfnQERPlug_GetCommandList();
77 const char* titles = mpTable->m_pfnQERPlug_GetCommandTitleList();
79 StringTokeniser commandTokeniser( commands, ",;" );
80 StringTokeniser titleTokeniser( titles, ",;" );
82 const char* cmdToken = commandTokeniser.getToken();
83 const char *titleToken = titleTokeniser.getToken();
84 while ( !string_empty( cmdToken ) )
86 if ( string_empty( titleToken ) ) {
87 m_CommandStrings.push_back( cmdToken );
88 m_CommandTitleStrings.push_back( cmdToken );
89 cmdToken = commandTokeniser.getToken();
94 m_CommandStrings.push_back( cmdToken );
95 m_CommandTitleStrings.push_back( titleToken );
96 cmdToken = commandTokeniser.getToken();
97 titleToken = titleTokeniser.getToken();
100 mpTable->m_pfnQERPlug_Init( 0, (void*)main_window );
103 const char* CPluginSlot::getMenuName(){
104 return m_menu_name.c_str();
107 std::size_t CPluginSlot::getCommandCount(){
108 return m_CommandStrings.size();
111 const char* CPluginSlot::getCommand( std::size_t n ){
112 std::list<CopiedString>::iterator i = m_CommandStrings.begin();
115 return ( *i ).c_str();
118 const char* CPluginSlot::getCommandTitle( std::size_t n ){
119 std::list<CopiedString>::iterator i = m_CommandTitleStrings.begin();
122 return ( *i ).c_str();
125 void CPluginSlot::addMenuID( std::size_t n ){
126 m_CommandIDs.push_back( n );
129 bool CPluginSlot::ownsCommandID( std::size_t n ){
130 for ( std::list<std::size_t>::iterator i = m_CommandIDs.begin(); i != m_CommandIDs.end(); ++i )
139 void CPluginSlot::Dispatch( const char *p ){
141 Select_GetBounds( vMin, vMax );
142 mpTable->m_pfnQERPlug_Dispatch( p, reinterpret_cast<float*>( &vMin ), reinterpret_cast<float*>( &vMax ), true ); //QE_SingleBrush(true));
148 std::list<CPluginSlot *> mSlots;
150 virtual ~CPluginSlots();
152 void AddPluginSlot( GtkWidget* main_window, const char* name, const _QERPluginTable& table ){
153 mSlots.push_back( new CPluginSlot( main_window, name, table ) );
156 void PopulateMenu( PluginsVisitor& menu );
157 bool Dispatch( std::size_t n, const char* p );
160 CPluginSlots::~CPluginSlots(){
161 std::list<CPluginSlot *>::iterator iSlot;
162 for ( iSlot = mSlots.begin(); iSlot != mSlots.end(); ++iSlot )
169 void CPluginSlots::PopulateMenu( PluginsVisitor& menu ){
170 std::list<CPluginSlot *>::iterator iPlug;
171 for ( iPlug = mSlots.begin(); iPlug != mSlots.end(); ++iPlug )
173 menu.visit( *( *iPlug ) );
177 bool CPluginSlots::Dispatch( std::size_t n, const char* p ){
178 std::list<CPluginSlot *>::iterator iPlug;
179 for ( iPlug = mSlots.begin(); iPlug != mSlots.end(); ++iPlug )
181 CPluginSlot *pPlug = *iPlug;
182 if ( pPlug->ownsCommandID( n ) ) {
183 pPlug->Dispatch( p );
190 CPluginSlots g_plugin_slots;
193 void FillPluginSlots( CPluginSlots& slots, GtkWidget* main_window ){
194 class AddPluginVisitor : public PluginModules::Visitor
196 CPluginSlots& m_slots;
197 GtkWidget* m_main_window;
199 AddPluginVisitor( CPluginSlots& slots, GtkWidget* main_window )
200 : m_slots( slots ), m_main_window( main_window ){
202 void visit( const char* name, const _QERPluginTable& table ) const {
203 m_slots.AddPluginSlot( m_main_window, name, table );
205 } visitor( slots, main_window );
207 Radiant_getPluginModules().foreachModule( visitor );
211 #include "pluginmanager.h"
213 CPlugInManager g_PlugInMgr;
215 CPlugInManager& GetPlugInMgr(){
219 void CPlugInManager::Dispatch( std::size_t n, const char * p ){
220 g_plugin_slots.Dispatch( n, p );
223 void CPlugInManager::Init( GtkWidget* main_window ){
224 FillPluginSlots( g_plugin_slots, main_window );
227 void CPlugInManager::constructMenu( PluginsVisitor& menu ){
228 g_plugin_slots.PopulateMenu( menu );
231 void CPlugInManager::Shutdown(){