]> git.saurik.com Git - wxWidgets.git/blob - wxPython/contrib/dllwidget/dllwidget.cpp
AddPendingEvent() is not virtual
[wxWidgets.git] / wxPython / contrib / dllwidget / dllwidget.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dllwidget.cpp
3 // Purpose: Dynamically loadable C++ widget for wxPython
4 // Author: Vaclav Slavik
5 // Created: 2001/12/03
6 // RCS-ID: $Id$
7 // Copyright: (c) 2001 Vaclav Slavik
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifdef __GNUG__
12 #pragma implementation "dllwidget.h"
13 #endif
14
15 // For compilers that support precompilation, includes "wx.h".
16 #include "wx/wxprec.h"
17
18 #ifdef __BORLANDC__
19 #pragma hdrstop
20 #endif
21
22 #include "wx/defs.h"
23 #include "wx/dynlib.h"
24 #include "wx/sizer.h"
25
26 #include "dllwidget.h"
27
28
29 IMPLEMENT_ABSTRACT_CLASS(wxDllWidget, wxPanel)
30
31 wxDllWidget::wxDllWidget(wxWindow *parent,
32 wxWindowID id,
33 const wxString& dllName, const wxString& className,
34 const wxPoint& pos, const wxSize& size,
35 long style)
36 : wxPanel(parent, id, pos, size, wxTAB_TRAVERSAL | wxNO_BORDER,
37 className + wxT("_container")),
38 m_widget(NULL), m_lib(NULL), m_controlAdded(FALSE)
39 {
40 SetBackgroundColour(wxColour(255, 0, 255));
41 if ( !!className )
42 LoadWidget(dllName, className, style);
43 }
44
45 wxDllWidget::~wxDllWidget()
46 {
47 UnloadWidget();
48 }
49
50 void wxDllWidget::AddChild(wxWindowBase *child)
51 {
52 wxASSERT_MSG( !m_controlAdded, wxT("Couldn't load two widgets into one container!") );
53
54 wxPanel::AddChild(child);
55
56 m_controlAdded = TRUE;
57 wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
58 sizer->Add((wxWindow*)child, 1, wxEXPAND);
59 SetSizer(sizer);
60 SetAutoLayout(TRUE);
61 Layout();
62 }
63
64
65 wxString wxDllWidget::GetDllExt()
66 {
67 return wxDllLoader::GetDllExt();
68 }
69
70
71 typedef WXDLLEXPORT bool (*DLL_WidgetFactory_t)(const wxString& className,
72 wxWindow *parent,
73 long style,
74 wxWindow **classInst,
75 wxSendCommandFunc *cmdFunc);
76
77 bool wxDllWidget::LoadWidget(const wxString& dll, const wxString& className,
78 long style)
79 {
80 UnloadWidget();
81
82 // Load the dynamic library
83 m_lib = new wxDynamicLibrary(dll);
84 if ( !m_lib->IsLoaded() )
85 {
86 delete m_lib;
87 m_lib = NULL;
88 return FALSE;
89 }
90
91 DLL_WidgetFactory_t factory;
92 factory = (DLL_WidgetFactory_t) m_lib->GetSymbol(wxT("DLL_WidgetFactory"));
93 if ( factory == NULL)
94 {
95 delete m_lib;
96 m_lib = NULL;
97 return FALSE;
98 }
99
100 if ( !factory(className, this, style, &m_widget, &m_cmdFunc) )
101 {
102 delete m_widget;
103 delete m_lib;
104 m_lib = NULL;
105 m_widget = NULL;
106 return FALSE;
107 }
108
109 return TRUE;
110 }
111
112 void wxDllWidget::UnloadWidget()
113 {
114 if ( m_widget )
115 {
116 DestroyChildren();
117 m_widget = NULL;
118 delete m_lib;
119 m_lib = NULL;
120 }
121 }
122
123 int wxDllWidget::SendCommand(int cmd, const wxString& param)
124 {
125 wxASSERT_MSG( m_widget && m_cmdFunc, wxT("Sending command to not loaded widget!"));
126
127 return m_cmdFunc(m_widget, cmd, param);
128 }