-#if 0
// This class is a mixin that provides storage and management of "client
// data." The client data stored can either be a pointer to a wxClientData
// object in which case it is managed by the container (i.e. it will delete
// the data when it's destroyed) or an untyped pointer which won't be deleted
-// by the window - but not both of them
+// by the container - but not both of them
+//
+// NOTE: This functionality is currently duplicated in wxEvtHandler in order
+// to avoid having more than one vtable in that class heirachy.
class WXDLLEXPORT wxClientDataContainer
{
wxClientDataType m_clientDataType;
};
-#endif
+
// ----------------------------------------------------------------------------
#endif
{ m_ratio = (width && height) ? ((float) width / (float) height) : 1; }
void SetRatio( wxSize size )
{ m_ratio = (size.x && size.y) ? ((float) size.x / (float) size.y) : 1; }
- void SetRatio( float ratio )
+ void SetRatio( float ratio )
{ m_ratio = ratio; }
- float GetRatio() const
+ float GetRatio() const
{ return m_ratio; }
bool IsWindow();
bool IsSizer();
bool IsSpacer();
-
+
void SetInitSize( int x, int y )
{ m_minSize.x = x; m_minSize.y = y; }
void SetOption( int option )
// is shrinked. it is safer to preserve initial value.
float m_ratio;
wxObject *m_userData;
-
+
private:
DECLARE_CLASS(wxSizerItem);
};
// wxSizer
//---------------------------------------------------------------------------
-class WXDLLEXPORT wxSizer: public wxObject
+class WXDLLEXPORT wxSizer: public wxObject, public wxClientDataContainer
{
public:
wxSizer();
// ----------------------------------------------------------------------------
-#if 0
+
wxClientDataContainer::wxClientDataContainer()
{
return m_clientData;
}
-#endif
+
// ----------------------------------------------------------------------------
self.SetSizer(sizer)
self.SetAutoLayout(true)
+ self.sizer = sizer # save it for testing later
+
EVT_BUTTON(self, BTN1, self.OnFindButton1)
EVT_BUTTON(self, BTN2, self.OnFindButton2)
else:
self.log.write("The objects are NOT the same! <frown>\n")
+ sizer = self.GetSizer()
+ if sizer is None:
+ self.log.write("***** OOPS! None returned...\n")
+ return
+ if sizer is self.sizer:
+ self.log.write("The objects are the same! <grin>\n")
+ else:
+ self.log.write("The objects are NOT the same! <frown>\n")
+
#----------------------------------------------------------------------
theClass = globals()[typeStr+"Ptr"]
typeStr = __wxPyPtrTypeMap.get(typeStr, typeStr)
if hasattr(obj, "this"):
- if obj.__class__ is theClass: # if already the right type then just return it
+ # if already the right type then just return it
+ if isinstance(obj, theClass) or obj.__class__ is theClass:
return obj
newPtr = ptrcast(obj.this, typeStr+"_p")
else:
bool isEvtHandler = FALSE;
if (source) {
+ // If it's derived from wxEvtHandler then there may
+ // already be a pointer to a Python objec that we can use.
if (wxIsKindOf(source, wxEvtHandler)) {
wxEvtHandler* eh = (wxEvtHandler*)source;
wxPyClientData* data = (wxPyClientData*)eh->GetClientObject();
Py_INCREF(target);
}
}
+ else if (wxIsKindOf(source, wxSizer)) {
+ // wxSizers also track the original object
+ wxSizer* sz = (wxSizer*)source;
+ wxPyClientData* data = (wxPyClientData*)sz->GetClientObject();
+ if (data) {
+ target = data->m_obj;
+ Py_INCREF(target);
+ }
+ }
if (! target) {
+ // Otherwise make it the old fashioned way by making a
+ // new shadow object and putting this pointer in it.
wxClassInfo* info = source->GetClassInfo();
wxChar* name = (wxChar*)info->GetClassName();
PyObject* klass = wxPyClassExists(name);
//---------------------------------------------------------------------------
-// static PyThreadState* myPyThreadState_Get() {
-// PyThreadState* current;
-// current = PyThreadState_Swap(NULL);
-// PyThreadState_Swap(current);
-// return current;
-// }
-
-
-// bool wxPyRestoreThread() {
-// // NOTE: The Python API docs state that if a thread already has the
-// // interpreter lock and calls PyEval_RestoreThread again a deadlock
-// // occurs, so I put in this code as a guard condition since there are
-// // many possibilites for nested events and callbacks in wxPython. If
-// // The current thread is our thread, then we can assume that we
-// // already have the lock. (I hope!)
-// //
-// #ifdef WXP_WITH_THREAD
-// if (wxPyEventThreadState != myPyThreadState_Get()) {
-// PyEval_AcquireThread(wxPyEventThreadState);
-// return TRUE;
-// }
-// else
-// #endif
-// return FALSE;
-// }
-
-
-// void wxPySaveThread(bool doSave) {
-// #ifdef WXP_WITH_THREAD
-// if (doSave) {
-// PyEval_ReleaseThread(wxPyEventThreadState);
-// }
-// #endif
-// }
-
-
wxPyTState* wxPyBeginBlockThreads() {
wxPyTState* state = NULL;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
-// These classes can be derived from in Python and passed through the event
+// These event classes can be derived from in Python and passed through the event
// system without losing anything. They do this by keeping a reference to
// themselves and some special case handling in wxPyCallback::EventThunker.
return (void *) dest;
}
+static void wxSizer__setOORInfo(wxSizer *self,PyObject * _self) {
+ self->SetClientObject(new wxPyClientData(_self));
+ }
+static PyObject *_wrap_wxSizer__setOORInfo(PyObject *self, PyObject *args, PyObject *kwargs) {
+ PyObject * _resultobj;
+ wxSizer * _arg0;
+ PyObject * _arg1;
+ PyObject * _argo0 = 0;
+ PyObject * _obj1 = 0;
+ char *_kwnames[] = { "self","_self", NULL };
+
+ self = self;
+ if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxSizer__setOORInfo",_kwnames,&_argo0,&_obj1))
+ return NULL;
+ if (_argo0) {
+ if (_argo0 == Py_None) { _arg0 = NULL; }
+ else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxSizer_p")) {
+ PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxSizer__setOORInfo. Expected _wxSizer_p.");
+ return NULL;
+ }
+ }
+{
+ _arg1 = _obj1;
+}
+{
+ wxPy_BEGIN_ALLOW_THREADS;
+ wxSizer__setOORInfo(_arg0,_arg1);
+
+ wxPy_END_ALLOW_THREADS;
+ if (PyErr_Occurred()) return NULL;
+} Py_INCREF(Py_None);
+ _resultobj = Py_None;
+ return _resultobj;
+}
+
static void wxSizer_Destroy(wxSizer *self) { delete self; }
static PyObject *_wrap_wxSizer_Destroy(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj;
{ "wxSizer_AddSizer", (PyCFunction) _wrap_wxSizer_AddSizer, METH_VARARGS | METH_KEYWORDS },
{ "wxSizer_AddWindow", (PyCFunction) _wrap_wxSizer_AddWindow, METH_VARARGS | METH_KEYWORDS },
{ "wxSizer_Destroy", (PyCFunction) _wrap_wxSizer_Destroy, METH_VARARGS | METH_KEYWORDS },
+ { "wxSizer__setOORInfo", (PyCFunction) _wrap_wxSizer__setOORInfo, METH_VARARGS | METH_KEYWORDS },
{ "wxSizerItem_GetUserData", (PyCFunction) _wrap_wxSizerItem_GetUserData, METH_VARARGS | METH_KEYWORDS },
{ "wxSizerItem_SetBorder", (PyCFunction) _wrap_wxSizerItem_SetBorder, METH_VARARGS | METH_KEYWORDS },
{ "wxSizerItem_SetFlag", (PyCFunction) _wrap_wxSizerItem_SetFlag, METH_VARARGS | METH_KEYWORDS },
def __init__(self,this):
self.this = this
self.thisown = 0
+ def _setOORInfo(self, *_args, **_kwargs):
+ val = apply(sizersc.wxSizer__setOORInfo,(self,) + _args, _kwargs)
+ return val
def Destroy(self, *_args, **_kwargs):
val = apply(sizersc.wxSizer_Destroy,(self,) + _args, _kwargs)
return val
self.this = apply(sizersc.new_wxPySizer,_args,_kwargs)
self.thisown = 1
self._setCallbackInfo(self, wxPySizer)
+ self._setOORInfo(self)
def __init__(self,*_args,**_kwargs):
self.this = apply(sizersc.new_wxBoxSizer,_args,_kwargs)
self.thisown = 1
+ self._setOORInfo(self)
def __init__(self,*_args,**_kwargs):
self.this = apply(sizersc.new_wxStaticBoxSizer,_args,_kwargs)
self.thisown = 1
+ self._setOORInfo(self)
def __init__(self,*_args,**_kwargs):
self.this = apply(sizersc.new_wxNotebookSizer,_args,_kwargs)
self.thisown = 1
+ self._setOORInfo(self)
def __init__(self,*_args,**_kwargs):
self.this = apply(sizersc.new_wxGridSizer,_args,_kwargs)
self.thisown = 1
+ self._setOORInfo(self)
def __init__(self,*_args,**_kwargs):
self.this = apply(sizersc.new_wxFlexGridSizer,_args,_kwargs)
self.thisown = 1
+ self._setOORInfo(self)
theClass = globals()[typeStr+"Ptr"]
typeStr = __wxPyPtrTypeMap.get(typeStr, typeStr)
if hasattr(obj, "this"):
- if obj.__class__ is theClass: # if already the right type then just return it
+ # if already the right type then just return it
+ if isinstance(obj, theClass) or obj.__class__ is theClass:
return obj
newPtr = ptrcast(obj.this, typeStr+"_p")
else:
// wxSizer(); **** abstract, can't instantiate
// ~wxSizer();
+ %addmethods {
+ void _setOORInfo(PyObject* _self) {
+ self->SetClientObject(new wxPyClientData(_self));
+ }
+ }
+
%addmethods {
void Destroy() { delete self; }
wxPySizer();
void _setCallbackInfo(PyObject* self, PyObject* _class);
%pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxPySizer)"
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
};
class wxBoxSizer : public wxSizer {
public:
wxBoxSizer(int orient = wxHORIZONTAL);
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
int GetOrientation();
void RecalcSizes();
wxSize CalcMin();
class wxStaticBoxSizer : public wxBoxSizer {
public:
wxStaticBoxSizer(wxStaticBox *box, int orient = wxHORIZONTAL);
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
wxStaticBox *GetStaticBox();
void RecalcSizes();
wxSize CalcMin();
class wxNotebookSizer: public wxSizer {
public:
wxNotebookSizer( wxNotebook *nb );
-
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
void RecalcSizes();
wxSize CalcMin();
-
wxNotebook *GetNotebook();
};
{
public:
wxGridSizer( int rows=1, int cols=0, int vgap=0, int hgap=0 );
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
void RecalcSizes();
wxSize CalcMin();
{
public:
wxFlexGridSizer( int rows=1, int cols=0, int vgap=0, int hgap=0 );
+ %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
void RecalcSizes();
wxSize CalcMin();