wxcore-0.13.2: src/include/wrapper.h
#ifndef __WRAPPER_H
#define __WRAPPER_H
/* MSC: disable warning about int-to-bool conversion (just affects performance) */
#pragma warning(disable: 4800)
/* MSC: disable warning about using different code page (just affects performance) */
#pragma warning(disable: 4819)
/* just to ensure that intptr_t exists */
#ifndef _MSC_VER
#include <inttypes.h>
/* MSVC-6 defines _MSC_VER=1200 */
#elif _MSC_VER> 1200
#else
/* MSVC-6 does not define intptr_t */
typedef int intptr_t;
#endif
#include "ewxw_def.h"
#include "wx/wx.h"
#if (wxVERSION_NUMBER >= 2600)
#include "wx/apptrait.h"
#endif
#if (wxVERSION_NUMBER < 2900)
#include "wx/tabctrl.h"
#endif
#include "wx/notebook.h"
#include "wx/spinctrl.h"
#include "wx/statline.h"
#include "wx/checklst.h"
#include "wx/treectrl.h"
#include "wx/grid.h"
#include "wx/calctrl.h"
#include "wx/dnd.h"
#include "wx/config.h"
#include "wx/imaglist.h"
#include "wx/listctrl.h"
#include "wx/splitter.h"
#include "wx/image.h"
#include "wx/clipbrd.h"
#include "wx/colordlg.h"
#include "wx/fontdlg.h"
#include "wx/sckipc.h"
#include "wx/html/helpctrl.h"
#include "wx/print.h"
#include "wx/sashwin.h"
#include "wx/laywin.h"
#include "wx/minifram.h"
#include "wx/mstream.h"
#include "wx/wizard.h"
#include "wx/socket.h"
#include "wx/artprov.h"
#include "wx/sound.h"
#define MAKE_EVENT_WRAPPER(evt) EWXWEXPORT(int,exp##evt)() { return (int)wx##evt; }
#define MAKE_UNDEFEVENT_WRAPPER(evt) EWXWEXPORT(int, exp##evt)() { return (int) wxEVT_NULL; }
extern "C"
{
typedef void _cdecl (*ClosureFun)( void* _fun, void* _data, void* _evt );
typedef bool _cdecl (*AppInitFunc)(void);
typedef void _cdecl (*EiffelFunc) (void* _obj, void* _evt);
typedef int _cdecl (*TextDropFunc) (void* _obj, long x, long y, void* _txt);
typedef int _cdecl (*FileDropFunc) (void* _obj, long x, long y, void* _fle, int _cnt);
typedef void _cdecl (*DragZeroFunc) (void* _obj);
typedef int _cdecl (*DragTwoFunc) (void* _obj, long x, long y);
typedef int _cdecl (*DragThreeFunc) (void* _obj, long x, long y, int def);
typedef void* _cdecl (*TGetText) (void* _obj, void* _txt);
typedef int _cdecl (*DataGetDataSize) (void* _obj);
typedef int _cdecl (*DataGetDataHere) (void* _obj, void* _buf);
typedef int _cdecl (*DataSetData) (void* _obj, int _size, const void* _buf);
typedef int _cdecl (*ValidateFunc) (void* _obj);
typedef int _cdecl (*TCPAdviseFunc) (void* _obj, void* _topic, void* _item, void* _data, int _size, int _fmt);
typedef int _cdecl (*TCPExecuteFunc) (void* _obj, void* _topic, void* _data, int _size, int _fmt);
typedef wxChar* _cdecl (*TCPRequestFunc) (void* _obj, void* _topic, void* _item, void* _size, int _fmt);
typedef int _cdecl (*TCPPokeFunc) (void* _obj, void* _topic, void* _item, void* _data, int _size, int _fmt);
typedef int _cdecl (*TCPStartAdviseFunc) (void* _obj, void* _topic, void* _item);
typedef int _cdecl (*TCPStopAdviseFunc) (void* _obj, void* _topic, void* _item);
typedef void* _cdecl (*TCPOnConnection) (void* _obj, void* _cnt);
typedef int _cdecl (*TCPOnDisconnect) (void* _obj);
typedef int _cdecl (*PrintBeginDocument) (void* _obj, int _start, int _end);
typedef void _cdecl (*PrintCommon) (void* _obj);
typedef int _cdecl (*PrintBeginPage) (void* _obj, int _page);
typedef void _cdecl (*PrintPageInfo) (void* _obj, int* _min, int* _max, int* _from, int* _to);
typedef int _cdecl (*PreviewFrameFunc) (void* _obj);
typedef int _cdecl (*TreeCompareFunc) (void* _obj, void* _itm1, void* _itm2);
}
/* Miscellaneous helper functions */
/* Copies the contents of a wxString to a buffer and returns the length of the string */
int copyStrToBuf(void* dst, wxString& src);
/* A Closure is used to call foreign functions. They are closures
because they don't just contain a function pointer but also some
local data supplied at creation time. The closures are reference counted
by 'Callbacks'. Each event handler uses callbacks to react to primitive
events like EVT_LEFT_CLICK and EVT_MOTION. These callbacks invoke the
corresponding closure. Due to reference counting, a single closure can
handle a range of events.
*/
class wxClosure : public wxClientData
{
protected:
int m_refcount; /* callbacks reference count the closures */
ClosureFun m_fun; /* the foreign function to call */
void* m_data; /* the associated data, passed along with the function call */
public:
wxClosure( ClosureFun fun, void* data );
~wxClosure();
virtual void IncRef();
virtual void DecRef();
virtual void Invoke( wxEvent* event );
virtual void* GetData();
};
class wxCallback: public wxObject
{
private:
wxClosure* m_closure; /* the closure to invoke */
public:
wxCallback( wxClosure* closure );
~wxCallback();
void Invoke( wxEvent* event );
wxClosure* GetClosure();
};
extern wxClosure* initClosure; /* called on wxApp::OnInit */
class ELJApp: public wxApp
{
public:
bool OnInit (void);
int OnExit (void);
void HandleEvent(wxEvent& _evt);
void InitZipFileSystem();
void InitImageHandlers();
};
class ELJDataObject: public wxObject
{
public:
ELJDataObject(void* _data) : wxObject() {data = _data;};
void* data;
};
class ELJDropTarget : public wxDropTarget
{
private:
DragThreeFunc on_data_func;
DragTwoFunc on_drop_func;
DragThreeFunc on_enter_func;
DragThreeFunc on_drag_func;
DragZeroFunc on_leave_func;
void* obj;
public:
ELJDropTarget(void* _obj) : wxDropTarget()
{
on_data_func = NULL;
on_drop_func = NULL;
on_enter_func = NULL;
on_drag_func = NULL;
on_leave_func = NULL;
obj = _obj;
};
wxDragResult OnData (wxCoord x, wxCoord y, wxDragResult def);
bool OnDrop (wxCoord x, wxCoord y);
wxDragResult OnEnter (wxCoord x, wxCoord y, wxDragResult def);
wxDragResult OnDragOver(wxCoord x, wxCoord y, wxDragResult def);
void OnLeave ();
void SetOnData (DragThreeFunc _func) {on_data_func = _func;};
void SetOnDrop (DragTwoFunc _func) {on_drop_func = _func;};
void SetOnEnter (DragThreeFunc _func) {on_enter_func = _func;};
void SetOnDragOver (DragThreeFunc _func) {on_drag_func = _func;};
void SetOnLeave (DragZeroFunc _func) {on_leave_func = _func;};
};
class ELJDragDataObject : public wxDataObjectSimple
{
private:
void* obj;
DataGetDataSize OnGetDataSize;
DataGetDataHere OnGetDataHere;
DataSetData OnSetData;
public:
#if (wxVERSION_NUMBER < 2900)
ELJDragDataObject(void* _obj, wxChar* _fmt, DataGetDataSize _func1, DataGetDataHere _func2, DataSetData _func3) : wxDataObjectSimple(_fmt)
{
obj = _obj;
OnGetDataSize = _func1;
OnGetDataHere = _func2;
OnSetData = _func3;
}
#else
ELJDragDataObject(void* _obj, const wxString& _fmt, DataGetDataSize _func1, DataGetDataHere _func2, DataSetData _func3) : wxDataObjectSimple(_fmt)
{
obj = _obj;
OnGetDataSize = _func1;
OnGetDataHere = _func2;
OnSetData = _func3;
}
#endif
size_t GetDataSize() const {return (size_t)OnGetDataSize(obj);}
bool GetDataHere(void* buf) const {return OnGetDataHere(obj, buf) != 0;}
bool SetData(size_t len, const void* buf) {return OnSetData(obj, (int)len, buf) != 0;}
};
class ELJTextDropTarget : public wxTextDropTarget
{
private:
DragThreeFunc on_data_func;
DragTwoFunc on_drop_func;
DragThreeFunc on_enter_func;
DragThreeFunc on_drag_func;
DragZeroFunc on_leave_func;
TextDropFunc func;
void* obj;
public:
ELJTextDropTarget(void* _obj, TextDropFunc _func) : wxTextDropTarget()
{
on_data_func = NULL;
on_drop_func = NULL;
on_enter_func = NULL;
on_drag_func = NULL;
on_leave_func = NULL;
func = _func;
obj = _obj;
};
virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text);
wxDragResult OnData (wxCoord x, wxCoord y, wxDragResult def);
bool OnDrop (wxCoord x, wxCoord y);
wxDragResult OnEnter (wxCoord x, wxCoord y, wxDragResult def);
wxDragResult OnDragOver(wxCoord x, wxCoord y, wxDragResult def);
void OnLeave ();
void SetOnData (DragThreeFunc _func) {on_data_func = _func;};
void SetOnDrop (DragTwoFunc _func) {on_drop_func = _func;};
void SetOnEnter (DragThreeFunc _func) {on_enter_func = _func;};
void SetOnDragOver (DragThreeFunc _func) {on_drag_func = _func;};
void SetOnLeave (DragZeroFunc _func) {on_leave_func = _func;};
};
class ELJFileDropTarget : public wxFileDropTarget
{
private:
DragThreeFunc on_data_func;
DragTwoFunc on_drop_func;
DragThreeFunc on_enter_func;
DragThreeFunc on_drag_func;
DragZeroFunc on_leave_func;
FileDropFunc func;
void* obj;
public:
ELJFileDropTarget(void* _obj, FileDropFunc _func) : wxFileDropTarget()
{
on_data_func = NULL;
on_drop_func = NULL;
on_enter_func = NULL;
on_drag_func = NULL;
on_leave_func = NULL;
func = _func;
obj = _obj;
};
virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames);
wxDragResult OnData (wxCoord x, wxCoord y, wxDragResult def);
bool OnDrop (wxCoord x, wxCoord y);
wxDragResult OnEnter (wxCoord x, wxCoord y, wxDragResult def);
wxDragResult OnDragOver(wxCoord x, wxCoord y, wxDragResult def);
void OnLeave ();
void SetOnData (DragThreeFunc _func) {on_data_func = _func;};
void SetOnDrop (DragTwoFunc _func) {on_drop_func = _func;};
void SetOnEnter (DragThreeFunc _func) {on_enter_func = _func;};
void SetOnDragOver (DragThreeFunc _func) {on_drag_func = _func;};
void SetOnLeave (DragZeroFunc _func) {on_leave_func = _func;};
};
class ELJTextValidator : public wxTextValidator
{
public:
ELJTextValidator(void* _obj, void* _fnc, void* _txt, long _stl) : wxTextValidator (_stl, &buf)
{
obj = _obj;
fnc = (ValidateFunc)_fnc;
buf = (const wxChar*) _txt;
};
ELJTextValidator(const ELJTextValidator& other)
{
Copy (other);
obj = other.obj;
fnc = other.fnc;
buf = other.buf;
};
virtual wxObject *Clone(void) const { return new ELJTextValidator(*this); }
virtual bool Validate(wxWindow* _prt);
private:
wxString buf;
void* obj;
ValidateFunc fnc;
};
class ELJConnection : public wxTCPConnection
{
private:
TCPAdviseFunc DoOnAdvise;
TCPExecuteFunc DoOnExecute;
TCPRequestFunc DoOnRequest;
TCPPokeFunc DoOnPoke;
TCPStartAdviseFunc DoOnStartAdvise;
TCPStopAdviseFunc DoOnStopAdvise;
TCPOnDisconnect DoOnDisconnect;
void* EiffelObject;
public:
ELJConnection() : wxTCPConnection()
{
DoOnAdvise = NULL;
DoOnExecute = NULL;
DoOnRequest = NULL;
DoOnPoke = NULL;
DoOnStartAdvise = NULL;
DoOnStopAdvise = NULL;
DoOnDisconnect = NULL;
EiffelObject = NULL;
}
ELJConnection(wxChar* _buf, int _sze) : wxTCPConnection(_buf, _sze)
{
DoOnAdvise = NULL;
DoOnExecute = NULL;
DoOnRequest = NULL;
DoOnPoke = NULL;
DoOnStartAdvise = NULL;
DoOnStopAdvise = NULL;
DoOnDisconnect = NULL;
EiffelObject = NULL;
}
void SetOnAdvise (void* _fnc) {DoOnAdvise = (TCPAdviseFunc)_fnc;};
void SetOnExecute (void* _fnc) {DoOnExecute = (TCPExecuteFunc) _fnc;};
void SetOnRequest (void* _fnc) {DoOnRequest = (TCPRequestFunc)_fnc;};
void SetOnPoke (void* _fnc) {DoOnPoke = (TCPPokeFunc)_fnc;};
void SetOnStartAdvise (void* _fnc) {DoOnStartAdvise = (TCPStartAdviseFunc)_fnc;};
void SetOnStopAdvise (void* _fnc) {DoOnStopAdvise = (TCPStopAdviseFunc)_fnc;};
void SetOnDisconnect (void* _fnc) {DoOnDisconnect = (TCPOnDisconnect)_fnc;};
void SetEiffelObject (void* _obj) {EiffelObject = _obj;};
virtual bool OnExecute( const wxString& topic, char *data, int size, wxIPCFormat format )
{
return DoOnExecute ?
DoOnExecute (EiffelObject, (void*)topic.wchar_str(), data, size, (int) format) != 0 :
FALSE;
};
virtual wxChar *OnRequest( const wxString& topic, const wxString& item, int *size, wxIPCFormat format )
{
return DoOnRequest ?
DoOnRequest (EiffelObject, (void*)topic.wchar_str(), (void*)item.wchar_str(), (void*)size, (int) format) :
(wxChar*) NULL;
};
virtual bool OnPoke( const wxString& topic, const wxString& item, wxChar *data, int size, wxIPCFormat format )
{
return DoOnPoke ?
DoOnPoke (EiffelObject, (void*)topic.wchar_str(), (void*)item.wchar_str(), data, size, (int) format) :
FALSE;
};
virtual bool OnStartAdvise( const wxString& topic, const wxString& item )
{
return DoOnStartAdvise ?
DoOnStartAdvise (EiffelObject, (void*)topic.wchar_str(), (void*)item.wchar_str()) :
FALSE;
};
virtual bool OnStopAdvise( const wxString& topic, const wxString& item )
{
return DoOnStopAdvise ?
DoOnStopAdvise (EiffelObject, (void*)topic.wchar_str(), (void*)item.wchar_str()) :
FALSE;
};
virtual bool OnAdvise( const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format )
{
return DoOnAdvise ?
DoOnAdvise (EiffelObject, (void*)topic.wchar_str(), (void*)item.wchar_str(), data, size, (int) format) :
FALSE;
};
virtual bool OnDisconnect()
{
return DoOnDisconnect ?
DoOnDisconnect (EiffelObject) :
wxTCPConnection::OnDisconnect();
};
};
class ELJServer : public wxTCPServer
{
private:
void* EiffelObject;
TCPOnConnection DoOnConnect;
public:
ELJServer(void* _obj, void* _fnc) : wxTCPServer()
{
EiffelObject = _obj;
DoOnConnect = (TCPOnConnection)_fnc;
};
virtual wxConnectionBase* OnAcceptConnection(const wxString& topic)
{
ELJConnection* result = new ELJConnection();
result->SetEiffelObject (DoOnConnect (EiffelObject, (void*)result));
return result;
};
};
class ELJClient : public wxTCPClient
{
private:
void* EiffelObject;
TCPOnConnection DoOnConnect;
public:
ELJClient(void* _obj, void* _fnc) : wxTCPClient()
{
EiffelObject = _obj;
DoOnConnect = (TCPOnConnection)_fnc;
};
virtual wxConnectionBase* OnMakeConnection()
{
ELJConnection* result = new ELJConnection();
result->SetEiffelObject (DoOnConnect (EiffelObject, (void*)result));
return result;
};
};
class ELJPrintout : public wxPrintout
{
private:
void* EiffelObject;
PrintBeginDocument DoOnBeginDocument;
PrintCommon DoOnEndDocument;
PrintCommon DoOnBeginPrinting;
PrintCommon DoOnEndPrinting;
PrintCommon DoOnPreparePrinting;
PrintBeginPage DoOnPrintPage;
PrintBeginPage DoOnHasPage;
PrintPageInfo DoOnPageInfo;
public:
ELJPrintout(void* title,
void* _obj,
void* _DoOnBeginDocument,
void* _DoOnEndDocument,
void* _DoOnBeginPrinting,
void* _DoOnEndPrinting,
void* _DoOnPreparePrinting,
void* _DoOnPrintPage,
void* _DoOnHasPage,
void* _DoOnPageInfo) : wxPrintout((wxChar*)title)
{
EiffelObject = _obj;
DoOnBeginDocument = (PrintBeginDocument)_DoOnBeginDocument;
DoOnEndDocument = (PrintCommon)_DoOnEndDocument;
DoOnBeginPrinting = (PrintCommon)_DoOnBeginPrinting;
DoOnEndPrinting = (PrintCommon)_DoOnEndPrinting;
DoOnPreparePrinting = (PrintCommon)_DoOnPreparePrinting;
DoOnPrintPage = (PrintBeginPage)_DoOnPrintPage;
DoOnHasPage = (PrintBeginPage)_DoOnHasPage;
DoOnPageInfo = (PrintPageInfo)_DoOnPageInfo;
}
virtual bool OnBeginDocument(int startPage, int endPage)
{
return wxPrintout::OnBeginDocument(startPage, endPage) &&
(DoOnBeginDocument (EiffelObject, startPage, endPage) != 0);
}
virtual void OnEndDocument()
{
wxPrintout::OnEndDocument();
DoOnEndDocument (EiffelObject);
}
virtual void OnBeginPrinting()
{
DoOnBeginPrinting (EiffelObject);
}
virtual void OnEndPrinting()
{
DoOnEndPrinting (EiffelObject);
}
virtual void OnPreparePrinting()
{
DoOnPreparePrinting (EiffelObject);
}
virtual bool OnPrintPage(int page)
{
return DoOnPrintPage (EiffelObject, page) != 0;
}
virtual bool HasPage(int page)
{
return DoOnHasPage (EiffelObject, page) != 0;
}
virtual void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo)
{
DoOnPageInfo (EiffelObject, minPage, maxPage, pageFrom, pageTo);
}
};
class ELJPreviewFrame: public wxPreviewFrame
{
private:
void* EiffelObject;
PreviewFrameFunc DoInitialize;
PreviewFrameFunc DoCreateCanvas;
PreviewFrameFunc DoCreateControlBar;
public:
ELJPreviewFrame(void* _obj,
void* _init,
void* _create_canvas,
void* _create_toolbar,
void* preview,
void* parent,
void* title,
int x, int y,
int w, int h,
int style) :
wxPreviewFrame( (wxPrintPreviewBase*)preview,
(wxFrame*)parent,
(wxChar*)title,
wxPoint(x, y),
wxSize(w, h),
(long)style)
{
EiffelObject = _obj;
DoInitialize = (PreviewFrameFunc)_init;
DoCreateCanvas = (PreviewFrameFunc)_create_canvas;
DoCreateControlBar = (PreviewFrameFunc)_create_toolbar;
}
virtual void Initialize()
{
if ((DoInitialize) && DoInitialize(EiffelObject))
return;
wxPreviewFrame::Initialize();}
virtual void CreateCanvas()
{
if ((DoCreateCanvas) && DoCreateCanvas(EiffelObject))
return;
wxPreviewFrame::CreateCanvas();}
virtual void CreateControlBar()
{
if ((DoCreateControlBar) && DoCreateControlBar(EiffelObject))
return;
wxPreviewFrame::CreateControlBar();}
void SetPreviewCanvas (void* _obj)
{
m_previewCanvas = (wxPreviewCanvas*) _obj;
}
void SetControlBar (void* _obj)
{
m_controlBar = (wxPreviewControlBar*) _obj;
}
void SetPrintPreview (void* _obj)
{
m_printPreview = (wxPrintPreviewBase*) _obj;
}
void* GetPreviewCanvas ()
{
return (void*)m_previewCanvas;
}
void* GetControlBar ()
{
return (void*)m_controlBar;
}
void* GetPrintPreview ()
{
return (void*)m_printPreview;
}
};
class ELJTreeControl : public wxTreeCtrl
{
DECLARE_DYNAMIC_CLASS(ELJTreeControl)
private:
TreeCompareFunc compare_func;
void* EiffelObject;
public:
ELJTreeControl() : wxTreeCtrl ()
{
EiffelObject = NULL;
compare_func = NULL;
};
ELJTreeControl(void* _obj,
void* _cmp,
wxWindow *parent,
wxWindowID id = -1,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxT("wxTreeCtrl")) :
wxTreeCtrl (parent, id, pos, size, style, validator, name)
{
EiffelObject = _obj;
compare_func = (TreeCompareFunc)_cmp;
};
virtual int OnCompareItems(const wxTreeItemId& item1, const wxTreeItemId& item2)
{
return EiffelObject ?
compare_func (EiffelObject, (void*)&item1, (void*)&item2) :
wxTreeCtrl::OnCompareItems(item1, item2);
}
};
DECLARE_APP(ELJApp);
#endif /* #ifndef __WRAPPER_H */