from wxWindow to be loaded from a C++ .dll (or .so) and be used in a wxPython program, without the widget having to be SWIGged first. Various updates for distribs git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12890 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        dllwidget.cpp
 | 
						|
// 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 implementation "dllwidget.h"
 | 
						|
#endif
 | 
						|
 | 
						|
// For compilers that support precompilation, includes "wx.h".
 | 
						|
#include "wx/wxprec.h"
 | 
						|
 | 
						|
#ifdef __BORLANDC__
 | 
						|
    #pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
#include "wx/defs.h"
 | 
						|
#include "wx/dynlib.h"
 | 
						|
#include "wx/sizer.h"
 | 
						|
 | 
						|
#include "dllwidget.h"
 | 
						|
 | 
						|
 | 
						|
IMPLEMENT_ABSTRACT_CLASS(wxDllWidget, wxPanel)
 | 
						|
 | 
						|
wxDllWidget::wxDllWidget(wxWindow *parent,
 | 
						|
                         wxWindowID id,
 | 
						|
                         const wxString& dllName, const wxString& className,
 | 
						|
                         const wxPoint& pos, const wxSize& size,
 | 
						|
                         long style)
 | 
						|
    : wxPanel(parent, id, pos, size, wxTAB_TRAVERSAL | wxNO_BORDER,
 | 
						|
              className + wxT("_container")),
 | 
						|
    m_widget(NULL), m_lib(NULL), m_controlAdded(FALSE)
 | 
						|
{
 | 
						|
    SetBackgroundColour(wxColour(255, 0, 255));
 | 
						|
    if ( !!className )
 | 
						|
        LoadWidget(dllName, className, style);
 | 
						|
}
 | 
						|
 | 
						|
wxDllWidget::~wxDllWidget()
 | 
						|
{
 | 
						|
    UnloadWidget();
 | 
						|
}
 | 
						|
 | 
						|
void wxDllWidget::AddChild(wxWindowBase *child)
 | 
						|
{
 | 
						|
    wxASSERT_MSG( !m_controlAdded, wxT("Couldn't load two widgets into one container!") )
 | 
						|
 | 
						|
    wxPanel::AddChild(child);
 | 
						|
 | 
						|
    m_controlAdded = TRUE;
 | 
						|
    wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
 | 
						|
    sizer->Add((wxWindow*)child, 1, wxEXPAND);
 | 
						|
    SetSizer(sizer);
 | 
						|
    SetAutoLayout(TRUE);
 | 
						|
    Layout();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
wxString wxDllWidget::GetDllExt()
 | 
						|
{
 | 
						|
    return wxDllLoader::GetDllExt();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
typedef WXDLLEXPORT bool (*DLL_WidgetFactory_t)(const wxString& className,
 | 
						|
                                                wxWindow *parent,
 | 
						|
                                                long style,
 | 
						|
                                                wxWindow **classInst,
 | 
						|
                                                wxSendCommandFunc *cmdFunc);
 | 
						|
 | 
						|
bool wxDllWidget::LoadWidget(const wxString& dll, const wxString& className,
 | 
						|
                             long style)
 | 
						|
{
 | 
						|
    UnloadWidget();
 | 
						|
 | 
						|
    // Load the dynamic library
 | 
						|
    m_lib = new wxDynamicLibrary(dll);
 | 
						|
    if ( !m_lib->IsLoaded() )
 | 
						|
    {
 | 
						|
        delete m_lib;
 | 
						|
        m_lib = NULL;
 | 
						|
        return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    DLL_WidgetFactory_t factory;
 | 
						|
    factory = (DLL_WidgetFactory_t) m_lib->GetSymbol(wxT("DLL_WidgetFactory"));
 | 
						|
    if ( factory == NULL)
 | 
						|
    {
 | 
						|
        delete m_lib;
 | 
						|
        m_lib = NULL;
 | 
						|
        return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    if ( !factory(className, this, style, &m_widget, &m_cmdFunc) )
 | 
						|
    {
 | 
						|
        delete m_widget;
 | 
						|
        delete m_lib;
 | 
						|
        m_lib = NULL;
 | 
						|
        m_widget = NULL;
 | 
						|
        return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
void wxDllWidget::UnloadWidget()
 | 
						|
{
 | 
						|
    if ( m_widget )
 | 
						|
    {
 | 
						|
        DestroyChildren();
 | 
						|
        m_widget = NULL;
 | 
						|
        delete m_lib;
 | 
						|
        m_lib = NULL;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
int wxDllWidget::SendCommand(int cmd, const wxString& param)
 | 
						|
{
 | 
						|
    wxASSERT_MSG( m_widget && m_cmdFunc, wxT("Sending command to not loaded widget!"));
 | 
						|
 | 
						|
    return m_cmdFunc(m_widget, cmd, param);
 | 
						|
}
 |