1 /////////////////////////////////////////////////////////////////////////////
 
   3 // Purpose:     Special typemaps specifically for wxPython.
 
   9 // Copyright:   (c) 1998 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  14 //---------------------------------------------------------------------------
 
  15 // Tell SWIG to wrap all the wrappers with our thread protection
 
  18     PyThreadState* __tstate = wxPyBeginAllowThreads();
 
  20     wxPyEndAllowThreads(__tstate);
 
  21     if (PyErr_Occurred()) SWIG_fail;
 
  25 //----------------------------------------------------------------------
 
  26 // Typemaps to convert a list of items to an int (size) and an array
 
  28 %typemap(in) (int choices, wxString* choices_array ) {
 
  29     $1 = PyList_Size($input);
 
  30     $2 = wxString_LIST_helper($input);
 
  31     if ($2 == NULL) SWIG_fail;
 
  33 %typemap(freearg) (int choices, wxString* choices_array ) {
 
  38 //---------------------------------------------------------------------------
 
  42 %typemap(in) wxString& (bool temp=False) {
 
  43     $1 = wxString_in_helper($input);
 
  44     if ($1 == NULL) SWIG_fail;
 
  47 %typemap(freearg) wxString& {
 
  52 %typemap(out) wxString& {
 
  54     $result = PyUnicode_FromWideChar($1->c_str(), $1->Len());
 
  56     $result = PyString_FromStringAndSize($1->c_str(), $1->Len());
 
  61 %apply wxString& { wxString* }
 
  65 %typemap(out) wxString {
 
  67     $result = PyUnicode_FromWideChar($1.c_str(), $1.Len());
 
  69     $result = PyString_FromStringAndSize($1.c_str(), $1.Len());
 
  73 %typemap(varout) wxString {
 
  75     $result = PyUnicode_FromWideChar($1.c_str(), $1.Len());
 
  77     $result = PyString_FromStringAndSize($1.c_str(), $1.Len());
 
  82 %typemap(in) wxString {
 
  83     wxString* sptr = wxString_in_helper($input);
 
  84     if (sptr == NULL) SWIG_fail;
 
  89 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxString& {
 
  90     $1 = PyString_Check($input) || PyUnicode_Check($input);
 
  93 //---------------------------------------------------------------------------
 
  94 // wxMemoryBuffer  (needed for wxSTC)
 
  96 %typemap(in) wxMemoryBuffer& (bool temp=False) {
 
  97     if (!PyString_Check($input)) {
 
  98         PyErr_SetString(PyExc_TypeError, "String buffer expected");
 
 101     char* str = PyString_AS_STRING($input);
 
 102     int   len = PyString_GET_SIZE($input);
 
 103     $1 = new wxMemoryBuffer(len);
 
 105     memcpy($1->GetData(), str, len);
 
 109 %typemap(freearg) wxMemoryBuffer& {
 
 110     if (temp$argnum) delete $1;
 
 113 %typemap(out) wxMemoryBuffer {
 
 114     $result = PyString_FromStringAndSize((char*)$1.GetData(), $1.GetDataLen());
 
 119 //---------------------------------------------------------------------------
 
 120 // Typemaps to convert Python sequence objects (tuples, etc.) to
 
 121 // wxSize, wxPoint, wxRealPoint, and wxRect.
 
 124 %typemap(in) wxSize& (wxSize temp) {
 
 126     if ( ! wxSize_helper($input, &$1)) SWIG_fail;
 
 128 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxSize& {
 
 129     $1 = wxPySimple_typecheck($input, wxT("wxSize"), 2);
 
 133 %typemap(in) wxPoint& (wxPoint temp) {
 
 135     if ( ! wxPoint_helper($input, &$1)) SWIG_fail;
 
 137 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxPoint& {
 
 138     $1 = wxPySimple_typecheck($input, wxT("wxPoint"), 2);
 
 142 %typemap(in) wxRealPoint& (wxRealPoint temp) {
 
 144     if ( ! wxRealPoint_helper($input, &$1)) SWIG_fail;
 
 146 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxRealPoint& {
 
 147     $1 = wxPySimple_typecheck($input, wxT("wxRealPoint"), 2);
 
 151 %typemap(in) wxRect& (wxRect temp) {
 
 153     if ( ! wxRect_helper($input, &$1)) SWIG_fail;
 
 155 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxRect& {
 
 156     $1 = wxPySimple_typecheck($input, wxT("wxRect"), 4);
 
 160 %typemap(in) wxPoint2D& (wxPoint2D temp) {
 
 162     if ( ! wxPoint2D_helper($input, &$1)) SWIG_fail;
 
 164 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxPoint2D& {
 
 165     $1 = wxPySimple_typecheck($input, wxT("wxPoint2D"), 2);
 
 169 //---------------------------------------------------------------------------
 
 170 // Typemap to convert strings to wxColour.  Two string formats are accepted,
 
 171 // either a colour name, or a hex colour spec like "#RRGGBB"
 
 173 %typemap(in) wxColour& (wxColour temp) {
 
 175     if ( ! wxColour_helper($input, &$1)) SWIG_fail;
 
 177 %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxColour& {
 
 178     $1 = wxColour_typecheck($input);
 
 183 //---------------------------------------------------------------------------
 
 184 // Typemap for wxArrayString from Python sequence objects
 
 186 %typemap(in) wxArrayString& (bool temp=False) {
 
 187     if (! PySequence_Check($input)) {
 
 188         PyErr_SetString(PyExc_TypeError, "Sequence of strings expected.");
 
 191     $1 = new wxArrayString;
 
 193     int i, len=PySequence_Length($input);
 
 194     for (i=0; i<len; i++) {
 
 195         PyObject* item = PySequence_GetItem($input, i);
 
 197         PyObject* str  = PyObject_Unicode(item);
 
 199         PyObject* str  = PyObject_Str(item);
 
 201         if (PyErr_Occurred())  SWIG_fail;
 
 202         $1->Add(Py2wxString(str));
 
 208 %typemap(freearg) wxArrayString& {
 
 209     if (temp$argnum) delete $1;
 
 212 //---------------------------------------------------------------------------
 
 213 // Typemap for wxArrayInt from Python sequence objects
 
 215 %typemap(in) wxArrayInt& (bool temp=False) {
 
 216     if (! PySequence_Check($input)) {
 
 217         PyErr_SetString(PyExc_TypeError, "Sequence of integers expected.");
 
 222     int i, len=PySequence_Length($input);
 
 223     for (i=0; i<len; i++) {
 
 224         PyObject* item = PySequence_GetItem($input, i);
 
 225         PyObject* number  = PyNumber_Int(item);
 
 226         $1->Add(PyInt_AS_LONG(number));
 
 232 %typemap(freearg) wxArrayInt& {
 
 233     if (temp$argnum) delete $1;
 
 237 //---------------------------------------------------------------------------
 
 238 // Typemaps to convert an array of ints to a list for return values
 
 239 %typemap(out) wxArrayInt& {
 
 240     $result = PyList_New(0);
 
 242     for (idx = 0; idx < $1->GetCount(); idx += 1) {
 
 243         PyObject* val = PyInt_FromLong( $1->Item(idx) );
 
 244         PyList_Append($result, val);
 
 249 %typemap(out) wxArrayInt {
 
 250     $result = PyList_New(0);
 
 252     for (idx = 0; idx < $1.GetCount(); idx += 1) {
 
 253         PyObject* val = PyInt_FromLong( $1.Item(idx) );
 
 254         PyList_Append($result, val);
 
 261 // Typemaps to convert an array of ints to a list for return values
 
 262 %typemap(out) wxArrayString& {
 
 263     $result = wxArrayString2PyList_helper(*$1);
 
 266 %typemap(out) wxArrayString {
 
 267     $result = wxArrayString2PyList_helper($1);
 
 271 //---------------------------------------------------------------------------
 
 274     $result = $1 ? Py_True : Py_False; Py_INCREF($result);
 
 278 // These fragments are iserted in modules that need to convert PyObjects to
 
 279 // integer values, my versions allow any numeric type to be used, as long as
 
 280 // it can be converted to a PyInt.  (Specifically, I allow floats where the
 
 281 // default SWIG_AsLong would raise an obsucre exception from within
 
 284 %fragment("SWIG_AsLong","header") %{
 
 285 SWIGSTATICINLINE(long)
 
 286 SWIG_AsLong(PyObject * obj)
 
 288     if (PyNumber_Check(obj))
 
 289         return PyInt_AsLong(obj);
 
 291         PyObject* errmsg = PyString_FromFormat("Expected number, got %s",
 
 292                                                obj->ob_type->tp_name);
 
 293         PyErr_SetObject(PyExc_TypeError, errmsg);
 
 300 %fragment("SWIG_AsUnsignedLong","header", fragment="SWIG_AsLong") %{
 
 301 SWIGSTATICINLINE(unsigned long)
 
 302 SWIG_AsUnsignedLong(PyObject * obj) 
 
 304   if (PyLong_Check(obj)) {
 
 305     return PyLong_AsUnsignedLong(obj);
 
 307     long i = SWIG_AsLong(obj);
 
 308     if ( !PyErr_Occurred() && (i < 0)) {
 
 309       PyErr_SetString(PyExc_TypeError, "negative value received for unsigned type");
 
 317 %fragment("SWIG_AsDouble","header") %{
 
 318 SWIGSTATICINLINE(double)
 
 319 SWIG_AsDouble(PyObject *obj)
 
 321     if (PyNumber_Check(obj))
 
 322         return PyFloat_AsDouble(obj);
 
 324         PyObject* errmsg = PyString_FromFormat("Expected number, got %s",
 
 325                                                obj->ob_type->tp_name);
 
 326         PyErr_SetObject(PyExc_TypeError, errmsg);
 
 334 //---------------------------------------------------------------------------
 
 335 // Typemap for when GDI objects are returned by reference.  This will cause a
 
 336 // copy to be made instead of returning a reference to the same instance.  The
 
 337 // GDI object's internal refcounting scheme will do a copy-on-write of the
 
 338 // internal data as needed.
 
 341 //, wxRegion&, wxPalette&
 
 343 %typemap(out) wxBrush&, wxPen&, wxFont&, wxBitmap&, wxIcon&, wxCursor& {
 
 344     $*1_ltype* resultptr = new $*1_ltype(*$1);
 
 345     $result = SWIG_NewPointerObj((void*)(resultptr), $1_descriptor, 1);
 
 349 //---------------------------------------------------------------------------
 
 350 // Typemaps to convert return values that are base class pointers
 
 351 // to the real derived type, if possible.  See wxPyMake_wxObject in
 
 354 %typemap(out) wxEvtHandler*             { $result = wxPyMake_wxObject($1); }
 
 355 %typemap(out) wxMenu*                   { $result = wxPyMake_wxObject($1); }
 
 356 %typemap(out) wxValidator*              { $result = wxPyMake_wxObject($1); }
 
 358 %typemap(out) wxApp*                    { $result = wxPyMake_wxObject($1); }
 
 359 %typemap(out) wxPyApp*                  { $result = wxPyMake_wxObject($1); }
 
 360 %typemap(out) wxDC*                     { $result = wxPyMake_wxObject($1); }
 
 361 %typemap(out) wxFSFile*                 { $result = wxPyMake_wxObject($1); }
 
 362 %typemap(out) wxFileSystem*             { $result = wxPyMake_wxObject($1); }
 
 363 %typemap(out) wxGridTableBase*          { $result = wxPyMake_wxObject($1); }
 
 364 %typemap(out) wxImageList*              { $result = wxPyMake_wxObject($1); }
 
 365 %typemap(out) wxListItem*               { $result = wxPyMake_wxObject($1); }
 
 366 %typemap(out) wxMenuItem*               { $result = wxPyMake_wxObject($1); }
 
 367 %typemap(out) wxMouseEvent*             { $result = wxPyMake_wxObject($1); }
 
 368 %typemap(out) wxObject*                 { $result = wxPyMake_wxObject($1); }
 
 369 %typemap(out) wxPyPrintout*             { $result = wxPyMake_wxObject($1); }
 
 370 %typemap(out) wxToolBarToolBase*        { $result = wxPyMake_wxObject($1); }
 
 371 %typemap(out) wxToolTip*                { $result = wxPyMake_wxObject($1); }
 
 374 %typemap(out) wxBitmapButton*           { $result = wxPyMake_wxObject($1); }
 
 375 %typemap(out) wxButton*                 { $result = wxPyMake_wxObject($1); }
 
 376 %typemap(out) wxControl*                { $result = wxPyMake_wxObject($1); }
 
 377 %typemap(out) wxFrame*                  { $result = wxPyMake_wxObject($1); }
 
 378 %typemap(out) wxGrid*                   { $result = wxPyMake_wxObject($1); }
 
 379 %typemap(out) wxListCtrl*               { $result = wxPyMake_wxObject($1); }
 
 380 %typemap(out) wxMDIChildFrame*          { $result = wxPyMake_wxObject($1); }
 
 381 %typemap(out) wxMDIClientWindow*        { $result = wxPyMake_wxObject($1); }
 
 382 %typemap(out) wxMenuBar*                { $result = wxPyMake_wxObject($1); }
 
 383 %typemap(out) wxNotebook*               { $result = wxPyMake_wxObject($1); }
 
 384 %typemap(out) wxStaticBox*              { $result = wxPyMake_wxObject($1); }
 
 385 %typemap(out) wxStatusBar*              { $result = wxPyMake_wxObject($1); }
 
 386 %typemap(out) wxTextCtrl*               { $result = wxPyMake_wxObject($1); }
 
 387 %typemap(out) wxToolBar*                { $result = wxPyMake_wxObject($1); }
 
 388 %typemap(out) wxToolBarBase*            { $result = wxPyMake_wxObject($1); }
 
 389 %typemap(out) wxTreeCtrl*               { $result = wxPyMake_wxObject($1); }
 
 390 %typemap(out) wxPyTreeCtrl*             { $result = wxPyMake_wxObject($1); }
 
 391 %typemap(out) wxWindow*                 { $result = wxPyMake_wxObject($1); }
 
 392 %typemap(out) wxHtmlWindow*             { $result = wxPyMake_wxObject($1); }
 
 393 %typemap(out) wxPyHtmlWindow*           { $result = wxPyMake_wxObject($1); }
 
 394 %typemap(out) wxWizardPage*             { $result = wxPyMake_wxObject($1); }
 
 395 %typemap(out) wxPanel*                  { $result = wxPyMake_wxObject($1); }
 
 396 %typemap(out) wxDialog*                 { $result = wxPyMake_wxObject($1); }
 
 398 %typemap(out) wxSizer*                  { $result = wxPyMake_wxSizer($1); }
 
 401 //%typemap(python, out) wxHtmlCell*               { $target = wxPyMake_wxObject($source); }
 
 402 //%typemap(python, out) wxHtmlContainerCell*      { $target = wxPyMake_wxObject($source); }
 
 403 //%typemap(python, out) wxHtmlParser*             { $target = wxPyMake_wxObject($source); }
 
 404 //%typemap(python, out) wxHtmlWinParser*          { $target = wxPyMake_wxObject($source); }
 
 406 //---------------------------------------------------------------------------
 
 407 //---------------------------------------------------------------------------