From: Robin Dunn <robin@alldunn.com>
Date: Thu, 22 Aug 2002 00:00:04 +0000 (+0000)
Subject: A more dynamic wxWizard sample, and a fix for wxGrid wrappers
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/85260f24dea6546ecfff376bac1d8838237ec2fe

A more dynamic wxWizard sample, and a fix for wxGrid wrappers


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16668 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

diff --git a/wxPython/demo/wxWizard.py b/wxPython/demo/wxWizard.py
index 053567fadc..402a307031 100644
--- a/wxPython/demo/wxWizard.py
+++ b/wxPython/demo/wxWizard.py
@@ -6,21 +6,88 @@ import images
 
 #----------------------------------------------------------------------
 
+def makePageTitle(wizPg, title):
+    sizer = wxBoxSizer(wxVERTICAL)
+    wizPg.SetSizer(sizer)
+    title = wxStaticText(wizPg, -1, title)
+    title.SetFont(wxFont(18, wxSWISS, wxNORMAL, wxBOLD))
+    sizer.AddWindow(title, 0, wxALIGN_CENTRE|wxALL, 5)
+    sizer.AddWindow(wxStaticLine(wizPg, -1), 0, wxEXPAND|wxALL, 5)
+    return sizer
+
+#----------------------------------------------------------------------
+
 class TitledPage(wxWizardPageSimple):
     def __init__(self, parent, title):
         wxWizardPageSimple.__init__(self, parent)
-        self.sizer = sizer = wxBoxSizer(wxVERTICAL)
-        self.SetSizer(sizer)
+        self.sizer = makePageTitle(self, title)
+
+
+#----------------------------------------------------------------------
+
+class SkipNextPage(wxPyWizardPage):
+    def __init__(self, parent, title):
+        wxPyWizardPage.__init__(self, parent)
+        self.next = self.prev = None
+        self.sizer = makePageTitle(self, title)
+
+        self.cb = wxCheckBox(self, -1, "Skip next page")
+        self.sizer.Add(self.cb, 0, wxALL, 5)
 
-        title = wxStaticText(self, -1, title)
-        title.SetFont(wxFont(18, wxSWISS, wxNORMAL, wxBOLD))
-        sizer.AddWindow(title, 0, wxALIGN_CENTRE|wxALL, 5)
-        sizer.AddWindow(wxStaticLine(self, -1), 0, wxEXPAND|wxALL, 5)
+    def SetNext(self, next):
+        self.next = next
 
+    def SetPrev(self, prev):
+        self.prev = prev
 
 
+    # Classes derived from wxPyWizardPanel must override
+    # GetNext and GetPrev, and may also override GetBitmap
+    # as well as all those methods overridable by
+    # wxPyWindow.
+
+    def GetNext(self):
+        """If the checkbox is set then return the next page's next page"""
+        next = self.next
+        if self.cb.GetValue():
+            next = next.GetNext()
+        return next
+
+    def GetPrev(self):
+        return self.prev
+
 #----------------------------------------------------------------------
 
+class UseAltBitmapPage(wxPyWizardPage):
+    def __init__(self, parent, title):
+        wxPyWizardPage.__init__(self, parent)
+        self.next = self.prev = None
+        self.sizer = makePageTitle(self, title)
+
+        self.sizer.Add(wxStaticText(self, -1, "This page uses a different bitmap"),
+                       0, wxALL, 5)
+
+    def SetNext(self, next):
+        self.next = next
+
+    def SetPrev(self, prev):
+        self.prev = prev
+
+    def GetNext(self):
+        return self.next
+
+    def GetPrev(self):
+        return self.prev
+
+    def GetBitmap(self):
+        # You usually wouldn't need to override this method
+        # since you can set a non-default bitmap in the
+        # wxWizardPageSimple constructor, but if you need to
+        # dynamically change the bitmap based on the
+        # contents of the wizard, or need to also change the
+        # next/prev order then it can be done by overriding
+        # GetBitmap.
+        return images.getWizTest2Bitmap()
 
 #----------------------------------------------------------------------
 
@@ -61,7 +128,14 @@ class TestPanel(wxPanel):
 
 
     def OnWizCancel(self, evt):
-        pass
+        page = evt.GetPage()
+        self.log.write("OnWizCancel: %s\n" % page.__class__)
+
+        # Show how to prevent cancelling of the wizard.  The
+        # other events can be Veto'd too.
+        if page is self.page1:
+            wxMessageBox("Cancelling on the first page has been prevented.", "Sorry")
+            evt.Veto()
 
 
     def OnRunSimpleWizard(self, evt):
@@ -72,13 +146,15 @@ class TestPanel(wxPanel):
         page2 = TitledPage(wizard, "Page 2")
         page3 = TitledPage(wizard, "Page 3")
         page4 = TitledPage(wizard, "Page 4")
+        self.page1 = page1
 
