]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/wxPython/src/helpers.h
Replaced ostream with FILE* in wxExpr.
[wxWidgets.git] / utils / wxPython / src / helpers.h
index 3114aa562290ccf36ac1677582542637193552e1..02433e748b33857215552b24a53062a368048e97 100644 (file)
 #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);
@@ -54,19 +76,20 @@ extern "C" char *SWIG_GetPtr(char *, void **, char *);
 # pragma warning(disable:4800)
 #endif
 
+typedef unsigned char byte;
+
 
 // Non-const versions to keep SWIG happy.
 extern wxPoint  wxPyDefaultPosition;
 extern wxSize   wxPyDefaultSize;
-extern char*    wxPyPanelNameStr;
 extern wxString wxPyEmptyStr;
 
 //----------------------------------------------------------------------
 
 class wxPyCallback : public wxObject {
 public:
-    wxPyCallback(PyObject* func)    { m_func = func; Py_INCREF(m_func); }
-    ~wxPyCallback()                 { Py_DECREF(m_func); }
+    wxPyCallback(PyObject* func);
+    ~wxPyCallback();
 
     void EventThunker(wxEvent& event);
 
@@ -100,22 +123,111 @@ private:
 };
 
 //---------------------------------------------------------------------------
-/////////////////////////////////////////////////////////////////////////////
-//
-// $Log$
-// Revision 1.4  1998/08/27 21:59:09  RD
-// Some chicken-and-egg problems solved for wxPython on wxGTK
-//
-// Revision 1.3  1998/08/16 04:31:09  RD
-// More wxGTK work.
-//
-// Revision 1.2  1998/08/14 23:36:37  RD
-// Beginings of wxGTK compatibility
-//
-// Revision 1.1  1998/08/09 08:25:51  RD
-// Initial version
-//
-//
+
+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