Files
wxWidgets/utils/wxPython/src/helpers.h
Robin Dunn bb0054cda8 wxPython 2.1b1 for wxMSW (wxGTK coming soon)
Lots of changes, see the README.txt for details...


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2857 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1999-06-22 07:03:29 +00:00

234 lines
7.4 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: helpers.h
// Purpose: Helper functions/classes for the wxPython extenaion module
//
// Author: Robin Dunn
//
// Created: 7/1/97
// RCS-ID: $Id$
// Copyright: (c) 1998 by Total Control Software
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __wxp_helpers__
#define __wxp_helpers__
#include <wx/wx.h>
//----------------------------------------------------------------------
// if we want to handle threads and Python threads are available...
#if defined(WXP_USE_THREAD) && defined(WITH_THREAD)
#define WXP_WITH_THREAD
#define wxPy_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
#define wxPy_END_ALLOW_THREADS Py_END_ALLOW_THREADS
#else // no Python threads...
#undef WXP_WITH_THREAD
#define wxPy_BEGIN_ALLOW_THREADS
#define wxPy_END_ALLOW_THREADS
#endif
#ifdef WXP_WITH_THREAD
extern PyThreadState* wxPyEventThreadState;
extern bool wxPyInEvent;
#endif
//----------------------------------------------------------------------
class wxPyApp: public wxApp
{
public:
wxPyApp();
~wxPyApp();
int MainLoop(void);
bool OnInit(void);
void AfterMainLoop(void);
};
extern wxPyApp *wxPythonApp;
//----------------------------------------------------------------------
void __wxPreStart();
PyObject* __wxStart(PyObject*, PyObject* args);
extern PyObject* wxPython_dict;
PyObject* __wxSetDictionary(PyObject*, PyObject* args);
extern wxHashTable* wxPyWindows; // keep track of all windows so we
// don't accidentally delete them twice.
void wxPyEventThunker(wxObject*, wxEvent& event);
//----------------------------------------------------------------------
#ifndef SWIGCODE
extern "C" void SWIG_MakePtr(char *, void *, char *);
extern "C" char *SWIG_GetPtr(char *, void **, char *);
#endif
#ifdef _MSC_VER
# pragma warning(disable:4800)
#endif
typedef unsigned char byte;
// Non-const versions to keep SWIG happy.
extern wxPoint wxPyDefaultPosition;
extern wxSize wxPyDefaultSize;
extern wxString wxPyEmptyStr;
//----------------------------------------------------------------------
class wxPyCallback : public wxObject {
public:
wxPyCallback(PyObject* func);
~wxPyCallback();
void EventThunker(wxEvent& event);
PyObject* m_func;
};
//---------------------------------------------------------------------------
class wxPyMenu : public wxMenu {
public:
wxPyMenu(const wxString& title = "", PyObject* func=NULL);
~wxPyMenu();
private:
static void MenuCallback(wxMenu& menu, wxCommandEvent& evt);
PyObject* func;
};
//---------------------------------------------------------------------------
class wxPyTimer : public wxTimer {
public:
wxPyTimer(PyObject* callback);
~wxPyTimer();
void Notify();
private:
PyObject* func;
};
//---------------------------------------------------------------------------
class wxPyEvent : public wxCommandEvent {
DECLARE_DYNAMIC_CLASS(wxPyEvent)
public:
wxPyEvent(wxEventType commandType = wxEVT_NULL, PyObject* userData = Py_None);
~wxPyEvent();
void SetUserData(PyObject* userData);
PyObject* GetUserData();
private:
PyObject* m_userData;
};
//---------------------------------------------------------------------------
// This class holds an instance of a Python Shadow Class object and assists
// with looking up and invoking Python callback methods from C++ virtual
// method redirections. For all classes which have virtuals which should be
// overridable in wxPython, a new subclass is created that contains a
// wxPyCallbackList. This list is used to hold references to the Python
// methods.
//---------------------------------------------------------------------------
class wxPyCallbackHelper {
public:
wxPyCallbackHelper();
~wxPyCallbackHelper();
void setSelf(PyObject* self);
bool findCallback(const wxString& name);
int callCallback(PyObject* argTuple);
PyObject* callCallbackObj(PyObject* argTuple);
private:
PyObject* m_self;
PyObject* m_lastFound;
};
//---------------------------------------------------------------------------
// These macros are used to implement the virtual methods that should
// redirect to a Python method if one exists. The names designate the
// return type, if any as well as any parameter types.
//---------------------------------------------------------------------------
#define PYCALLBACK_BOOL_INTINT(PCLASS, CBNAME) \
bool CBNAME(int a, int b) { \
if (m_myInst.findCallback(#CBNAME)) \
return m_myInst.callCallback(Py_BuildValue("(ii)",a,b)); \
else \
return PCLASS::CBNAME(a,b); \
} \
bool base_##CBNAME(int a, int b) { \
return PCLASS::CBNAME(a,b); \
}
//---------------------------------------------------------------------------
#define PYCALLBACK_BOOL_INT(PCLASS, CBNAME) \
bool CBNAME(int a) { \
if (m_myInst.findCallback(#CBNAME)) \
return m_myInst.callCallback(Py_BuildValue("(i)",a)); \
else \
return PCLASS::CBNAME(a); \
} \
bool base_##CBNAME(int a) { \
return PCLASS::CBNAME(a); \
}
#define PYCALLBACK_BOOL_INT_pure(PCLASS, CBNAME) \
bool CBNAME(int a) { \
if (m_myInst.findCallback(#CBNAME)) \
return m_myInst.callCallback(Py_BuildValue("(i)",a)); \
else return false; \
}
//---------------------------------------------------------------------------
#define PYCALLBACK__(PCLASS, CBNAME) \
void CBNAME() { \
if (m_myInst.findCallback(#CBNAME)) \
m_myInst.callCallback(Py_BuildValue("()")); \
else \
PCLASS::CBNAME(); \
} \
void base_##CBNAME() { \
PCLASS::CBNAME(); \
}
//---------------------------------------------------------------------------
#define PYPRIVATE \
void _setSelf(PyObject* self) { \
m_myInst.setSelf(self); \
} \
private: wxPyCallbackHelper m_myInst;
//---------------------------------------------------------------------------
#endif