X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c8fac2b60de05657e9f3b0b0b511f57a77eb388a..6c3c55cf30584177001a3fdbfe0a011cac3f8996:/wxPython/src/grid.i diff --git a/wxPython/src/grid.i b/wxPython/src/grid.i index 0d0f37e65b..48bfc14501 100644 --- a/wxPython/src/grid.i +++ b/wxPython/src/grid.i @@ -13,7 +13,8 @@ %define DOCSTRING "Classes for implementing a spreadsheet-like control." %enddef -%module(docstring=DOCSTRING) grid + +%module(package="wx", docstring=DOCSTRING) grid %{ @@ -38,23 +39,22 @@ MAKE_CONST_WXSTRING_NOSWIG(EmptyString); MAKE_CONST_WXSTRING_NOSWIG(PanelNameStr); -MAKE_CONST_WXSTRING2(DateTimeFormatStr, wxT("%c")); - +MAKE_CONST_WXSTRING_NOSWIG(DefaultDateTimeFormat); //--------------------------------------------------------------------------- // OOR related typemaps and helper functions -%typemap(out) wxGridCellRenderer* { $result = wxPyMake_wxGridCellRenderer($1); } -%typemap(out) wxGridCellEditor* { $result = wxPyMake_wxGridCellEditor($1); } -%typemap(out) wxGridCellAttr* { $result = wxPyMake_wxGridCellAttr($1); } -%typemap(out) wxGridCellAttrProvider* { $result = wxPyMake_wxGridCellAttrProvider($1); } -%typemap(out) wxGridTableBase* { $result = wxPyMake_wxGridTableBase($1); } +%typemap(out) wxGridCellRenderer* { $result = wxPyMake_wxGridCellRenderer($1, $owner); } +%typemap(out) wxGridCellEditor* { $result = wxPyMake_wxGridCellEditor($1, $owner); } +%typemap(out) wxGridCellAttr* { $result = wxPyMake_wxGridCellAttr($1, $owner); } +%typemap(out) wxGridCellAttrProvider* { $result = wxPyMake_wxGridCellAttrProvider($1, $owner); } +%typemap(out) wxGridTableBase* { $result = wxPyMake_wxGridTableBase($1, $owner); } %{ #define wxPyMake_TEMPLATE(TYPE) \ -PyObject* wxPyMake_##TYPE(TYPE* source) { \ +PyObject* wxPyMake_##TYPE(TYPE* source, bool setThisOwn) { \ PyObject* target = NULL; \ if (source) { \ /* Check if there is already a pointer to a Python object in the \ @@ -62,12 +62,13 @@ PyObject* wxPyMake_##TYPE(TYPE* source) { \ wxPyOORClientData* data = (wxPyOORClientData*)source->GetClientObject(); \ if (data) { \ target = data->m_obj; \ - Py_INCREF(target); \ + if (target) \ + Py_INCREF(target); \ } \ /* Otherwise make a new wrapper for it the old fashioned way and \ give it the OOR treatment */ \ if (! target) { \ - target = wxPyConstructObject(source, wxT(#TYPE), False); \ + target = wxPyConstructObject(source, wxT(#TYPE), setThisOwn); \ if (target) \ source->SetClientObject(new wxPyOORClientData(target)); \ } \ @@ -98,7 +99,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) wxGridCellAttr* CBNAME(int a, int b, wxGridCellAttr::wxAttrKind c) { \ wxGridCellAttr* rval = NULL; \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* ro; \ wxGridCellAttr* ptr; \ @@ -122,10 +123,10 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__GCAINTINT(PCLASS, CBNAME) \ void CBNAME(wxGridCellAttr *attr, int a, int b) { \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ bool found; \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ - PyObject* obj = wxPyMake_wxGridCellAttr(attr); \ + PyObject* obj = wxPyMake_wxGridCellAttr(attr,false); \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(Oii)", obj, a, b)); \ Py_DECREF(obj); \ } \ @@ -141,10 +142,10 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__GCAINT(PCLASS, CBNAME) \ void CBNAME(wxGridCellAttr *attr, int val) { \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ bool found; \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ - PyObject* obj = wxPyMake_wxGridCellAttr(attr); \ + PyObject* obj = wxPyMake_wxGridCellAttr(attr,false); \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(Oi)", obj, val)); \ Py_DECREF(obj); \ } \ @@ -160,7 +161,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK_INT__pure(CBNAME) \ int CBNAME() { \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ int rval = 0; \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); \ @@ -172,7 +173,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK_BOOL_INTINT_pure(CBNAME) \ bool CBNAME(int a, int b) { \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ bool rval = 0; \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(ii)",a,b)); \ @@ -183,7 +184,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK_STRING_INTINT_pure(CBNAME) \ wxString CBNAME(int a, int b) { \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ wxString rval; \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* ro; \ @@ -200,7 +201,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__INTINTSTRING_pure(CBNAME) \ void CBNAME(int a, int b, const wxString& c) { \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* s = wx2PyString(c); \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiO)",a,b,s));\ @@ -213,7 +214,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK_STRING_INTINT(PCLASS, CBNAME) \ wxString CBNAME(int a, int b) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ wxString rval; \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* ro; \ @@ -237,7 +238,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) bool CBNAME(int a, int b, const wxString& c) { \ bool rval = 0; \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* s = wx2PyString(c); \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiO)",a,b,s));\ @@ -259,7 +260,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) long CBNAME(int a, int b) { \ long rval; \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(ii)", a,b)); \ wxPyEndBlockThreads(blocked); \ @@ -277,7 +278,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) bool CBNAME(int a, int b) { \ bool rval = 0; \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(ii)", a,b)); \ wxPyEndBlockThreads(blocked); \ @@ -294,7 +295,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK_DOUBLE_INTINT(PCLASS, CBNAME) \ double CBNAME(int a, int b) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ double rval; \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* ro; \ @@ -319,7 +320,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__(PCLASS, CBNAME) \ void CBNAME() { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); \ wxPyEndBlockThreads(blocked); \ @@ -337,7 +338,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) bool CBNAME(size_t a, size_t b) { \ bool rval = 0; \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(ii)", a,b)); \ wxPyEndBlockThreads(blocked); \ @@ -355,7 +356,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) bool CBNAME(size_t a) { \ bool rval = 0; \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(i)", a)); \ wxPyEndBlockThreads(blocked); \ @@ -371,7 +372,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK_STRING_INT(PCLASS, CBNAME) \ wxString CBNAME(int a) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ wxString rval; \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* ro; \ @@ -394,7 +395,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__INTSTRING(PCLASS, CBNAME) \ void CBNAME(int a, const wxString& c) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* s = wx2PyString(c); \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iO)",a,s)); \ @@ -415,7 +416,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) bool CBNAME() { \ bool rval = 0; \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); \ wxPyEndBlockThreads(blocked); \ @@ -432,7 +433,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__SIZETINT(PCLASS, CBNAME) \ void CBNAME(size_t a, int b) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(ii)", a,b)); \ wxPyEndBlockThreads(blocked); \ @@ -449,7 +450,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__INTINTLONG(PCLASS, CBNAME) \ void CBNAME(int a, int b, long c) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iii)", a,b,c)); \ wxPyEndBlockThreads(blocked); \ @@ -466,7 +467,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__INTINTDOUBLE(PCLASS, CBNAME) \ void CBNAME(int a, int b, double c) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iif)", a,b,c)); \ wxPyEndBlockThreads(blocked); \ @@ -482,7 +483,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) #define PYCALLBACK__INTINTBOOL(PCLASS, CBNAME) \ void CBNAME(int a, int b, bool c) { \ bool found; \ - bool blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iii)", a,b,c)); \ wxPyEndBlockThreads(blocked); \ @@ -520,6 +521,33 @@ const wxRect wxGridNoCellRect; %mutable; +%{ +#define wxGRID_DEFAULT_NUMBER_ROWS WXGRID_DEFAULT_NUMBER_ROWS +#define wxGRID_DEFAULT_NUMBER_COLS WXGRID_DEFAULT_NUMBER_COLS +#define wxGRID_DEFAULT_ROW_HEIGHT WXGRID_DEFAULT_ROW_HEIGHT +#define wxGRID_DEFAULT_COL_WIDTH WXGRID_DEFAULT_COL_WIDTH +#define wxGRID_DEFAULT_COL_LABEL_HEIGHT WXGRID_DEFAULT_COL_LABEL_HEIGHT +#define wxGRID_DEFAULT_ROW_LABEL_WIDTH WXGRID_DEFAULT_ROW_LABEL_WIDTH +#define wxGRID_LABEL_EDGE_ZONE WXGRID_LABEL_EDGE_ZONE +#define wxGRID_MIN_ROW_HEIGHT WXGRID_MIN_ROW_HEIGHT +#define wxGRID_MIN_COL_WIDTH WXGRID_MIN_COL_WIDTH +#define wxGRID_DEFAULT_SCROLLBAR_WIDTH WXGRID_DEFAULT_SCROLLBAR_WIDTH +%} + +enum { + wxGRID_DEFAULT_NUMBER_ROWS, + wxGRID_DEFAULT_NUMBER_COLS, + wxGRID_DEFAULT_ROW_HEIGHT, + wxGRID_DEFAULT_COL_WIDTH, + wxGRID_DEFAULT_COL_LABEL_HEIGHT, + wxGRID_DEFAULT_ROW_LABEL_WIDTH, + wxGRID_LABEL_EDGE_ZONE, + wxGRID_MIN_ROW_HEIGHT, + wxGRID_MIN_COL_WIDTH, + wxGRID_DEFAULT_SCROLLBAR_WIDTH +}; + + //--------------------------------------------------------------------------- // wxGridCellRenderer is an ABC, and several derived classes are available. // Classes implemented in Python should be derived from wxPyGridCellRenderer. @@ -530,7 +558,8 @@ class wxGridCellRenderer public: %extend { void _setOORInfo(PyObject* _self) { - self->SetClientObject(new wxPyOORClientData(_self)); + if (!self->GetClientObject()) + self->SetClientObject(new wxPyOORClientData(_self)); } } @@ -563,11 +592,11 @@ public: void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col, bool isSelected) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "Draw")) { - PyObject* go = wxPyMake_wxObject(&grid); - PyObject* dco = wxPyMake_wxObject(&dc); - PyObject* ao = wxPyMake_wxGridCellAttr(&attr); + PyObject* go = wxPyMake_wxObject(&grid,false); + PyObject* dco = wxPyMake_wxObject(&dc,false); + PyObject* ao = wxPyMake_wxGridCellAttr(&attr,false); PyObject* ro = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOOiii)", go, ao, dco, ro, @@ -583,13 +612,13 @@ public: wxSize GetBestSize(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, int row, int col) { wxSize rval; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "GetBestSize")) { PyObject* ro; wxSize* ptr; - PyObject* go = wxPyMake_wxObject(&grid); - PyObject* dco = wxPyMake_wxObject(&dc); - PyObject* ao = wxPyMake_wxGridCellAttr(&attr); + PyObject* go = wxPyMake_wxObject(&grid,false); + PyObject* dco = wxPyMake_wxObject(&dc,false); + PyObject* ao = wxPyMake_wxGridCellAttr(&attr,false); ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OOOii)", go, ao, dco, @@ -626,7 +655,7 @@ public: wxGridCellRenderer *Clone() const { wxGridCellRenderer* rval = NULL; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "Clone")) { PyObject* ro; wxGridCellRenderer* ptr; @@ -706,8 +735,8 @@ class wxGridCellDateTimeRenderer : public wxGridCellStringRenderer { public: %pythonAppend wxGridCellDateTimeRenderer "self._setOORInfo(self)" - wxGridCellDateTimeRenderer(wxString outformat = wxPyDateTimeFormatStr, - wxString informat = wxPyDateTimeFormatStr); + wxGridCellDateTimeRenderer(wxString outformat = wxPyDefaultDateTimeFormat, + wxString informat = wxPyDefaultDateTimeFormat); }; @@ -736,7 +765,8 @@ class wxGridCellEditor public: %extend { void _setOORInfo(PyObject* _self) { - self->SetClientObject(new wxPyOORClientData(_self)); + if (!self->GetClientObject()) + self->SetClientObject(new wxPyOORClientData(_self)); } } @@ -779,10 +809,10 @@ public: wxPyGridCellEditor() : wxGridCellEditor() {} void Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "Create")) { - PyObject* po = wxPyMake_wxObject(parent); - PyObject* eo = wxPyMake_wxObject(evtHandler); + PyObject* po = wxPyMake_wxObject(parent,false); + PyObject* eo = wxPyMake_wxObject(evtHandler,false); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OiO)", po, id, eo)); Py_DECREF(po); @@ -793,9 +823,9 @@ public: void BeginEdit(int row, int col, wxGrid* grid) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "BeginEdit")) { - PyObject* go = wxPyMake_wxObject(grid); + PyObject* go = wxPyMake_wxObject(grid,false); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiO)", row, col, go)); Py_DECREF(go); } @@ -804,10 +834,10 @@ public: bool EndEdit(int row, int col, wxGrid* grid) { - bool rv = False; - bool blocked = wxPyBeginBlockThreads(); + bool rv = false; + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "EndEdit")) { - PyObject* go = wxPyMake_wxObject(grid); + PyObject* go = wxPyMake_wxObject(grid,false); rv = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiO)", row, col, go)); Py_DECREF(go); } @@ -818,7 +848,7 @@ public: wxGridCellEditor* Clone() const { wxGridCellEditor* rval = NULL; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "Clone")) { PyObject* ro; wxGridCellEditor* ptr; @@ -836,9 +866,9 @@ public: void Show(bool show, wxGridCellAttr *attr) { bool found; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if ((found = wxPyCBH_findCallback(m_myInst, "Show"))) { - PyObject* ao = wxPyMake_wxGridCellAttr(attr); + PyObject* ao = wxPyMake_wxGridCellAttr(attr,false); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iO)", show, ao)); Py_DECREF(ao); } @@ -853,9 +883,9 @@ public: void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr) { bool found; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if ((found = wxPyCBH_findCallback(m_myInst, "PaintBackground)"))) { - PyObject* ao = wxPyMake_wxGridCellAttr(attr); + PyObject* ao = wxPyMake_wxGridCellAttr(attr,false); PyObject* ro = wxPyConstructObject((void*)&rectCell, wxT("wxRect"), 0); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)", ro, ao)); @@ -903,7 +933,7 @@ IMP_PYCALLBACK_STRING__constpure(wxPyGridCellEditor, wxGridCellEditor, GetValue) class wxPyGridCellEditor : public wxGridCellEditor { public: %pythonAppend wxPyGridCellEditor "self._setCallbackInfo(self, PyGridCellEditor);self._setOORInfo(self)" - + wxPyGridCellEditor(); void _setCallbackInfo(PyObject* self, PyObject* _class); @@ -962,7 +992,7 @@ public: %pythonAppend wxGridCellChoiceEditor "self._setOORInfo(self)" wxGridCellChoiceEditor(int choices = 0, const wxString* choices_array = NULL, - bool allowOthers = False); + bool allowOthers = false); virtual wxString GetValue(); }; @@ -1004,14 +1034,15 @@ public: %extend { void _setOORInfo(PyObject* _self) { - self->SetClientObject(new wxPyOORClientData(_self)); + if (!self->GetClientObject()) + self->SetClientObject(new wxPyOORClientData(_self)); } } - + %pythonAppend wxGridCellAttr "self._setOORInfo(self)" wxGridCellAttr(wxGridCellAttr *attrDefault = NULL); - + wxGridCellAttr *Clone() const; void MergeWith(wxGridCellAttr *mergefrom); void IncRef(); @@ -1021,8 +1052,8 @@ public: void SetFont(const wxFont& font); void SetAlignment(int hAlign, int vAlign); void SetSize(int num_rows, int num_cols); - void SetOverflow( bool allow = True ); - void SetReadOnly(bool isReadOnly = True); + void SetOverflow( bool allow = true ); + void SetReadOnly(bool isReadOnly = true); void SetRenderer(wxGridCellRenderer *renderer); void SetEditor(wxGridCellEditor* editor); @@ -1044,7 +1075,7 @@ public: DocDeclA( void, GetAlignment(int *OUTPUT, int *OUTPUT) const, "GetAlignment() -> (hAlign, vAlign)"); - + DocDeclA( void, GetSize(int *OUTPUT, int *OUTPUT) const, "GetSize() -> (num_rows, num_cols)"); @@ -1054,6 +1085,7 @@ public: wxGridCellEditor *GetEditor(wxGrid* grid, int row, int col) const; bool IsReadOnly() const; + wxAttrKind GetKind(); void SetDefAttr(wxGridCellAttr* defAttr); }; @@ -1068,7 +1100,8 @@ public: %extend { void _setOORInfo(PyObject* _self) { - self->SetClientObject(new wxPyOORClientData(_self)); + if (!self->GetClientObject()) + self->SetClientObject(new wxPyOORClientData(_self)); } } @@ -1129,7 +1162,8 @@ public: %extend { void _setOORInfo(PyObject* _self) { - self->SetClientObject(new wxPyOORClientData(_self)); + if (!self->GetClientObject()) + self->SetClientObject(new wxPyOORClientData(_self)); } } @@ -1218,12 +1252,17 @@ public: wxString GetValue(int row, int col) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); wxString rval; if (wxPyCBH_findCallback(m_myInst, "GetValue")) { PyObject* ro; ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(ii)",row,col)); if (ro) { + if (!PyString_Check(ro) && !PyUnicode_Check(ro)) { + PyObject* old = ro; + ro = PyObject_Str(ro); + Py_DECREF(old); + } rval = Py2wxString(ro); Py_DECREF(ro); } @@ -1233,7 +1272,7 @@ public: } void SetValue(int row, int col, const wxString& val) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "SetValue")) { PyObject* s = wx2PyString(val); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiO)",row,col,s)); @@ -1247,7 +1286,7 @@ public: // the GetValue and SetValue python methods. long GetValueAsLong( int row, int col ) { long rval = 0; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "GetValue")) { PyObject* ro; PyObject* num; @@ -1267,7 +1306,7 @@ public: double GetValueAsDouble( int row, int col ) { double rval = 0.0; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "GetValue")) { PyObject* ro; PyObject* num; @@ -1290,7 +1329,7 @@ public: } void SetValueAsLong( int row, int col, long value ) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "SetValue")) { wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iii)", row, col, value)); } @@ -1298,7 +1337,7 @@ public: } void SetValueAsDouble( int row, int col, double value ) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "SetValue")) { wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iid)", row, col, value)); } @@ -1413,7 +1452,7 @@ bool wxGridCellCoords_helper(PyObject* source, wxGridCellCoords** obj) { if (source == Py_None) { **obj = wxGridCellCoords(-1,-1); - return True; + return true; } // If source is an object instance then it may already be the right type @@ -1422,7 +1461,7 @@ bool wxGridCellCoords_helper(PyObject* source, wxGridCellCoords** obj) { if (! wxPyConvertSwigPtr(source, (void **)&ptr, wxT("wxGridCellCoords"))) goto error; *obj = ptr; - return True; + return true; } // otherwise a 2-tuple of integers is expected else if (PySequence_Check(source) && PyObject_Length(source) == 2) { @@ -1436,27 +1475,27 @@ bool wxGridCellCoords_helper(PyObject* source, wxGridCellCoords** obj) { **obj = wxGridCellCoords(PyInt_AsLong(o1), PyInt_AsLong(o2)); Py_DECREF(o1); Py_DECREF(o2); - return True; + return true; } error: PyErr_SetString(PyExc_TypeError, "Expected a 2-tuple of integers or a wxGridCellCoords object."); - return False; + return false; } bool wxGridCellCoords_typecheck(PyObject* source) { void* ptr; - + if (wxPySwigInstance_Check(source) && wxPyConvertSwigPtr(source, (void **)&ptr, wxT("wxGridCellCoords"))) - return True; + return true; PyErr_Clear(); if (PySequence_Check(source) && PySequence_Length(source) == 2) - return True; - - return False; + return true; + + return false; } %} @@ -1546,18 +1585,37 @@ typedef wxGrid::wxGridSelectionModes WXGRIDSELECTIONMODES; +MustHaveApp(wxGrid); + class wxGrid : public wxScrolledWindow { public: %pythonAppend wxGrid "self._setOORInfo(self)" + %pythonAppend wxGrid() "" + + %typemap(out) wxGrid*; // turn off this typemap wxGrid( wxWindow *parent, - wxWindowID id, + wxWindowID id=-1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxWANTS_CHARS, const wxString& name = wxPyPanelNameStr); + %RenameCtor(PreGrid, wxGrid()); + + + // Turn it back on again + %typemap(out) wxGrid* { $result = wxPyMake_wxObject($1, $owner); } + + + bool Create( wxWindow *parent, + wxWindowID id=-1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxWANTS_CHARS, + const wxString& name = wxPyPanelNameStr ); + enum wxGridSelectionModes { wxGridSelectCells, @@ -1586,17 +1644,17 @@ public: wxGridTableBase * GetTable() const; - bool SetTable( wxGridTableBase *table, bool takeOwnership=False, + bool SetTable( wxGridTableBase *table, bool takeOwnership=false, WXGRIDSELECTIONMODES selmode = wxGrid::wxGridSelectCells ); void ClearGrid(); - bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels=True ); - bool AppendRows( int numRows = 1, bool updateLabels=True ); - bool DeleteRows( int pos = 0, int numRows = 1, bool updateLabels=True ); - bool InsertCols( int pos = 0, int numCols = 1, bool updateLabels=True ); - bool AppendCols( int numCols = 1, bool updateLabels=True ); - bool DeleteCols( int pos = 0, int numCols = 1, bool updateLabels=True ); + bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels=true ); + bool AppendRows( int numRows = 1, bool updateLabels=true ); + bool DeleteRows( int pos = 0, int numRows = 1, bool updateLabels=true ); + bool InsertCols( int pos = 0, int numCols = 1, bool updateLabels=true ); + bool AppendCols( int numCols = 1, bool updateLabels=true ); + bool DeleteCols( int pos = 0, int numCols = 1, bool updateLabels=true ); // this function is called when the current cell highlight must be redrawn @@ -1638,7 +1696,7 @@ public: bool IsEditable(); void EnableEditing( bool edit ); - void EnableCellEditControl( bool enable = True ); + void EnableCellEditControl( bool enable = true ); void DisableCellEditControl(); bool CanEnableCellControl() const; bool IsCellEditControlEnabled() const; @@ -1682,8 +1740,8 @@ public: // check to see if a cell is either wholly visible (the default arg) or // at least partially visible in the grid window // - bool IsVisible( int row, int col, bool wholeCellVisible = True ); - // TODO: ??? bool IsVisible( const wxGridCellCoords& coords, bool wholeCellVisible = True ); + bool IsVisible( int row, int col, bool wholeCellVisible = true ); + // TODO: ??? bool IsVisible( const wxGridCellCoords& coords, bool wholeCellVisible = true ); void MakeCellVisible( int row, int col ); // TODO: ??? void MakeCellVisible( const wxGridCellCoords& coords ); @@ -1716,7 +1774,7 @@ public: DocDeclA( void, GetRowLabelAlignment( int *OUTPUT, int *OUTPUT ), "GetRowLabelAlignment() -> (horiz, vert)"); - + DocDeclA( void, GetColLabelAlignment( int *OUTPUT, int *OUTPUT ), "GetColLabelAlignment() -> (horiz, vert)"); @@ -1744,21 +1802,32 @@ public: void SetCellHighlightPenWidth(int width); void SetCellHighlightROPenWidth(int width); - void EnableDragRowSize( bool enable = True ); + void EnableDragRowSize( bool enable = true ); void DisableDragRowSize(); bool CanDragRowSize(); - void EnableDragColSize( bool enable = True ); + void EnableDragColSize( bool enable = true ); void DisableDragColSize(); bool CanDragColSize(); - void EnableDragGridSize(bool enable = True); + void EnableDragGridSize(bool enable = true); void DisableDragGridSize(); bool CanDragGridSize(); + void EnableDragCell( bool enable = true ); + void DisableDragCell(); + bool CanDragCell(); + // this sets the specified attribute for all cells in this row/col void SetAttr(int row, int col, wxGridCellAttr *attr); void SetRowAttr(int row, wxGridCellAttr *attr); void SetColAttr(int col, wxGridCellAttr *attr); + // returns the attribute we may modify in place: a new one if this cell + // doesn't have any yet or the existing one if it does + // + // DecRef() must be called on the returned pointer, as usual + wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const; + + // shortcuts for setting the column parameters // set the format for the data in the column: default is string @@ -1767,7 +1836,7 @@ public: void SetColFormatFloat(int col, int width = -1, int precision = -1); void SetColFormatCustom(int col, const wxString& typeName); - void EnableGridLines( bool enable = True ); + void EnableGridLines( bool enable = true ); bool GridLinesEnabled(); // ------ row and col formatting @@ -1786,7 +1855,7 @@ public: DocDeclA( void, GetDefaultCellAlignment( int *OUTPUT, int *OUTPUT ), "GetDefaultCellAlignment() -> (horiz, vert)"); - + DocDeclA( void, GetCellAlignment( int row, int col, int *OUTPUT, int *OUTPUT ), "GetCellAlignment() -> (horiz, vert)"); @@ -1798,22 +1867,22 @@ public: void, GetCellSize( int row, int col, int *OUTPUT, int *OUTPUT ), "GetCellSize(int row, int col) -> (num_rows, num_cols)"); - void SetDefaultRowSize( int height, bool resizeExistingRows = False ); + void SetDefaultRowSize( int height, bool resizeExistingRows = false ); void SetRowSize( int row, int height ); - void SetDefaultColSize( int width, bool resizeExistingCols = False ); + void SetDefaultColSize( int width, bool resizeExistingCols = false ); void SetColSize( int col, int width ); // automatically size the column or row to fit to its contents, if // setAsMin is True, this optimal width will also be set as minimal width // for this column - void AutoSizeColumn( int col, bool setAsMin = True ); - void AutoSizeRow( int row, bool setAsMin = True ); + void AutoSizeColumn( int col, bool setAsMin = true ); + void AutoSizeRow( int row, bool setAsMin = true ); // auto size all columns (very ineffective for big grids!) - void AutoSizeColumns( bool setAsMin = True ); - void AutoSizeRows( bool setAsMin = True ); + void AutoSizeColumns( bool setAsMin = true ); + void AutoSizeRows( bool setAsMin = true ); // auto size the grid, that is make the columns/rows of the "right" size // and also set the grid size to just fit its contents @@ -1876,15 +1945,15 @@ public: bool IsReadOnly(int row, int col) const; // make the cell editable/readonly - void SetReadOnly(int row, int col, bool isReadOnly = True); + void SetReadOnly(int row, int col, bool isReadOnly = true); // ------ selections of blocks of cells // - void SelectRow( int row, bool addToSelected = False ); - void SelectCol( int col, bool addToSelected = False ); + void SelectRow( int row, bool addToSelected = false ); + void SelectCol( int col, bool addToSelected = false ); void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol, - bool addToSelected = False ); + bool addToSelected = false ); // TODO: ??? void SelectBlock( const wxGridCellCoords& topLeft, // TODO: ??? const wxGridCellCoords& bottomRight ) @@ -1942,6 +2011,14 @@ public: wxWindow* GetGridColLabelWindow(); wxWindow* GetGridCornerLabelWindow(); + // Allow adjustment of scroll increment. The default is (15, 15). + void SetScrollLineX(int x); + void SetScrollLineY(int y); + int GetScrollLineX() const; + int GetScrollLineY() const; + + int GetScrollX(int x) const; + int GetScrollY(int y) const; static wxVisualAttributes GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); @@ -1958,8 +2035,8 @@ class wxGridEvent : public wxNotifyEvent { public: wxGridEvent(int id, wxEventType type, wxGrid* obj, - int row=-1, int col=-1, int x=-1, int y=-1, bool sel = True, - bool control=False, bool shift=False, bool alt=False, bool meta=False); + int row=-1, int col=-1, int x=-1, int y=-1, bool sel = true, + bool control=false, bool shift=false, bool alt=false, bool meta=false); virtual int GetRow(); virtual int GetCol(); @@ -1978,7 +2055,7 @@ class wxGridSizeEvent : public wxNotifyEvent public: wxGridSizeEvent(int id, wxEventType type, wxGrid* obj, int rowOrCol=-1, int x=-1, int y=-1, - bool control=False, bool shift=False, bool alt=False, bool meta=False); + bool control=false, bool shift=false, bool alt=false, bool meta=false); int GetRowOrCol(); wxPoint GetPosition(); @@ -1996,9 +2073,9 @@ public: wxGridRangeSelectEvent(int id, wxEventType type, wxGrid* obj, const wxGridCellCoords& topLeft, const wxGridCellCoords& bottomRight, - bool sel = True, - bool control=False, bool shift=False, - bool alt=False, bool meta=False); + bool sel = true, + bool control=false, bool shift=false, + bool alt=false, bool meta=false); wxGridCellCoords GetTopLeftCoords(); wxGridCellCoords GetBottomRightCoords(); @@ -2045,6 +2122,7 @@ public: %constant wxEventType wxEVT_GRID_EDITOR_SHOWN; %constant wxEventType wxEVT_GRID_EDITOR_HIDDEN; %constant wxEventType wxEVT_GRID_EDITOR_CREATED; +%constant wxEventType wxEVT_GRID_CELL_BEGIN_DRAG; @@ -2065,6 +2143,28 @@ EVT_GRID_SELECT_CELL = wx.PyEventBinder( wxEVT_GRID_SELECT_CELL ) EVT_GRID_EDITOR_SHOWN = wx.PyEventBinder( wxEVT_GRID_EDITOR_SHOWN ) EVT_GRID_EDITOR_HIDDEN = wx.PyEventBinder( wxEVT_GRID_EDITOR_HIDDEN ) EVT_GRID_EDITOR_CREATED = wx.PyEventBinder( wxEVT_GRID_EDITOR_CREATED ) +EVT_GRID_CELL_BEGIN_DRAG = wx.PyEventBinder( wxEVT_GRID_CELL_BEGIN_DRAG ) + + +%# The same as above but with the ability to specify an identifier +EVT_GRID_CMD_CELL_LEFT_CLICK = wx.PyEventBinder( wxEVT_GRID_CELL_LEFT_CLICK, 1 ) +EVT_GRID_CMD_CELL_RIGHT_CLICK = wx.PyEventBinder( wxEVT_GRID_CELL_RIGHT_CLICK, 1 ) +EVT_GRID_CMD_CELL_LEFT_DCLICK = wx.PyEventBinder( wxEVT_GRID_CELL_LEFT_DCLICK, 1 ) +EVT_GRID_CMD_CELL_RIGHT_DCLICK = wx.PyEventBinder( wxEVT_GRID_CELL_RIGHT_DCLICK, 1 ) +EVT_GRID_CMD_LABEL_LEFT_CLICK = wx.PyEventBinder( wxEVT_GRID_LABEL_LEFT_CLICK, 1 ) +EVT_GRID_CMD_LABEL_RIGHT_CLICK = wx.PyEventBinder( wxEVT_GRID_LABEL_RIGHT_CLICK, 1 ) +EVT_GRID_CMD_LABEL_LEFT_DCLICK = wx.PyEventBinder( wxEVT_GRID_LABEL_LEFT_DCLICK, 1 ) +EVT_GRID_CMD_LABEL_RIGHT_DCLICK = wx.PyEventBinder( wxEVT_GRID_LABEL_RIGHT_DCLICK, 1 ) +EVT_GRID_CMD_ROW_SIZE = wx.PyEventBinder( wxEVT_GRID_ROW_SIZE, 1 ) +EVT_GRID_CMD_COL_SIZE = wx.PyEventBinder( wxEVT_GRID_COL_SIZE, 1 ) +EVT_GRID_CMD_RANGE_SELECT = wx.PyEventBinder( wxEVT_GRID_RANGE_SELECT, 1 ) +EVT_GRID_CMD_CELL_CHANGE = wx.PyEventBinder( wxEVT_GRID_CELL_CHANGE, 1 ) +EVT_GRID_CMD_SELECT_CELL = wx.PyEventBinder( wxEVT_GRID_SELECT_CELL, 1 ) +EVT_GRID_CMD_EDITOR_SHOWN = wx.PyEventBinder( wxEVT_GRID_EDITOR_SHOWN, 1 ) +EVT_GRID_CMD_EDITOR_HIDDEN = wx.PyEventBinder( wxEVT_GRID_EDITOR_HIDDEN, 1 ) +EVT_GRID_CMD_EDITOR_CREATED = wx.PyEventBinder( wxEVT_GRID_EDITOR_CREATED, 1 ) +EVT_GRID_CMD_CELL_BEGIN_DRAG = wx.PyEventBinder( wxEVT_GRID_CELL_BEGIN_DRAG, 1 ) + } //---------------------------------------------------------------------------