1
#ifndef PLUGINMANAGER_H
2
#define PLUGINMANAGER_H
7
#include <wx/dynarray.h>
8
#include "globals.h" // PluginType
16
class cbConfigurationPanel;
18
class wxDynamicLibrary;
21
class CodeBlocksEvent;
25
// typedefs for plugins' function pointers
26
typedef void(*PluginSDKVersionProc)(int*,int*,int*);
27
typedef cbPlugin*(*CreatePluginProc)();
28
typedef void(*FreePluginProc)(cbPlugin*);
30
/** Information about the plugin */
39
wxString authorWebsite;
44
// struct with info about each pluing
47
PluginInfo info; // plugin's info struct
48
wxString fileName; // plugin's filename
49
wxDynamicLibrary* library; // plugin's library
50
FreePluginProc freeProc; // plugin's release function pointer
51
cbPlugin* plugin; // the plugin itself
54
WX_DEFINE_ARRAY(PluginElement*, PluginElementsArray);
55
WX_DEFINE_ARRAY(cbPlugin*, PluginsArray);
56
WX_DEFINE_ARRAY(cbConfigurationPanel*, ConfigurationPanelsArray);
59
* PluginManager manages plugins.
61
* There are two plugin types: binary and scripted.
63
* Binary plugins are dynamically loaded shared libraries (dll/so) which
64
* can do pretty much anything with the SDK.
66
* Script plugins are more lightweight and are very convenient for
67
* smaller scale/functionality plugins.
69
class DLLIMPORT PluginManager : public Mgr<PluginManager>, public wxEvtHandler
72
friend class Mgr<PluginManager>;
73
friend class Manager; // give Manager access to our private members
74
void CreateMenu(wxMenuBar* menuBar);
75
void ReleaseMenu(wxMenuBar* menuBar);
77
void RegisterPlugin(const wxString& name,
78
CreatePluginProc createProc,
79
FreePluginProc freeProc,
80
PluginSDKVersionProc versionProc);
82
int ScanForPlugins(const wxString& path);
83
bool LoadPlugin(const wxString& pluginName);
84
void LoadAllPlugins();
85
void UnloadAllPlugins();
86
void UnloadPlugin(cbPlugin* plugin);
87
int ExecutePlugin(const wxString& pluginName);
88
int ConfigurePlugin(const wxString& pluginName);
90
bool AttachPlugin(cbPlugin* plugin);
91
bool DetachPlugin(cbPlugin* plugin);
93
bool InstallPlugin(const wxString& pluginName, bool forAllUsers = true, bool askForConfirmation = true);
94
bool UninstallPlugin(cbPlugin* plugin, bool removeFiles = true);
95
bool ExportPlugin(cbPlugin* plugin, const wxString& filename);
97
const PluginInfo* GetPluginInfo(const wxString& pluginName);
98
const PluginInfo* GetPluginInfo(cbPlugin* plugin);
100
PluginElementsArray& GetPlugins(){ return m_Plugins; }
102
PluginElement* FindElementByName(const wxString& pluginName);
103
cbPlugin* FindPluginByName(const wxString& pluginName);
104
cbPlugin* FindPluginByFileName(const wxString& pluginFileName);
106
PluginsArray GetToolOffers();
107
PluginsArray GetMimeOffers();
108
PluginsArray GetCompilerOffers();
109
PluginsArray GetDebuggerOffers();
110
PluginsArray GetCodeCompletionOffers();
111
PluginsArray GetOffersFor(PluginType type);
112
void AskPluginsForModuleMenu(const ModuleType type, wxMenu* menu, const FileTreeData* data = 0);
113
void NotifyPlugins(CodeBlocksEvent& event);
114
cbMimePlugin* GetMIMEHandlerForFile(const wxString& filename);
115
void GetConfigurationPanels(int group, wxWindow* parent, ConfigurationPanelsArray& arrayToFill);
116
void GetProjectConfigurationPanels(wxWindow* parent, cbProject* project, ConfigurationPanelsArray& arrayToFill);
118
void SetupLocaleDomain(const wxString& DomainName);
123
void OnScriptMenu(wxCommandEvent& event);
124
void OnScriptModuleMenu(wxCommandEvent& event);
126
/// @return True if the plugin should be loaded, false if not.
127
bool ReadManifestFile(const wxString& pluginFilename,
128
const wxString& pluginName = wxEmptyString,
129
PluginInfo* infoOut = 0);
130
bool ExtractFile(const wxString& bundlename,
131
const wxString& src_filename,
132
const wxString& dst_filename);
134
PluginElementsArray m_Plugins;
135
wxString m_CurrentlyLoadingFilename;
136
wxDynamicLibrary* m_pCurrentlyLoadingLib;
137
TiXmlDocument* m_pCurrentlyLoadingManifestDoc;
139
// this struct fills the following vector each time
140
// RegisterPlugin() is called.
141
// this vector is then used in LoadPlugin() (which triggered
142
// the call to RegisterPlugin()) to actually
143
// load the plugins and then it is cleared.
145
// This is done to avoid global variables initialization order issues
146
// inside the plugins (yes, it happened to me ;)).
147
struct PluginRegistration
149
PluginRegistration() : createProc(0), freeProc(0), versionProc(0) {}
150
PluginRegistration(const PluginRegistration& rhs)
152
createProc(rhs.createProc),
153
freeProc(rhs.freeProc),
154
versionProc(rhs.versionProc),
158
CreatePluginProc createProc;
159
FreePluginProc freeProc;
160
PluginSDKVersionProc versionProc;
163
std::vector<PluginRegistration> m_RegisteredPlugins;
165
DECLARE_EVENT_TABLE()
168
#endif // PLUGINMANAGER_H