-        page1.sizer.Add(wxStaticText(page1, -1, """\
+        page1.sizer.Add(wxStaticText(page1, -1, """
 This wizard is totally useless, but is meant to show how to
 chain simple wizard pages together in a non-dynamic manner.
 IOW, the order of the pages never changes, and so the
 wxWizardPageSimple class can easily be used for the pages."""))
         wizard.FitToPage(page1)
+        page4.sizer.Add(wxStaticText(page4, -1, "\nThis is the last page."))
 
         # Use the convenience Chain function to connect the pages
         wxWizardPageSimple_Chain(page1, page2)
@@ -93,7 +169,39 @@ wxWizardPageSimple class can easily be used for the pages."""))
 
 
     def OnRunDynamicWizard(self, evt):
-        pass
+        # Create the wizard and the pages
+        wizard = wxWizard(self, self.ID_wiz, "Simple Wizard",
+                          images.getWizTest1Bitmap())
+
+        page1 = TitledPage(wizard, "Page 1")
+        page2 = SkipNextPage(wizard, "Page 2")
+        page3 = TitledPage(wizard, "Page 3")
+        page4 = UseAltBitmapPage(wizard, "Page 4")
+        page5 = TitledPage(wizard, "Page 5")
+        self.page1 = page1
+
+        page1.sizer.Add(wxStaticText(page1, -1, """
+This wizard shows the ability to choose at runtime the order
+of the pages and also which bitmap is shown.
+"""))
+        wizard.FitToPage(page1)
+        page5.sizer.Add(wxStaticText(page5, -1, "\nThis is the last page."))
+
+        # Set the initial order of the pages
+        page1.SetNext(page2)
+        page2.SetPrev(page1)
+        page2.SetNext(page3)
+        page3.SetPrev(page2)
+        page3.SetNext(page4)
+        page4.SetPrev(page3)
+        page4.SetNext(page5)
+        page5.SetPrev(page4)
+
+
+        if wizard.RunWizard(page1):
+            wxMessageBox("Wizard completed successfully", "That's all folks!")
+        else:
+            wxMessageBox("Wizard was cancelled", "That's all folks!")
 
 #----------------------------------------------------------------------
 
