]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/helpers.cpp
Entry for wxToolbook.
[wxWidgets.git] / wxPython / src / helpers.cpp
index 9b0c4c79ab464a8958c385fe96c68dae4644981a..d426e4d00753a26a3f6191eebd109835f8ac33ab 100644 (file)
@@ -15,6 +15,7 @@
 #include <Python.h>
 #include "wx/wxPython/wxPython_int.h"
 #include "wx/wxPython/pyistream.h"
+#include "wx/wxPython/swigver.h"
 
 #ifdef __WXMSW__
 #include <wx/msw/private.h>
@@ -29,8 +30,8 @@
 #include <gdk/gdkprivate.h>
 #include <wx/gtk/win_gtk.h>
 #define GetXWindow(wxwin) (wxwin)->m_wxwindow ? \
-                              GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) : \
-                              GDK_WINDOW_XWINDOW((wxwin)->m_widget->window)
+                          GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) : \
+                          GDK_WINDOW_XWINDOW((wxwin)->m_widget->window)
 #include <locale.h>
 #endif
 
@@ -442,7 +443,7 @@ void wxPyApp::_BootstrapApp()
         setlocale(LC_NUMERIC, "C");
 #endif
 
-        wxSystemOptions::SetOption(wxT("mac.textcontrol-use-mlte"), 1);
+//        wxSystemOptions::SetOption(wxT("mac.textcontrol-use-mlte"), 1);
         
         // The stock objects were all NULL when they were loaded into
         // SWIG generated proxies, so re-init those now...
@@ -690,7 +691,8 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args)
 #else
     _AddInfoString("wx-assertions-off");
 #endif
-
+    _AddInfoString(wxPy_SWIG_VERSION);    
+    
 #undef _AddInfoString
 
     PyObject* PlatInfoTuple = PyList_AsTuple(PlatInfo);
@@ -701,21 +703,6 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args)
 }
 
 
-//---------------------------------------------------------------------------
-
-// Python's PyInstance_Check does not return True for instances of new-style
-// classes.  This should get close enough for both new and old classes but I
-// should re-evaluate the need for doing instance checks...
-bool wxPyInstance_Check(PyObject* obj) {
-    return PyObject_HasAttrString(obj, "__class__") != 0;
-}
-
-
-// This one checks if the object is an instance of a SWIG proxy class (it has
-// a .this attribute)
-bool wxPySwigInstance_Check(PyObject* obj) {
-    return PyObject_HasAttrString(obj, "this") != 0;
-}
 
 //---------------------------------------------------------------------------
 
@@ -1001,6 +988,7 @@ void wxPyPtrTypeMap_Add(const char* commonName, const char* ptrName) {
 PyObject*  wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHandler) {
     PyObject* target = NULL;
     bool      isEvtHandler = false;
+    bool      isSizer = false;
 
     if (source) {
         // If it's derived from wxEvtHandler then there may
@@ -1017,6 +1005,18 @@ PyObject*  wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHan
             }
         }
 
