#ifndef SDK_EVENTS_H
#define SDK_EVENTS_H

#include <wx/event.h>
#include "settings.h"
#include "cbproject.h"
#include "cbeditor.h"
#include "cbplugin.h"

class EVTIMPORT CodeBlocksEvent : public wxCommandEvent
{
	public:
		CodeBlocksEvent(wxEventType commandType = wxEVT_NULL, int id = 0, cbProject* project = 0L, cbEditor* editor = 0L, cbPlugin* plugin = 0L)
			: wxCommandEvent(commandType, id),
			m_pProject(project),
			m_pEditor(editor),
			m_pPlugin(plugin),
			m_X(0),
			m_Y(0) {}
		CodeBlocksEvent(const CodeBlocksEvent& event)
			: wxCommandEvent(event),
			m_pProject(event.m_pProject),
			m_pEditor(event.m_pEditor),
			m_pPlugin(event.m_pPlugin),
			m_X(event.m_X),
			m_Y(event.m_Y) {}
		virtual wxEvent *Clone() const { return new CodeBlocksEvent(*this); }

		cbProject* GetProject() const { return m_pProject; }
		void SetProject(cbProject* project){ m_pProject = project; }
		cbEditor* GetEditor() const { return m_pEditor; }
		void SetEditor(cbEditor* editor){ m_pEditor = editor; }
		cbPlugin* GetPlugin() const { return m_pPlugin; }
		void SetPlugin(cbPlugin* plugin){ m_pPlugin = plugin; }
		int GetX(){ return m_X; }
		void SetX(int x){ m_X = x; }
		int GetY(){ return m_Y; }
		void SetY(int y){ m_Y = y; }
	protected:
		cbProject* m_pProject;
		cbEditor* m_pEditor;
		cbPlugin* m_pPlugin;
		// for some editor events
		int m_X;
		int m_Y;
	private:
		DECLARE_DYNAMIC_CLASS(CodeBlocksEvent)
};

typedef void (wxEvtHandler::*CodeBlocksEventFunction)(CodeBlocksEvent&);

// app events
DECLARE_CB_EVENT_TYPE(cbEVT_APP_STARTUP_DONE)
#define EVT_APP_STARTUP_DONE(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_APP_STARTUP_DONE, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_APP_START_SHUTDOWN)
#define EVT_APP_START_SHUTDOWN(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_APP_START_SHUTDOWN, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),

// plugin events
DECLARE_CB_EVENT_TYPE(cbEVT_PLUGIN_ATTACHED)
#define EVT_PLUGIN_ATTACHED(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PLUGIN_ATTACHED, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PLUGIN_RELEASED)
#define EVT_PLUGIN_RELEASED(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PLUGIN_RELEASED, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),

// editor events
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_CLOSE)
#define EVT_EDITOR_CLOSE(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_CLOSE, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_OPEN)
#define EVT_EDITOR_OPEN(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_OPEN, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_SAVE)
#define EVT_EDITOR_SAVE(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_SAVE, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_AUTOCOMPLETE)
#define EVT_EDITOR_AUTOCOMPLETE(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_AUTOCOMPLETE, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_CALLTIP)
#define EVT_EDITOR_CALLTIP(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_CALLTIP, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_TOOLTIP)
#define EVT_EDITOR_TOOLTIP(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_TOOLTIP, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_TOOLTIP_CANCEL)
#define EVT_EDITOR_TOOLTIP_CANCEL(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_TOOLTIP_CANCEL, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_USERLIST_SELECTION)
#define EVT_EDITOR_USERLIST_SELECTION(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_USERLIST_SELECTION, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_BREAKPOINT_ADDED)
#define EVT_EDITOR_BREAKPOINT_ADDED(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_BREAKPOINT_ADDED, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_BREAKPOINT_DELETED)
#define EVT_EDITOR_BREAKPOINT_DELETED(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_BREAKPOINT_DELETED, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_EDITOR_UPDATE_UI)
#define EVT_EDITOR_UPDATE_UI(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_EDITOR_UPDATE_UI, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),

// project events
DECLARE_CB_EVENT_TYPE(cbEVT_PROJECT_CLOSE)
#define EVT_PROJECT_CLOSE(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PROJECT_CLOSE, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PROJECT_OPEN)
#define EVT_PROJECT_OPEN(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PROJECT_OPEN, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PROJECT_SAVE)
#define EVT_PROJECT_SAVE(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PROJECT_SAVE, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PROJECT_ACTIVATE)
#define EVT_PROJECT_ACTIVATE(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PROJECT_ACTIVATE, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PROJECT_FILE_ADDED)
#define EVT_PROJECT_FILE_ADDED(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PROJECT_FILE_ADDED, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PROJECT_FILE_REMOVED)
#define EVT_PROJECT_FILE_REMOVED(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PROJECT_FILE_REMOVED, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PROJECT_POPUP_MENU)
#define EVT_PROJECT_POPUP_MENU(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PROJECT_POPUP_MENU, -1, -1, (wxObjectEventFunction)(wxEventFunction)(CodeBlocksEventFunction)&fn, (wxObject *) NULL ),

// pipedprocess events
DECLARE_CB_EVENT_TYPE(cbEVT_PIPEDPROCESS_STDOUT)
#define EVT_PIPEDPROCESS_STDOUT(id, fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PIPEDPROCESS_STDOUT, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PIPEDPROCESS_STDERR)
#define EVT_PIPEDPROCESS_STDERR(id, fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PIPEDPROCESS_STDERR, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_PIPEDPROCESS_TERMINATED)
#define EVT_PIPEDPROCESS_TERMINATED(id, fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_PIPEDPROCESS_TERMINATED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),

// thread-pool events
DECLARE_CB_EVENT_TYPE(cbEVT_THREADTASK_STARTED)
#define EVT_THREADTASK_STARTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_THREADTASK_STARTED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_THREADTASK_ENDED)
#define EVT_THREADTASK_ENDED(id, fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_THREADTASK_ENDED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_THREADTASK_ALLDONE)
#define EVT_THREADTASK_ALLDONE(id, fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_THREADTASK_ALLDONE, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),

// request app to dock/undock a window
DECLARE_CB_EVENT_TYPE(cbEVT_DOCK_WINDOW)
#define EVT_DOCK_WINDOW(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_DOCK_WINDOW, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_UNDOCK_WINDOW)
#define EVT_UNDOCK_WINDOW(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_UNDOCK_WINDOW, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),
DECLARE_CB_EVENT_TYPE(cbEVT_SHOW_DOCK_WINDOW)
#define EVT_SHOW_DOCK_WINDOW(fn) DECLARE_EVENT_TABLE_ENTRY( cbEVT_SHOW_DOCK_WINDOW, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),

#endif // SDK_EVENTS_H


syntax highlighted by Code2HTML, v. 0.9.1