diff --git a/wxPython/src/grid.i b/wxPython/src/grid.i
index 147ca26bf4..bb353e2e8d 100644
--- a/wxPython/src/grid.i
+++ b/wxPython/src/grid.i
@@ -398,7 +398,7 @@ wxPyMake_TEMPLATE(wxGridTableBase)
     void CBNAME(int a, const wxString& c)  {                                    \
         bool found;                                                             \
         wxPyBeginBlockThreads();                                                \
-        if (wxPyCBH_findCallback(m_myInst, #CBNAME)) {                          \
+        if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) {                \
             PyObject* s = wx2PyString(c);                                       \
             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iO)",a,s));          \
             Py_DECREF(s);                                                       \
diff --git a/wxPython/src/msw/grid.cpp b/wxPython/src/msw/grid.cpp
index 9af5e6c4c4..25954b9060 100644
--- a/wxPython/src/msw/grid.cpp
+++ b/wxPython/src/msw/grid.cpp
@@ -425,7 +425,7 @@ wxPyMake_TEMPLATE(wxGridTableBase)
     void CBNAME(int a, const wxString& c)  {                                    \
         bool found;                                                             \
         wxPyBeginBlockThreads();                                                \
-        if (wxPyCBH_findCallback(m_myInst, #CBNAME)) {                          \
+        if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) {                \
             PyObject* s = wx2PyString(c);                                       \
             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iO)",a,s));          \
             Py_DECREF(s);                                                       \
diff --git a/wxPython/src/msw/misc2.cpp b/wxPython/src/msw/misc2.cpp
index 1c55aa1c0a..6fbe6cab8b 100644
--- a/wxPython/src/msw/misc2.cpp
+++ b/wxPython/src/msw/misc2.cpp
@@ -6567,6 +6567,90 @@ static PyObject *_wrap_wxProcess_CloseOutput(PyObject *self, PyObject *args, PyO
     return _resultobj;
 }
 
+#define wxProcess_IsInputOpened(_swigobj)  (_swigobj->IsInputOpened())
+static PyObject *_wrap_wxProcess_IsInputOpened(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxPyProcess * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxProcess_IsInputOpened",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxPyProcess_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxProcess_IsInputOpened. Expected _wxPyProcess_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (bool )wxProcess_IsInputOpened(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxProcess_IsInputAvailable(_swigobj)  (_swigobj->IsInputAvailable())
+static PyObject *_wrap_wxProcess_IsInputAvailable(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxPyProcess * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxProcess_IsInputAvailable",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxPyProcess_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxProcess_IsInputAvailable. Expected _wxPyProcess_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (bool )wxProcess_IsInputAvailable(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxProcess_IsErrorAvailable(_swigobj)  (_swigobj->IsErrorAvailable())
+static PyObject *_wrap_wxProcess_IsErrorAvailable(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxPyProcess * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxProcess_IsErrorAvailable",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxPyProcess_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxProcess_IsErrorAvailable. Expected _wxPyProcess_p.");
+        return NULL;
+        }
+    }
+{
+    PyThreadState* __tstate = wxPyBeginAllowThreads();
+    _result = (bool )wxProcess_IsErrorAvailable(_arg0);
+
+    wxPyEndAllowThreads(__tstate);
+    if (PyErr_Occurred()) return NULL;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
 static void *SwigwxJoystickTowxObject(void *ptr) {
     wxJoystick *src;
     wxObject *dest;
@@ -10483,6 +10567,9 @@ static PyMethodDef misc2cMethods[] = {
 	 { "wxJoystick_GetPosition", (PyCFunction) _wrap_wxJoystick_GetPosition, METH_VARARGS | METH_KEYWORDS },
 	 { "delete_wxJoystick", (PyCFunction) _wrap_delete_wxJoystick, METH_VARARGS | METH_KEYWORDS },
 	 { "new_wxJoystick", (PyCFunction) _wrap_new_wxJoystick, METH_VARARGS | METH_KEYWORDS },
+	 { "wxProcess_IsErrorAvailable", (PyCFunction) _wrap_wxProcess_IsErrorAvailable, METH_VARARGS | METH_KEYWORDS },
+	 { "wxProcess_IsInputAvailable", (PyCFunction) _wrap_wxProcess_IsInputAvailable, METH_VARARGS | METH_KEYWORDS },
+	 { "wxProcess_IsInputOpened", (PyCFunction) _wrap_wxProcess_IsInputOpened, METH_VARARGS | METH_KEYWORDS },
 	 { "wxProcess_CloseOutput", (PyCFunction) _wrap_wxProcess_CloseOutput, METH_VARARGS | METH_KEYWORDS },
 	 { "wxProcess_GetOutputStream", (PyCFunction) _wrap_wxProcess_GetOutputStream, METH_VARARGS | METH_KEYWORDS },
 	 { "wxProcess_GetErrorStream", (PyCFunction) _wrap_wxProcess_GetErrorStream, METH_VARARGS | METH_KEYWORDS },
diff --git a/wxPython/src/msw/misc2.py b/wxPython/src/msw/misc2.py
index df54b3c25f..39aa1535ff 100644
--- a/wxPython/src/msw/misc2.py
+++ b/wxPython/src/msw/misc2.py
@@ -604,6 +604,15 @@ class wxProcessPtr(wxEvtHandlerPtr):
     def CloseOutput(self, *_args, **_kwargs):
         val = apply(misc2c.wxProcess_CloseOutput,(self,) + _args, _kwargs)
         return val
+    def IsInputOpened(self, *_args, **_kwargs):
+        val = apply(misc2c.wxProcess_IsInputOpened,(self,) + _args, _kwargs)
+        return val
+    def IsInputAvailable(self, *_args, **_kwargs):
+        val = apply(misc2c.wxProcess_IsInputAvailable,(self,) + _args, _kwargs)
+        return val
+    def IsErrorAvailable(self, *_args, **_kwargs):
+        val = apply(misc2c.wxProcess_IsErrorAvailable,(self,) + _args, _kwargs)
+        return val
     def __repr__(self):
         return "<C wxProcess instance at %s>" % (self.this,)
 class wxProcess(wxProcessPtr):
diff --git a/wxPython/src/msw/wizard.cpp b/wxPython/src/msw/wizard.cpp
index 9f43004ac8..0e33f29e18 100644
--- a/wxPython/src/msw/wizard.cpp
+++ b/wxPython/src/msw/wizard.cpp
@@ -2264,6 +2264,9 @@ SWIGEXPORT(void) initwizardc() {
 	 PyDict_SetItemString(d,"wxEVT_WIZARD_PAGE_CHANGING", PyInt_FromLong((long) wxEVT_WIZARD_PAGE_CHANGING));
 	 PyDict_SetItemString(d,"wxEVT_WIZARD_CANCEL", PyInt_FromLong((long) wxEVT_WIZARD_CANCEL));
 	 PyDict_SetItemString(d,"wxEVT_WIZARD_HELP", PyInt_FromLong((long) wxEVT_WIZARD_HELP));
+
+    wxClassInfo::CleanUpClasses();
+    wxClassInfo::InitializeClasses();
 {
    int i;
    for (i = 0; _swig_mapping[i].n1; i++)
diff --git a/wxPython/src/wizard.i b/wxPython/src/wizard.i
index 5a1e4dbdca..b53e3d313c 100644
--- a/wxPython/src/wizard.i
+++ b/wxPython/src/wizard.i
@@ -343,6 +343,12 @@ public:
 
 
 //----------------------------------------------------------------------
+
+%init %{
+    wxClassInfo::CleanUpClasses();
+    wxClassInfo::InitializeClasses();
+%}
+
 //----------------------------------------------------------------------
 // This file gets appended to the shadow class file.
 //----------------------------------------------------------------------