]> git.saurik.com Git - wxWidgets.git/blame - wxPython/contrib/dllwidget/dllwidget.cpp
(blind) GTK1 compilation fix
[wxWidgets.git] / wxPython / contrib / dllwidget / dllwidget.cpp
CommitLineData
4a61305d
RD
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
29IMPLEMENT_ABSTRACT_CLASS(wxDllWidget, wxPanel)
30
31wxDllWidget::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")),
dabbc6a5 38 m_widget(NULL), m_lib(NULL), m_controlAdded(false)
4a61305d
RD
39{
40 SetBackgroundColour(wxColour(255, 0, 255));
41 if ( !!className )
42 LoadWidget(dllName, className, style);
43}
44
45wxDllWidget::~wxDllWidget()
46{
47 UnloadWidget();
48}
49
50void wxDllWidget::AddChild(wxWindowBase *child)
51{
63fd5f0b 52 wxASSERT_MSG( !m_controlAdded, wxT("Couldn't load two widgets into one container!") );
4a61305d
RD
53
54 wxPanel::AddChild(child);
55
dabbc6a5 56 m_controlAdded = true;
4a61305d
RD
57 wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
58 sizer->Add((wxWindow*)child, 1, wxEXPAND);
59 SetSizer(sizer);
4a61305d
RD
60 Layout();
61}
62
63
64wxString wxDllWidget::GetDllExt()
65{
66 return wxDllLoader::GetDllExt();
67}
68
69
70typedef WXDLLEXPORT bool (*DLL_WidgetFactory_t)(const wxString& className,
71 wxWindow *parent,
72 long style,
73 wxWindow **classInst,
74 wxSendCommandFunc *cmdFunc);
75
76bool wxDllWidget::LoadWidget(const wxString& dll, const wxString& className,
77 long style)
78{
79 UnloadWidget();
80
81 // Load the dynamic library
82 m_lib = new wxDynamicLibrary(dll);
83 if ( !m_lib->IsLoaded() )
84 {
85 delete m_lib;
86 m_lib = NULL;
dabbc6a5 87 return false;
4a61305d
RD
88 }
89
90 DLL_WidgetFactory_t factory;
91 factory = (DLL_WidgetFactory_t) m_lib->GetSymbol(wxT("DLL_WidgetFactory"));
92 if ( factory == NULL)
93 {
94 delete m_lib;
95 m_lib = NULL;
dabbc6a5 96 return false;
4a61305d
RD
97 }
98
99 if ( !factory(className, this, style, &m_widget, &m_cmdFunc) )
100 {
101 delete m_widget;
102 delete m_lib;
103 m_lib = NULL;
104 m_widget = NULL;
dabbc6a5 105 return false;
4a61305d
RD
106 }
107
dabbc6a5 108 return true;
4a61305d
RD
109}
110
111void wxDllWidget::UnloadWidget()
112{
113 if ( m_widget )
114 {
115 DestroyChildren();
116 m_widget = NULL;
117 delete m_lib;
118 m_lib = NULL;
119 }
120}
121
122int wxDllWidget::SendCommand(int cmd, const wxString& param)
123{
124 wxASSERT_MSG( m_widget && m_cmdFunc, wxT("Sending command to not loaded widget!"));
125
126 return m_cmdFunc(m_widget, cmd, param);
127}