git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12897 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			144 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        dllwidget.h
 | |
| // Purpose:     Dynamically loadable C++ widget for wxPython
 | |
| // Author:      Vaclav Slavik
 | |
| // Created:     2001/12/03
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) 2001 Vaclav Slavik
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifdef __GNUG__
 | |
| #pragma interface "dllwidget.h"
 | |
| #endif
 | |
| 
 | |
| #ifndef __DLLWIDGET_H__
 | |
| #define __DLLWIDGET_H__
 | |
| 
 | |
| #include "wx/panel.h"
 | |
| 
 | |
| /*
 | |
| 
 | |
| wxDllWidget can be used to embed a wxWindow implemented in C++ in your
 | |
| wxPython application without the need to write a SWIG interface. Widget's code
 | |
| is stored in shared library or DLL that exports DLL_WidgetFactory symbol
 | |
| and loaded at runtime. All you have to do is to pass the name of DLL and the class
 | |
| to create to wxDllWidget's ctor.
 | |
| 
 | |
| Runtime-loadable widget must have HandleCommand method (see the example) that is
 | |
| used to communicate with Python app. You call wxDllWidget.SendCommand(cmd,param) from
 | |
| Python and it in turn calls HandleCommand of the loaded widget.
 | |
| 
 | |
| You must use DECLARE_DLL_WIDGET, BEGIN_WIDGET_LIBRARY, END_WIDGET_LIBRARY and
 | |
| REGISTER_WIDGET macros in your C++ module in order to provide all the meat
 | |
| wxDllWidget needs.
 | |
| 
 | |
| Example of use:
 | |
| 
 | |
|     #define CMD_MAKEWHITE     1
 | |
| 
 | |
|     class MyWindow : public wxWindow
 | |
|     {
 | |
|     public:
 | |
|         MyWindow(wxWindow *parent, long style)
 | |
|             : wxWindow(parent, -1) {}
 | |
| 
 | |
|         int HandleCommand(int cmd, const wxString& param)
 | |
|         {
 | |
|             if (cmd == CMD_MAKEWHITE)
 | |
|                 SetBackgroundColour(*wxWHITE);
 | |
|             return 0;
 | |
|         }
 | |
|     };
 | |
|     DECLARE_DLL_WIDGET(MyWindow)
 | |
| 
 | |
|     class MyCanvasWindow : public wxScrolledWindow
 | |
|     {
 | |
|         ...
 | |
|     };
 | |
|     DECLARE_DLL_WIDGET(MyCanvasWindow)
 | |
| 
 | |
|     BEGIN_WIDGET_LIBRARY()
 | |
|         REGISTER_WIDGET(MyWindow)
 | |
|         REGISTER_WIDGET(MyCanvasWindow)
 | |
|     END_WIDGET_LIBRARY()
 | |
| 
 | |
| */
 | |
| 
 | |
| 
 | |
| 
 | |
| class WXDLLEXPORT wxDynamicLibrary;
 | |
| 
 | |
| typedef int (*wxSendCommandFunc)(wxWindow *wnd, int cmd, const wxString& param);
 | |
| 
 | |
| class wxDllWidget : public wxPanel
 | |
| {
 | |
| public:
 | |
|     wxDllWidget(wxWindow *parent,
 | |
|                 wxWindowID id = -1,
 | |
|                 const wxString& dllName = wxEmptyString,
 | |
|                 const wxString& className = wxEmptyString,
 | |
|                 const wxPoint& pos = wxDefaultPosition,
 | |
|                 const wxSize& size = wxDefaultSize,
 | |
|                 long style = 0);
 | |
|     virtual ~wxDllWidget();
 | |
| 
 | |
|     bool Ok() { return m_widget != NULL; }
 | |
| 
 | |
|     virtual int SendCommand(int cmd, const wxString& param = wxEmptyString);
 | |
|     virtual wxWindow* GetWidgetWindow() { return m_widget; }
 | |
| 
 | |
|     virtual void AddChild(wxWindowBase *child);
 | |
| 
 | |
|     static wxString GetDllExt();
 | |
| 
 | |
| 
 | |
| protected:
 | |
|     bool LoadWidget(const wxString& dll, const wxString& className, long style);
 | |
|     void UnloadWidget();
 | |
| 
 | |
| protected:
 | |
|     wxWindow*           m_widget;
 | |
|     wxSendCommandFunc   m_cmdFunc;
 | |
|     wxDynamicLibrary*   m_lib;
 | |
|     bool                m_controlAdded;
 | |
| 
 | |
| private:
 | |
|     DECLARE_ABSTRACT_CLASS(wxDllWidget)
 | |
| };
 | |
| 
 | |
| 
 | |
| #define DECLARE_DLL_WIDGET(widget) \
 | |
|     static int SendCommandTo##widget(wxWindow *wnd, int cmd, const wxString& param) \
 | |
|     { \
 | |
|         return wxStaticCast(wnd, widget)->HandleCommand(cmd, param); \
 | |
|     }
 | |
| 
 | |
| 
 | |
| #define BEGIN_WIDGET_LIBRARY() \
 | |
|     extern "C" WXEXPORT bool DLL_WidgetFactory( \
 | |
|                 const wxString& className, \
 | |
|                 wxWindow *parent, \
 | |
|                 long style, \
 | |
|                 wxWindow **classInst, \
 | |
|                 wxSendCommandFunc *cmdFunc) \
 | |
|     { \
 | |
|         wxClassInfo::CleanUpClasses(); \
 | |
|         wxClassInfo::InitializeClasses();
 | |
| 
 | |
| 
 | |
| #define REGISTER_WIDGET(widget) \
 | |
|         if ( className == wxT(#widget) ) \
 | |
|         { \
 | |
|             *classInst = new widget(parent, style); \
 | |
|             *cmdFunc = SendCommandTo##widget; \
 | |
|             return TRUE; \
 | |
|         }
 | |
| 
 | |
| 
 | |
| #define END_WIDGET_LIBRARY() \
 | |
|        return FALSE; \
 | |
|     }
 | |
| 
 | |
| #endif // __DLLWIDGET_H__
 |