]> git.saurik.com Git - wxWidgets.git/blame - samples/wizard/wizard.cpp
don't crash when invalid colour is set as fg/bg colour
[wxWidgets.git] / samples / wizard / wizard.cpp
CommitLineData
66cd017c 1/////////////////////////////////////////////////////////////////////////////
13f5935c 2// Name: wizard.cpp
66cd017c
VZ
3// Purpose: wxWindows sample demonstrating wxWizard control
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 15.08.99
7// RCS-ID: $Id$
8// Copyright: (c) Vadim Zeitlin
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20#ifdef __GNUG__
13f5935c
RL
21 #pragma implementation "wizard.cpp"
22 #pragma interface "wizard.cpp"
66cd017c
VZ
23#endif
24
25// For compilers that support precompilation, includes "wx/wx.h".
26#include "wx/wxprec.h"
27
28#ifdef __BORLANDC__
29 #pragma hdrstop
30#endif
31
32// for all others, include the necessary headers (this file is usually all you
33// need because it includes almost all "standard" wxWindows headers
34#ifndef WX_PRECOMP
35 #include "wx/wx.h"
36#endif
37
38#include "wx/wizard.h"
39
b87654f3
VZ
40#ifndef __WXMSW__
41 #include "wiztest.xpm"
42#endif
43
d93c719a
VZ
44// ----------------------------------------------------------------------------
45// constants
46// ----------------------------------------------------------------------------
47
48// ids for menu items
49enum
50{
51 Wizard_Quit = 100,
52 Wizard_Run,
53 Wizard_About = 1000
54};
55
56// ----------------------------------------------------------------------------
57// ressources
58// ----------------------------------------------------------------------------
59
60#ifdef __WXMSW__
61 #define BMP_WIZARD_1 wxBitmap("wiztest.bmp", wxBITMAP_TYPE_BMP)
62 #define BMP_WIZARD_2 wxBitmap("wiztest2.bmp", wxBITMAP_TYPE_BMP)
63#else
64 #define BMP_WIZARD_1 wxBitmap(wizimage)
65 #define BMP_WIZARD_2 wxBitmap(wizimage)
66#endif
67
66cd017c
VZ
68// ----------------------------------------------------------------------------
69// private classes
70// ----------------------------------------------------------------------------
71
72// Define a new application type, each program should derive a class from wxApp
73class MyApp : public wxApp
74{
75public:
76 // override base class virtuals
77 virtual bool OnInit();
78};
79
d93c719a
VZ
80class MyFrame : public wxFrame
81{
82public:
83 // ctor(s)
84 MyFrame(const wxString& title);
85
86 // event handlers (these functions should _not_ be virtual)
87 void OnQuit(wxCommandEvent& event);
88 void OnAbout(wxCommandEvent& event);
89 void OnRunWizard(wxCommandEvent& event);
90 void OnWizardCancel(wxWizardEvent& event);
91
92private:
93 // any class wishing to process wxWindows events must use this macro
94 DECLARE_EVENT_TABLE()
95};
66cd017c
VZ
96
97// ----------------------------------------------------------------------------
98// some pages for our wizard
99// ----------------------------------------------------------------------------
100
101// this shows how to simply control the validity of the user input by just
102// overriding TransferDataFromWindow() - of course, in a real program, the
103// check wouldn't be so trivial and the data will be probably saved somewhere
104// too
d93c719a
VZ
105//
106// it also shows how to use a different bitmap for one of the pages
74b31181 107class wxValidationPage : public wxWizardPageSimple
66cd017c
VZ
108{
109public:
74b31181 110 wxValidationPage(wxWizard *parent) : wxWizardPageSimple(parent)
66cd017c 111 {
d93c719a
VZ
112 m_bitmap = BMP_WIZARD_2;
113
74b31181 114 m_checkbox = new wxCheckBox(this, -1, "&Check me");
66cd017c
VZ
115 }
116
117 virtual bool TransferDataFromWindow()
118 {
74b31181 119 if ( !m_checkbox->GetValue() )
66cd017c 120 {
74b31181 121 wxMessageBox("Check the checkbox first!", "No way",
b87654f3 122 wxICON_WARNING | wxOK, this);
66cd017c
VZ
123
124 return FALSE;
125 }
126
127 return TRUE;
128 }
129
130private:
131 wxCheckBox *m_checkbox;
132};
133
74b31181
VZ
134// This is a more complicated example of validity checking: using events we may
135// allow to return to the previous page, but not to proceed. It also
136// demonstrates how to intercept [Cancel] button press.
137class wxRadioboxPage : public wxWizardPageSimple
138{
139public:
140 // directions in which we allow the user to proceed from this page
141 enum
142 {
143 Forward, Backward, Both, Neither
144 };
145
146 wxRadioboxPage(wxWizard *parent) : wxWizardPageSimple(parent)
147 {
148 // should correspond to the enum above
dc1efb1d
JS
149 // static wxString choices[] = { "forward", "backward", "both", "neither" };
150 // The above syntax can cause an internal compiler error with gcc.
151 wxString choices[4];
152 choices[0] = "forward";
153 choices[1] = "backward";
154 choices[2] = "both";
155 choices[3] = "neither";
74b31181
VZ
156
157 m_radio = new wxRadioBox(this, -1, "Allow to proceed:",
158 wxPoint(5, 5), wxDefaultSize,
159 WXSIZEOF(choices), choices,
160 1, wxRA_SPECIFY_COLS);
161 m_radio->SetSelection(Both);
162 }
163
164 // wizard event handlers
165 void OnWizardCancel(wxWizardEvent& event)
166 {
167 if ( wxMessageBox("Do you really want to cancel?", "Question",
168 wxICON_QUESTION | wxYES_NO, this) != wxYES )
169 {
170 // not confirmed
171 event.Veto();
172 }
173 }
174
175 void OnWizardPageChanging(wxWizardEvent& event)
176 {
177 int sel = m_radio->GetSelection();
178
179 if ( sel == Both )
180 return;
181
182 if ( event.GetDirection() && sel == Forward )
183 return;
184
185 if ( !event.GetDirection() && sel == Backward )
186 return;
187
188 wxMessageBox("You can't go there", "Not allowed",
189 wxICON_WARNING | wxOK, this);
190
191 event.Veto();
192 }
193
194private:
195 wxRadioBox *m_radio;
196
197 DECLARE_EVENT_TABLE()
198};
199
200// this shows how to dynamically (i.e. during run-time) arrange the page order
201class wxCheckboxPage : public wxWizardPage
202{
203public:
204 wxCheckboxPage(wxWizard *parent,
205 wxWizardPage *prev,
206 wxWizardPage *next)
207 : wxWizardPage(parent)
208 {
209 m_prev = prev;
210 m_next = next;
211
212 (void)new wxStaticText(this, -1, "Try checking the box below and\n"
213 "then going back and clearing it");
214
215 m_checkbox = new wxCheckBox(this, -1, "&Skip the next page",
216 wxPoint(5, 30));
217 }
218
219 // implement wxWizardPage functions
220 virtual wxWizardPage *GetPrev() const { return m_prev; }
221 virtual wxWizardPage *GetNext() const
222 {
223 return m_checkbox->GetValue() ? m_next->GetNext() : m_next;
224 }
225
226private:
227 wxWizardPage *m_prev,
228 *m_next;
229
230 wxCheckBox *m_checkbox;
231};
232
66cd017c
VZ
233// ============================================================================
234// implementation
235// ============================================================================
236
d93c719a
VZ
237// ----------------------------------------------------------------------------
238// event tables and such
239// ----------------------------------------------------------------------------
240
241BEGIN_EVENT_TABLE(MyFrame, wxFrame)
242 EVT_MENU(Wizard_Quit, MyFrame::OnQuit)
243 EVT_MENU(Wizard_About, MyFrame::OnAbout)
244 EVT_MENU(Wizard_Run, MyFrame::OnRunWizard)
245
246 EVT_WIZARD_CANCEL(-1, MyFrame::OnWizardCancel)
247END_EVENT_TABLE()
248
74b31181
VZ
249BEGIN_EVENT_TABLE(wxRadioboxPage, wxWizardPageSimple)
250 EVT_WIZARD_PAGE_CHANGING(-1, wxRadioboxPage::OnWizardPageChanging)
251 EVT_WIZARD_CANCEL(-1, wxRadioboxPage::OnWizardCancel)
252END_EVENT_TABLE()
253
d93c719a
VZ
254IMPLEMENT_APP(MyApp)
255
66cd017c
VZ
256// ----------------------------------------------------------------------------
257// the application class
258// ----------------------------------------------------------------------------
259
260// `Main program' equivalent: the program execution "starts" here
261bool MyApp::OnInit()
262{
d93c719a
VZ
263 MyFrame *frame = new MyFrame("wxWizard Sample");
264
265 // and show it (the frames, unlike simple controls, are not shown when
266 // created initially)
267 frame->Show(TRUE);
268
269 // we're done
270 return TRUE;
271}
272
273// ----------------------------------------------------------------------------
274// MyFrame
275// ----------------------------------------------------------------------------
276
277MyFrame::MyFrame(const wxString& title)
278 : wxFrame((wxFrame *)NULL, -1, title,
279 wxDefaultPosition, wxSize(250, 150)) // small frame
280{
281 wxMenu *menuFile = new wxMenu;
282 menuFile->Append(Wizard_Run, "&Run wizard...\tCtrl-R");
283 menuFile->AppendSeparator();
284 menuFile->Append(Wizard_Quit, "E&xit\tAlt-X", "Quit this program");
285
286 wxMenu *helpMenu = new wxMenu;
287 helpMenu->Append(Wizard_About, "&About...\tF1", "Show about dialog");
288
289 // now append the freshly created menu to the menu bar...
290 wxMenuBar *menuBar = new wxMenuBar();
291 menuBar->Append(menuFile, "&File");
292 menuBar->Append(helpMenu, "&Help");
66cd017c 293
d93c719a
VZ
294 // ... and attach this menu bar to the frame
295 SetMenuBar(menuBar);
296
297 // also create status bar which we use in OnWizardCancel
298 CreateStatusBar();
299}
300
301void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
302{
303 // TRUE is to force the frame to close
304 Close(TRUE);
305}
306
307void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
308{
309 wxMessageBox("Demo of wxWizard class\n"
310