+        // Also check for wxSizer
+        if (!target && wxIsKindOf(source, wxSizer)) {
+            isSizer = true;
+            wxSizer* sz = (wxSizer*)source;
+            wxPyOORClientData* data = (wxPyOORClientData*)sz->GetClientObject();
+            if (data) {
+                target = data->m_obj;
+                if (target)
+                    Py_INCREF(target);
+            }
+        }
+        
         if (! target) {
             // Otherwise make it the old fashioned way by making a new shadow
             // object and putting this pointer in it.  Look up the class
@@ -1034,6 +1034,8 @@ PyObject*  wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHan
                 target = wxPyConstructObject((void*)source, name, setThisOwn);
                 if (target && isEvtHandler)
                     ((wxEvtHandler*)source)->SetClientObject(new wxPyOORClientData(target));
+                if (target && isSizer)
+                    ((wxSizer*)source)->SetClientObject(new wxPyOORClientData(target));
             } else {
                 wxString msg(wxT("wxPython class not found for "));
                 msg += source->GetClassInfo()->GetClassName();
@@ -1049,25 +1051,8 @@ PyObject*  wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHan
 
 
 PyObject*  wxPyMake_wxSizer(wxSizer* source, bool setThisOwn) {
-    PyObject* target = NULL;
 
-    if (source && wxIsKindOf(source, wxSizer)) {
-        // If it's derived from wxSizer then there may already be a pointer to
-        // a Python object that we can use in the OOR data.
-        wxSizer* sz = (wxSizer*)source;
-        wxPyOORClientData* data = (wxPyOORClientData*)sz->GetClientObject();
-        if (data) {
-            target = data->m_obj;
-            if (target)
-                Py_INCREF(target);
-        }
-    }
-    if (! target) {
-        target = wxPyMake_wxObject(source, setThisOwn, false);
-        if (target != Py_None)
-            ((wxSizer*)source)->SetClientObject(new wxPyOORClientData(target));
-    }
-    return target;
+    return wxPyMake_wxObject(source, setThisOwn);
 }
 
 
@@ -1169,6 +1154,9 @@ void wxPyEndAllowThreads(PyThreadState* saved) {
 
 wxPyBlock_t wxPyBeginBlockThreads() {
 #ifdef WXP_WITH_THREAD
+    if (! Py_IsInitialized()) {
+        return (wxPyBlock_t)0;
+    }
 #if wxPyUSE_GIL_STATE
     PyGILState_STATE state = PyGILState_Ensure();
     return state;
@@ -1187,13 +1175,16 @@ wxPyBlock_t wxPyBeginBlockThreads() {
     return blocked;
 #endif
 #else
-    return false;
+    return (wxPyBlock_t)0;
 #endif
 }
 
 
 void wxPyEndBlockThreads(wxPyBlock_t blocked) {
 #ifdef WXP_WITH_THREAD
+    if (! Py_IsInitialized()) {
+        return;
+    }            
 #if wxPyUSE_GIL_STATE
     PyGILState_Release(blocked);
 #else
@@ -2721,6 +2712,145 @@ PyObject* wxArrayInt2PyList_helper(const wxArrayInt& arr) {
 }
 
 
+//----------------------------------------------------------------------
+// wxPyImageHandler methods
+//
+// TODO: Switch these to use wxPython's standard macros and helper classes
+//       for calling callbacks.
+
+PyObject* wxPyImageHandler::m_DoCanRead_Name = NULL;
+PyObject* wxPyImageHandler::m_GetImageCount_Name = NULL;
+PyObject* wxPyImageHandler::m_LoadFile_Name = NULL;
+PyObject* wxPyImageHandler::m_SaveFile_Name = NULL;
+
+PyObject* wxPyImageHandler::py_InputStream(wxInputStream* stream) {
+    return wxPyConstructObject(new wxPyInputStream(stream),
+                               wxT("wxPyInputStream"), 0);
+}
+
+PyObject* wxPyImageHandler::py_Image(wxImage* image) {
+    return wxPyConstructObject(image, wxT("wxImage"), 0);
+}
+
+PyObject* wxPyImageHandler::py_OutputStream(wxOutputStream* stream) {
+    return wxPyConstructObject(stream, wxT("wxOutputStream"), 0);
+}
+
+wxPyImageHandler::wxPyImageHandler():
+    m_self(NULL)
+{
+    if (!m_DoCanRead_Name) {
+        m_DoCanRead_Name = PyString_FromString("DoCanRead");
+        m_GetImageCount_Name = PyString_FromString("GetImageCount");
+        m_LoadFile_Name = PyString_FromString("LoadFile");
+        m_SaveFile_Name = PyString_FromString("SaveFile");
+    }
+}
+
+wxPyImageHandler::~wxPyImageHandler() {
+    if (m_self) {
+        Py_DECREF(m_self);
+        m_self = NULL;
+    }
+}
+
+void wxPyImageHandler::_SetSelf(PyObject *self) {
+    // should check here for isinstance(PyImageHandler) ??
+    m_self = self;
+    Py_INCREF(m_self);
+}
+
+bool wxPyImageHandler::DoCanRead(wxInputStream& stream) {
+    // check if our object has this method
+    wxPyBlock_t blocked = wxPyBeginBlockThreads();
+    if (!m_self || !PyObject_HasAttr(m_self, m_DoCanRead_Name)) {
+        wxPyEndBlockThreads(blocked);
+        return false;
+    }
+
+    PyObject* res = PyObject_CallMethodObjArgs(m_self, m_DoCanRead_Name,
+                                               py_InputStream(&stream), NULL);
+    bool retval = false;
+    if (res) {
+        retval = PyInt_AsLong(res);
+        Py_DECREF(res);
+        PyErr_Clear();
+    }
+    else
+        PyErr_Print();
+    wxPyEndBlockThreads(blocked);
+    return retval;
+}
+
+bool wxPyImageHandler::LoadFile( wxImage* image, wxInputStream& stream,
+                                 bool verbose, int index ) {
+    // check if our object has this method
+    wxPyBlock_t blocked = wxPyBeginBlockThreads();
+    if (!m_self || !PyObject_HasAttr(m_self, m_LoadFile_Name)) {
+        wxPyEndBlockThreads(blocked);
+        return false;
+    }
+    PyObject* res = PyObject_CallMethodObjArgs(m_self, m_LoadFile_Name,
+                                               py_Image(image),
+                                               py_InputStream(&stream),
+                                               PyInt_FromLong(verbose),
+                                               PyInt_FromLong(index),
+                                               NULL);
+    bool retval = false;
+    if (res) {
+        retval = PyInt_AsLong(res);
+        Py_DECREF(res);
+        PyErr_Clear();
+    } else
+        PyErr_Print();
+    wxPyEndBlockThreads(blocked);
+    return retval;
+}
+
+bool wxPyImageHandler::SaveFile( wxImage* image, wxOutputStream& stream,
+                                 bool verbose ) {
+    wxPyBlock_t blocked = wxPyBeginBlockThreads();
+    if (!m_self || !PyObject_HasAttr(m_self, m_SaveFile_Name)) {
+        wxPyEndBlockThreads(blocked);
+        return false;
+    }
+    PyObject* res = PyObject_CallMethodObjArgs(m_self, m_SaveFile_Name,
+                                               py_Image(image),
+                                               py_OutputStream(&stream),
+                                               PyInt_FromLong(verbose),
+                                               NULL);
+    bool retval = false;
+    if(res) {
+        retval=PyInt_AsLong(res);
+        Py_DECREF(res);
+        PyErr_Clear();
+    } else
+        PyErr_Print();
+    wxPyEndBlockThreads(blocked);
+    return retval;
+}
+
+int wxPyImageHandler::GetImageCount( wxInputStream& stream ) {
+    wxPyBlock_t blocked = wxPyBeginBlockThreads();
+    if (!m_self || !PyObject_HasAttr(m_self, m_GetImageCount_Name)) {
+        wxPyEndBlockThreads(blocked);
+        return 1;
+    }
+    PyObject *res=PyObject_CallMethodObjArgs(m_self, m_GetImageCount_Name,
+                                             py_InputStream(&stream),
+                                             NULL);
+    int retval = 1;
+    if(res) {
+        retval=PyInt_AsLong(res);
+        Py_DECREF(res);
+        PyErr_Clear();
+    } else
+        PyErr_Print();
+    wxPyEndBlockThreads(blocked);
+    return retval;
+}
+
+
 //----------------------------------------------------------------------
 //----------------------------------------------------------------------