]> git.saurik.com Git - wxWidgets.git/blame - samples/controls/controls.cpp
merged HAVE_VSNPRINTF fix from 2.2 branch
[wxWidgets.git] / samples / controls / controls.cpp
CommitLineData
1c005ff7 1/////////////////////////////////////////////////////////////////////////////
dfad0599 2// Name: controls.cpp
1c005ff7
RR
3// Purpose: Controls wxWindows sample
4// Author: Robert Roebling
5// Modified by:
6// RCS-ID: $Id$
c67d8618 7// Copyright: (c) Robert Roebling, Julian Smart
655822f3 8// Licence: wxWindows license
1c005ff7
RR
9/////////////////////////////////////////////////////////////////////////////
10
11#ifdef __GNUG__
9f3362c4 12 #pragma implementation "controls.h"
1c005ff7
RR
13#endif
14
15// For compilers that support precompilation, includes "wx/wx.h".
16#include "wx/wxprec.h"
17
18#ifdef __BORLANDC__
9f3362c4 19 #pragma hdrstop
1c005ff7
RR
20#endif
21
22#ifndef WX_PRECOMP
9f3362c4 23 #include "wx/wx.h"
1c005ff7
RR
24#endif
25
3372145d 26#if !defined( __WXMSW__ ) || defined( __WIN95__ )
4fabb575 27#include "wx/spinbutt.h"
3372145d 28#endif
1db8dc4a 29#include "wx/tglbtn.h"
53b28675 30#include "wx/notebook.h"
2cb21a45 31#include "wx/imaglist.h"
b8653fbf
VZ
32
33#if wxUSE_TOOLTIPS
34 #include "wx/tooltip.h"
35#endif
1c005ff7 36
4b5f3fe6 37#if defined(__WXGTK__) || defined(__WXMOTIF__)
73c700fd 38 #define USE_XPM
4fabb575
JS
39#endif
40
41#ifdef USE_XPM
73c700fd
VZ
42 #include "mondrian.xpm"
43 #include "icons/choice.xpm"
44 #include "icons/combo.xpm"
45 #include "icons/list.xpm"
46 #include "icons/radio.xpm"
47 #include "icons/text.xpm"
48 #include "icons/gauge.xpm"
47908e25
RR
49#endif
50
9726da4f
VZ
51#ifdef __WIN16__
52 // Win16 doesn't have them
ad556aa9 53 #ifdef wxUSE_SPINBTN
0e528b99 54 #undef wxUSE_SPINBTN
ad556aa9 55 #endif
0e528b99 56 #define wxUSE_SPINBTN 0
b782f2e0 57#else
ad556aa9
JS
58 #ifndef wxUSE_SPINBTN
59 #define wxUSE_SPINBTN 1
b782f2e0 60 #endif
9726da4f
VZ
61#endif // __WIN16__
62
63#include "wx/progdlg.h"
64
b782f2e0
VZ
65#if wxUSE_SPINCTRL
66 #include "wx/spinctrl.h"
67#endif // wxUSE_SPINCTRL
68
1c005ff7
RR
69//----------------------------------------------------------------------
70// class definitions
71//----------------------------------------------------------------------
72
73class MyApp: public wxApp
655822f3 74{
b8653fbf
VZ
75public:
76 bool OnInit();
1c005ff7
RR
77};
78
79class MyPanel: public wxPanel
80{
b8653fbf 81public:
1c005ff7 82 MyPanel(wxFrame *frame, int x, int y, int w, int h);
2cb21a45 83 virtual ~MyPanel();
16f6dfd8 84
1c005ff7
RR
85 void OnSize( wxSizeEvent& event );
86 void OnListBox( wxCommandEvent &event );
5b077d48 87 void OnListBoxDoubleClick( wxCommandEvent &event );
1c005ff7 88 void OnListBoxButtons( wxCommandEvent &event );
47908e25
RR
89 void OnChoice( wxCommandEvent &event );
90 void OnChoiceButtons( wxCommandEvent &event );
91 void OnCombo( wxCommandEvent &event );
f6bcfd97
BP
92 void OnComboTextChanged( wxCommandEvent &event );
93 void OnComboTextEnter( wxCommandEvent &event );
47908e25
RR
94 void OnComboButtons( wxCommandEvent &event );
95 void OnRadio( wxCommandEvent &event );
96 void OnRadioButtons( wxCommandEvent &event );
868a2826 97 void OnSetFont( wxCommandEvent &event );
cb43b372 98 void OnPageChanged( wxNotebookEvent &event );
4d0f3cd6 99 void OnPageChanging( wxNotebookEvent &event );
7bce6aec 100 void OnSliderUpdate( wxCommandEvent &event );
185fa6bf 101 void OnUpdateLabel( wxCommandEvent &event );
0e528b99 102#if wxUSE_SPINBTN
8c3c31d4
VZ
103 void OnSpinUp( wxSpinEvent &event );
104 void OnSpinDown( wxSpinEvent &event );
e380f72b 105 void OnSpinUpdate( wxSpinEvent &event );
9726da4f
VZ
106 void OnUpdateShowProgress( wxUpdateUIEvent& event );
107 void OnShowProgress( wxCommandEvent &event );
0e528b99 108#endif // wxUSE_SPINBTN
16f6dfd8 109
baccb514 110#if wxUSE_SPINCTRL
457e6c54 111 void OnSpinCtrl(wxSpinEvent& event);
baccb514
VZ
112#endif // wxUSE_SPINCTRL
113
87a1e308
VZ
114 void OnEnableAll(wxCommandEvent& event);
115 void OnChangeColour(wxCommandEvent& event);
3e2dd3db 116 void OnTestButton(wxCommandEvent& event);
9121bed2 117 void OnBmpButton(wxCommandEvent& event);
87a1e308 118
6c8a980f
VZ
119 wxListBox *m_listbox,
120 *m_listboxSorted;
b56c2246
VZ
121 wxChoice *m_choice,
122 *m_choiceSorted;
e380f72b
RR
123 wxComboBox *m_combo;
124 wxRadioBox *m_radio;
37ed3ae3
VZ
125 wxGauge *m_gauge,
126 *m_gaugeVert;
e380f72b
RR
127 wxSlider *m_slider;
128 wxButton *m_fontButton;
85eb36c2
RR
129 wxButton *m_lbSelectNum;
130 wxButton *m_lbSelectThis;
0e528b99 131#if wxUSE_SPINBTN
e380f72b 132 wxSpinButton *m_spinbutton;
9726da4f 133 wxButton *m_btnProgress;
0e528b99 134#endif // wxUSE_SPINBTN
b782f2e0
VZ
135
136#if wxUSE_SPINCTRL
137 wxSpinCtrl *m_spinctrl;
138#endif // wxUSE_SPINCTRL
139
e380f72b 140 wxTextCtrl *m_spintext;
ae0bdb01 141 wxCheckBox *m_checkbox;
16f6dfd8 142
e380f72b 143 wxTextCtrl *m_text;
655822f3
VZ
144 wxNotebook *m_notebook;
145
185fa6bf
VZ
146 wxStaticText *m_label;
147
b8653fbf 148private:
29e7e51a
VZ
149 wxLog *m_logTargetOld;
150
b8653fbf 151 DECLARE_EVENT_TABLE()
1c005ff7
RR
152};
153
154class MyFrame: public wxFrame
155{
b8653fbf 156public:
1c005ff7 157 MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
655822f3 158
1c005ff7
RR
159 void OnQuit(wxCommandEvent& event);
160 void OnAbout(wxCommandEvent& event);
3e2dd3db 161 void OnClearLog(wxCommandEvent& event);
87a1e308 162
16f6dfd8
VZ
163#if wxUSE_TOOLTIPS
164 void OnSetTooltipDelay(wxCommandEvent& event);
165 void OnToggleTooltips(wxCommandEvent& event);
166#endif // wxUSE_TOOLTIPS
87a1e308
VZ
167
168 void OnEnableAll(wxCommandEvent& event);
169
9f3362c4 170 void OnIdle( wxIdleEvent& event );
5fb9fcfc 171 void OnSize( wxSizeEvent& event );
97206645 172 void OnMove( wxMoveEvent& event );
655822f3 173
f048e32f
VZ
174 MyPanel *GetPanel() const { return m_panel; }
175
b8653fbf 176private:
97206645
VZ
177 void UpdateStatusBar(const wxPoint& pos, const wxSize& size)
178 {
179 wxString msg;
a1f79c1e
VZ
180 wxSize sizeCl = GetClientSize();
181 msg.Printf(_("pos=(%d, %d), size=%dx%d (client=%dx%d)"),
182 pos.x, pos.y,
183 size.x, size.y,
184 sizeCl.x, sizeCl.y);
97206645
VZ
185 SetStatusText(msg, 1);
186 }
187
f048e32f 188 MyPanel *m_panel;
87a1e308 189
b8653fbf 190 DECLARE_EVENT_TABLE()
1c005ff7
RR
191};
192
f6bcfd97
BP
193// a button which intercepts double clicks (for testing...)
194class MyButton : public wxButton
195{
196public:
197 MyButton(wxWindow *parent,
198 wxWindowID id,
199 const wxString& label = wxEmptyString,
200 const wxPoint& pos = wxDefaultPosition,
201 const wxSize& size = wxDefaultSize)
202 : wxButton(parent, id, label, pos, size)
203 {
204 }
205
206 void OnDClick(wxMouseEvent& event)
207 {
208 wxLogMessage(_T("MyButton::OnDClick"));
209
210 event.Skip();
211 }
212
213private:
214 DECLARE_EVENT_TABLE()
215};
216
217// a combo which intercepts chars (to test Windows behaviour)
218class MyComboBox : public wxComboBox
219{
220public:
221 MyComboBox(wxWindow *parent, wxWindowID id,
222 const wxString& value = wxEmptyString,
223 const wxPoint& pos = wxDefaultPosition,
224 const wxSize& size = wxDefaultSize,
225 int n = 0, const wxString choices[] = NULL,
226 long style = 0,
227 const wxValidator& validator = wxDefaultValidator,
228 const wxString& name = wxComboBoxNameStr)
229 : wxComboBox(parent, id, value, pos, size, n, choices, style,
230 validator, name) { }
231
232protected:
233 void OnChar(wxKeyEvent& event);
234 void OnKeyDown(wxKeyEvent& event);
235 void OnKeyUp(wxKeyEvent& event);
236 void OnFocusGot(wxFocusEvent& event)
237 {
238 wxLogMessage(_T("MyComboBox::OnFocusGot"));
239
240 event.Skip();
241 }
242
243private:
244 DECLARE_EVENT_TABLE()
245};
246
247// a radiobox which handles focus set/kill (for testing)
248class MyRadioBox : public wxRadioBox
249{
250public:
251 MyRadioBox(wxWindow *parent,
252 wxWindowID id,
253 const wxString& title = wxEmptyString,
254 const wxPoint& pos = wxDefaultPosition,
255 const wxSize& size = wxDefaultSize,
256 int n = 0, const wxString choices[] = NULL,
257 int majorDim = 1,
258 long style = wxRA_HORIZONTAL,
259 const wxValidator& validator = wxDefaultValidator,
0bb62421 260 const wxString& name = wxRadioBoxNameStr)
f6bcfd97
BP
261 : wxRadioBox(parent, id, title, pos, size, n, choices, majorDim,
262 style, validator, name) { }
263
264protected:
265 void OnFocusGot(wxFocusEvent& event)
266 {
267 wxLogMessage(_T("MyRadioBox::OnFocusGot"));
268
269 event.Skip();
270 }
271
272 void OnFocusLost(wxFocusEvent& event)
273 {
274 wxLogMessage(_T("MyRadioBox::OnFocusLost"));
275
276 event.Skip();
277 }
278
279private:
280 DECLARE_EVENT_TABLE()
281};
282
1c005ff7 283//----------------------------------------------------------------------
6c8a980f 284// other
1c005ff7
RR
285//----------------------------------------------------------------------
286
6c8a980f
VZ
287static void SetControlClientData(const char *name,
288 wxControlWithItems *control);
289
d59051dd 290IMPLEMENT_APP(MyApp)
1c005ff7
RR
291
292//----------------------------------------------------------------------
293// MyApp
294//----------------------------------------------------------------------
295
16f6dfd8
VZ
296enum
297{
3e2dd3db
VZ
298 CONTROLS_QUIT = 100,
299 CONTROLS_TEXT,
300 CONTROLS_ABOUT,
301 CONTROLS_CLEAR_LOG,
16f6dfd8
VZ
302
303 // tooltip menu
3e2dd3db
VZ
304 CONTROLS_SET_TOOLTIP_DELAY = 200,
305 CONTROLS_ENABLE_TOOLTIPS,
87a1e308
VZ
306
307 // panel menu
3e2dd3db 308 CONTROLS_ENABLE_ALL
16f6dfd8 309};
1c005ff7 310
b8653fbf 311bool MyApp::OnInit()
1c005ff7 312{
e66ad5c6
VZ
313 // parse the cmd line
314 int x = 50,
315 y = 50;
3ca6a5f0 316 if ( argc == 3 )
e66ad5c6
VZ
317 {
318 wxSscanf(argv[1], "%d", &x);
319 wxSscanf(argv[2], "%d", &y);
320 }
321
ec9f7884
VZ
322 // Create the main frame window
323 MyFrame *frame = new MyFrame((wxFrame *) NULL,
324 "Controls wxWindows App",
fb5dc8a2 325 x, y, 540, 430);
29e7e51a 326
fb5dc8a2 327 frame->SetSizeHints( 500, 425 );
655822f3 328
ec9f7884
VZ
329 // Give it an icon
330 // The wxICON() macros loads an icon from a resource under Windows
331 // and uses an #included XPM image under GTK+ and Motif
655822f3 332
ec9f7884 333 frame->SetIcon( wxICON(mondrian) );
1c005ff7 334
6adaedf0
JS
335 wxMenu *file_menu = new wxMenu("", wxMENU_TEAROFF);
336
3e2dd3db 337 file_menu->Append(CONTROLS_CLEAR_LOG, "&Clear log\tCtrl-L");
87a1e308 338 file_menu->AppendSeparator();
3e2dd3db
VZ
339 file_menu->Append(CONTROLS_ABOUT, "&About\tF1");
340 file_menu->AppendSeparator();
341 file_menu->Append(CONTROLS_QUIT, "E&xit\tAlt-X", "Quit controls sample");
16f6dfd8 342
33caefb3 343 wxMenuBar *menu_bar = new wxMenuBar;
ec9f7884 344 menu_bar->Append(file_menu, "&File");
16f6dfd8
VZ
345
346#if wxUSE_TOOLTIPS
ec9f7884 347 wxMenu *tooltip_menu = new wxMenu;
3e2dd3db 348 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
ec9f7884 349 tooltip_menu->AppendSeparator();
3e2dd3db 350 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
ec9f7884 351 "enable/disable tooltips", TRUE);
3e2dd3db 352 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, TRUE);
ec9f7884 353 menu_bar->Append(tooltip_menu, "&Tooltips");
16f6dfd8
VZ
354#endif // wxUSE_TOOLTIPS
355
87a1e308 356 wxMenu *panel_menu = new wxMenu;
3e2dd3db 357 panel_menu->Append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
87a1e308
VZ
358 "Enable/disable all panel controls", TRUE);
359 menu_bar->Append(panel_menu, "&Panel");
360
ec9f7884 361 frame->SetMenuBar(menu_bar);
1c005ff7 362
ec9f7884 363 frame->Show(TRUE);
655822f3 364
ee6e1b1d 365 //frame->GetPanel()->m_notebook->SetSelection(6);
f048e32f 366
ec9f7884 367 SetTopWindow(frame);
1c005ff7 368
ec9f7884 369 return TRUE;
1c005ff7
RR
370}
371
372//----------------------------------------------------------------------
373// MyPanel
374//----------------------------------------------------------------------
375
4fabb575 376const int ID_NOTEBOOK = 1000;
1c005ff7 377
4fabb575
JS
378const int ID_LISTBOX = 130;
379const int ID_LISTBOX_SEL_NUM = 131;
380const int ID_LISTBOX_SEL_STR = 132;
381const int ID_LISTBOX_CLEAR = 133;
382const int ID_LISTBOX_APPEND = 134;
383const int ID_LISTBOX_DELETE = 135;
384const int ID_LISTBOX_FONT = 136;
385const int ID_LISTBOX_ENABLE = 137;
6c8a980f 386const int ID_LISTBOX_SORTED = 138;
1c005ff7 387
4fabb575
JS
388const int ID_CHOICE = 120;
389const int ID_CHOICE_SEL_NUM = 121;
390const int ID_CHOICE_SEL_STR = 122;
391const int ID_CHOICE_CLEAR = 123;
392const int ID_CHOICE_APPEND = 124;
393const int ID_CHOICE_DELETE = 125;
394const int ID_CHOICE_FONT = 126;
395const int ID_CHOICE_ENABLE = 127;
b56c2246 396const int ID_CHOICE_SORTED = 128;
53010e52 397
4fabb575
JS
398const int ID_COMBO = 140;
399const int ID_COMBO_SEL_NUM = 141;
400const int ID_COMBO_SEL_STR = 142;
401const int ID_COMBO_CLEAR = 143;
402const int ID_COMBO_APPEND = 144;
403const int ID_COMBO_DELETE = 145;
404const int ID_COMBO_FONT = 146;
405const int ID_COMBO_ENABLE = 147;
53010e52 406
4fabb575
JS
407const int ID_RADIOBOX = 160;
408const int ID_RADIOBOX_SEL_NUM = 161;
409const int ID_RADIOBOX_SEL_STR = 162;
410const int ID_RADIOBOX_FONT = 163;
411const int ID_RADIOBOX_ENABLE = 164;
868a2826 412
f5d29b39
RR
413const int ID_RADIOBUTTON_1 = 166;
414const int ID_RADIOBUTTON_2 = 167;
415
4fabb575 416const int ID_SET_FONT = 170;
47908e25 417
4fabb575
JS
418const int ID_GAUGE = 180;
419const int ID_SLIDER = 181;
58614078 420
4fabb575 421const int ID_SPIN = 182;
9726da4f 422const int ID_BTNPROGRESS = 183;
185fa6bf 423const int ID_BUTTON_LABEL = 184;
baccb514 424const int ID_SPINCTRL = 185;
e380f72b 425
3e2dd3db
VZ
426const int ID_BUTTON_TEST1 = 190;
427const int ID_BUTTON_TEST2 = 191;
9121bed2 428const int ID_BITMAP_BTN = 192;
3e2dd3db 429
87a1e308
VZ
430const int ID_CHANGE_COLOUR = 200;
431
1c005ff7 432BEGIN_EVENT_TABLE(MyPanel, wxPanel)
ec9f7884 433EVT_SIZE ( MyPanel::OnSize)
4d0f3cd6 434EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MyPanel::OnPageChanging)
ec9f7884
VZ
435EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, MyPanel::OnPageChanged)
436EVT_LISTBOX (ID_LISTBOX, MyPanel::OnListBox)
6c8a980f 437EVT_LISTBOX (ID_LISTBOX_SORTED, MyPanel::OnListBox)
ec9f7884
VZ
438EVT_LISTBOX_DCLICK(ID_LISTBOX, MyPanel::OnListBoxDoubleClick)
439EVT_BUTTON (ID_LISTBOX_SEL_NUM, MyPanel::OnListBoxButtons)
440EVT_BUTTON (ID_LISTBOX_SEL_STR, MyPanel::OnListBoxButtons)
441EVT_BUTTON (ID_LISTBOX_CLEAR, MyPanel::OnListBoxButtons)
442EVT_BUTTON (ID_LISTBOX_APPEND, MyPanel::OnListBoxButtons)
443EVT_BUTTON (ID_LISTBOX_DELETE, MyPanel::OnListBoxButtons)
444EVT_BUTTON (ID_LISTBOX_FONT, MyPanel::OnListBoxButtons)
445EVT_CHECKBOX (ID_LISTBOX_ENABLE, MyPanel::OnListBoxButtons)
446EVT_CHOICE (ID_CHOICE, MyPanel::OnChoice)
b56c2246 447EVT_CHOICE (ID_CHOICE_SORTED, MyPanel::OnChoice)
ec9f7884
VZ
448EVT_BUTTON (ID_CHOICE_SEL_NUM, MyPanel::OnChoiceButtons)
449EVT_BUTTON (ID_CHOICE_SEL_STR, MyPanel::OnChoiceButtons)
450EVT_BUTTON (ID_CHOICE_CLEAR, MyPanel::OnChoiceButtons)
451EVT_BUTTON (ID_CHOICE_APPEND, MyPanel::OnChoiceButtons)
452EVT_BUTTON (ID_CHOICE_DELETE, MyPanel::OnChoiceButtons)
453EVT_BUTTON (ID_CHOICE_FONT, MyPanel::OnChoiceButtons)
454EVT_CHECKBOX (ID_CHOICE_ENABLE, MyPanel::OnChoiceButtons)
455EVT_COMBOBOX (ID_COMBO, MyPanel::OnCombo)
f6bcfd97
BP
456EVT_TEXT (ID_COMBO, MyPanel::OnComboTextChanged)
457EVT_TEXT_ENTER(ID_COMBO, MyPanel::OnComboTextEnter)
ec9f7884
VZ
458EVT_BUTTON (ID_COMBO_SEL_NUM, MyPanel::OnComboButtons)
459EVT_BUTTON (ID_COMBO_SEL_STR, MyPanel::OnComboButtons)
460EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons)
461EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons)
462EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons)
463EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons)
464EVT_CHECKBOX (ID_COMBO_ENABLE, MyPanel::OnComboButtons)
465EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio)
466EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons)
467EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons)
468EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons)
469EVT_CHECKBOX (ID_RADIOBOX_ENABLE, MyPanel::OnRadioButtons)
470EVT_BUTTON (ID_SET_FONT, MyPanel::OnSetFont)
471EVT_SLIDER (ID_SLIDER, MyPanel::OnSliderUpdate)
0e528b99 472#if wxUSE_SPINBTN
ec9f7884 473EVT_SPIN (ID_SPIN, MyPanel::OnSpinUpdate)
8c3c31d4
VZ
474EVT_SPIN_UP (ID_SPIN, MyPanel::OnSpinUp)
475EVT_SPIN_DOWN (ID_SPIN, MyPanel::OnSpinDown)
9726da4f
VZ
476EVT_UPDATE_UI (ID_BTNPROGRESS, MyPanel::OnUpdateShowProgress)
477EVT_BUTTON (ID_BTNPROGRESS, MyPanel::OnShowProgress)
0e528b99 478#endif // wxUSE_SPINBTN
baccb514 479#if wxUSE_SPINCTRL
57160afe 480EVT_SPINCTRL (ID_SPINCTRL, MyPanel::OnSpinCtrl)
baccb514 481#endif // wxUSE_SPINCTRL
1db8dc4a 482EVT_TOGGLEBUTTON(ID_BUTTON_LABEL, MyPanel::OnUpdateLabel)
87a1e308 483EVT_CHECKBOX (ID_CHANGE_COLOUR, MyPanel::OnChangeColour)
3e2dd3db
VZ
484EVT_BUTTON (ID_BUTTON_TEST1, MyPanel::OnTestButton)
485EVT_BUTTON (ID_BUTTON_TEST2, MyPanel::OnTestButton)
9121bed2 486EVT_BUTTON (ID_BITMAP_BTN, MyPanel::OnBmpButton)
1c005ff7
RR
487END_EVENT_TABLE()
488
f6bcfd97
BP
489BEGIN_EVENT_TABLE(MyButton, wxButton)
490 EVT_LEFT_DCLICK(MyButton::OnDClick)
491END_EVENT_TABLE()
492
493BEGIN_EVENT_TABLE(MyComboBox, wxComboBox)
494 EVT_CHAR(MyComboBox::OnChar)
495 EVT_KEY_DOWN(MyComboBox::OnKeyDown)
496 EVT_KEY_UP(MyComboBox::OnKeyUp)
497
498 EVT_SET_FOCUS(MyComboBox::OnFocusGot)
499END_EVENT_TABLE()
500
501BEGIN_EVENT_TABLE(MyRadioBox, wxRadioBox)
502 EVT_SET_FOCUS(MyRadioBox::OnFocusGot)
503 EVT_KILL_FOCUS(MyRadioBox::OnFocusLost)
504END_EVENT_TABLE()
505
506// ============================================================================
507// implementation
508// ============================================================================
509
5fb9fcfc 510MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
0a772322
VZ
511 : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) ),
512 m_text(NULL), m_notebook(NULL)
1c005ff7 513{
9d9b7755
VZ
514 wxLayoutConstraints *c;
515
3e2dd3db
VZ
516 m_text = new wxTextCtrl(this, -1, "This is the log window.\n",
517 wxPoint(0, 250), wxSize(100, 50), wxTE_MULTILINE);
103aab26 518 m_text->SetBackgroundColour("wheat");
655822f3 519
abceee76
VZ
520 if ( 0 )
521 wxLog::AddTraceMask(_T("focus"));
29e7e51a 522 m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
0a772322 523
3e2dd3db 524 m_notebook = new wxNotebook(this, ID_NOTEBOOK);
655822f3 525
ec9f7884
VZ
526 wxString choices[] =
527 {
528 "This",
529 "is one of my",
530 "really",
531 "wonderful",
532 "examples."
533 };
655822f3 534
4fabb575 535#ifdef USE_XPM
ec9f7884
VZ
536 // image ids
537 enum
538 {
539 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
540 };
541
542 // fill the image list
543 wxImageList *imagelist = new wxImageList(32, 32);
544
545 imagelist-> Add( wxBitmap( list_xpm ));
546 imagelist-> Add( wxBitmap( choice_xpm ));
547 imagelist-> Add( wxBitmap( combo_xpm ));
548 imagelist-> Add( wxBitmap( text_xpm ));
549 imagelist-> Add( wxBitmap( radio_xpm ));
550 imagelist-> Add( wxBitmap( gauge_xpm ));
551 m_notebook->SetImageList(imagelist);
73c700fd 552#elif defined(__WXMSW__)
ec9f7884
VZ
553 // load images from resources
554 enum
555 {
556 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
557 };
558 wxImageList *imagelist = new wxImageList(16, 16, FALSE, Image_Max);
559
560 static const char *s_iconNames[Image_Max] =
561 {
562 "list", "choice", "combo", "text", "radio", "gauge"
563 };
564
565 for ( size_t n = 0; n < Image_Max; n++ )
566 {
567 wxBitmap bmp(s_iconNames[n]);
568 if ( !bmp.Ok() || (imagelist->Add(bmp) == -1) )
569 {
570 wxLogWarning("Couldn't load the image '%s' for the notebook page %d.",
571 s_iconNames[n], n);
572 }
573 }
574
575 m_notebook->SetImageList(imagelist);
4fabb575
JS
576#else
577
ec9f7884 578 // No images for now
4fabb575
JS
579#define Image_List -1
580#define Image_Choice -1
581#define Image_Combo -1
582#define Image_Text -1
583#define Image_Radio -1
584#define Image_Gauge -1
585#define Image_Max -1
586
fc54776e 587#endif
2cb21a45 588
6c8a980f
VZ
589 wxPanel *panel = new wxPanel(m_notebook);
590 m_listbox = new wxListBox( panel, ID_LISTBOX,
591 wxPoint(10,10), wxSize(120,70),
354aa1e3 592 5, choices, wxLB_ALWAYS_SB );
6c8a980f
VZ
593 m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED,
594 wxPoint(10,90), wxSize(120,70),
354aa1e3 595 5, choices, wxLB_SORT );
6c8a980f
VZ
596
597 SetControlClientData("listbox", m_listbox);
598 SetControlClientData("listbox", m_listboxSorted);
9838df2c 599
ec9f7884 600 m_listbox->SetCursor(*wxCROSS_CURSOR);
b8653fbf 601#if wxUSE_TOOLTIPS
ec9f7884 602 m_listbox->SetToolTip( "This is a list box" );
16f6dfd8 603#endif // wxUSE_TOOLTIPS
9f3362c4 604
3e2dd3db
VZ
605 m_lbSelectNum = new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
606 m_lbSelectThis = new wxButton( panel, ID_LISTBOX_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
607 (void)new wxButton( panel, ID_LISTBOX_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
f6bcfd97 608 (void)new MyButton( panel, ID_LISTBOX_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
3e2dd3db 609 (void)new wxButton( panel, ID_LISTBOX_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
f6bcfd97 610 wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
57160afe
VZ
611
612 button->SetDefault();
613
614 button->SetForegroundColour(*wxBLUE);
615
b8653fbf 616#if wxUSE_TOOLTIPS
ec9f7884 617 button->SetToolTip( "Press here to set italic font" );
16f6dfd8 618#endif // wxUSE_TOOLTIPS
b1170810 619
6c8a980f 620 m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "&Disable", wxPoint(20,170) );
ec9f7884 621 m_checkbox->SetValue(FALSE);
b8653fbf 622#if wxUSE_TOOLTIPS
ec9f7884 623 m_checkbox->SetToolTip( "Click here to disable the listbox" );
16f6dfd8 624#endif // wxUSE_TOOLTIPS
87a1e308
VZ
625 (void)new wxCheckBox( panel, ID_CHANGE_COLOUR, "&Toggle colour",
626 wxPoint(110,170) );
9121bed2 627 panel->SetCursor(wxCursor(wxCURSOR_HAND));
ec9f7884
VZ
628 m_notebook->AddPage(panel, "wxListBox", TRUE, Image_List);
629
630 panel = new wxPanel(m_notebook);
631 m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 5, choices );
b56c2246
VZ
632 m_choiceSorted = new wxChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,-1),
633 5, choices, wxCB_SORT );
6c8a980f
VZ
634
635 SetControlClientData("choice", m_choice);
636 SetControlClientData("choice", m_choiceSorted);
637
ddc8c2e3 638 m_choice->SetSelection(2);
2b07d713 639 m_choice->SetBackgroundColour( "red" );
3e2dd3db
VZ
640 (void)new wxButton( panel, ID_CHOICE_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
641 (void)new wxButton( panel, ID_CHOICE_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
642 (void)new wxButton( panel, ID_CHOICE_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
643 (void)new wxButton( panel, ID_CHOICE_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
644 (void)new wxButton( panel, ID_CHOICE_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
645 (void)new wxButton( panel, ID_CHOICE_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
646 (void)new wxCheckBox( panel, ID_CHOICE_ENABLE, "&Disable", wxPoint(20,130), wxSize(140,30) );
1fad4c3e 647
ec9f7884
VZ
648 m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
649
650 panel = new wxPanel(m_notebook);
3e2dd3db 651 (void)new wxStaticBox( panel, -1, "&Box around combobox",
f048e32f 652 wxPoint(5, 5), wxSize(150, 100));
f6bcfd97
BP
653 m_combo = new MyComboBox( panel, ID_COMBO, "This",
654 wxPoint(20,25), wxSize(120, -1),
655 5, choices,
656 /* wxCB_READONLY | */ wxPROCESS_ENTER);
657
3e2dd3db
VZ
658 (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
659 (void)new wxButton( panel, ID_COMBO_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
660 (void)new wxButton( panel, ID_COMBO_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
661 (void)new wxButton( panel, ID_COMBO_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
662 (void)new wxButton( panel, ID_COMBO_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
663 (void)new wxButton( panel, ID_COMBO_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
664 (void)new wxCheckBox( panel, ID_COMBO_ENABLE, "&Disable", wxPoint(20,130), wxSize(140,30) );
ec9f7884
VZ
665 m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
666
ec9f7884
VZ
667 wxString choices2[] =
668 {
17867d61 669 "First", "Second",
0a772322 670 /* "Third",
17867d61
RR
671 "Fourth", "Fifth", "Sixth",
672 "Seventh", "Eighth", "Nineth", "Tenth" */
ec9f7884
VZ
673 };
674
675 panel = new wxPanel(m_notebook);
f6bcfd97 676 (void)new MyRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
3e2dd3db 677 m_radio = new wxRadioBox( panel, ID_RADIOBOX, "T&his", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
f048e32f
VZ
678
679#if wxUSE_TOOLTIPS
3e2dd3db 680 m_combo->SetToolTip("This is a natural\ncombobox - can you believe me?");
f048e32f
VZ
681 m_radio->SetToolTip("Ever seen a radiobox?");
682#endif // wxUSE_TOOLTIPS
683
3e2dd3db
VZ
684 (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
685 (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "&Select 'This'", wxPoint(180,80), wxSize(140,30) );
686 m_fontButton = new wxButton( panel, ID_SET_FONT, "Set &more Italic font", wxPoint(340,30), wxSize(140,30) );
687 (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set &Italic font", wxPoint(340,80), wxSize(140,30) );
688 (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, "&Disable", wxPoint(340,130), wxDefaultSize );
7e2b55cd 689 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxDefaultSize, wxRB_GROUP );
ec9f7884 690 rb->SetValue( FALSE );
3e2dd3db 691 (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "&Radiobutton2", wxPoint(340,170), wxDefaultSize );
ec9f7884
VZ
692 m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
693
694 panel = new wxPanel(m_notebook);
0bb62421 695 (void)new wxStaticBox( panel, -1, "&wxGauge and wxSlider", wxPoint(10,10), wxSize(222,130) );
f6bcfd97
BP
696 m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30), wxGA_HORIZONTAL|wxNO_BORDER );
697 m_gauge->SetBackgroundColour(*wxGREEN);
698 m_gauge->SetForegroundColour(*wxRED);
37ed3ae3 699 m_gaugeVert = new wxGauge( panel, -1, 100,
0bb62421 700 wxPoint(195,35), wxSize(30, 90),
1724ca8b 701 wxGA_VERTICAL | wxGA_SMOOTH | wxNO_BORDER );
858b5bdd 702 m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1), wxSL_LABELS );
0bb62421 703 (void)new wxStaticBox( panel, -1, "&Explanation", wxPoint(230,10), wxSize(270,130) );
9838df2c 704#ifdef __WXMOTIF__
ec9f7884
VZ
705 // No wrapping text in wxStaticText yet :-(
706 (void)new wxStaticText( panel, -1,
707 "Drag the slider!",
37ed3ae3 708 wxPoint(250,30),
e65cc56a 709 wxSize(240, -1)
ec9f7884 710 );
9838df2c 711#else
ec9f7884
VZ
712 (void)new wxStaticText( panel, -1,
713 "In order see the gauge (aka progress bar)\n"
714 "control do something you have to drag the\n"
715 "handle of the slider to the right.\n"
716 "\n"
717 "This is also supposed to demonstrate how\n"
718 "to use static controls.\n",
37ed3ae3 719 wxPoint(250,25),
8c3c31d4 720 wxSize(240, 110)
ec9f7884 721 );
9838df2c 722#endif
8c3c31d4
VZ
723 int initialSpinValue = -5;
724 wxString s;
725 s << initialSpinValue;
726 m_spintext = new wxTextCtrl( panel, -1, s, wxPoint(20,160), wxSize(80,-1) );
0e528b99 727#if wxUSE_SPINBTN
738f9e5a 728 m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(80, -1) );
6380910c 729 m_spinbutton->SetRange(-10,30);
8c3c31d4 730 m_spinbutton->SetValue(initialSpinValue);
9726da4f 731
3e2dd3db 732 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, "&Show progress dialog",
738f9e5a 733 wxPoint(300, 160) );
0e528b99 734#endif // wxUSE_SPINBTN
b782f2e0
VZ
735
736#if wxUSE_SPINCTRL
678cd6de 737 m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, "", wxPoint(200, 160), wxSize(80, -1) );
b782f2e0
VZ
738 m_spinctrl->SetRange(10,30);
739 m_spinctrl->SetValue(15);
740#endif // wxUSE_SPINCTRL
741
ec9f7884 742 m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
45e41c05
VZ
743
744 panel = new wxPanel(m_notebook);
b782f2e0 745
669f7a11 746#if !defined(__WXMOTIF__) && !defined(__WIN16__) // wxStaticBitmap not working under Motif yet; and icons not allowed under WIN16.
45e41c05 747 wxIcon icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
f048e32f
VZ
748 wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon,
749 wxPoint(10, 10));
45e41c05
VZ
750
751 bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
752 bmpStatic->SetIcon(wxTheApp->GetStdIcon(wxICON_QUESTION));
b782f2e0
VZ
753#endif // !Motif
754
45e41c05
VZ
755 wxBitmap bitmap( 100, 100 );
756 wxMemoryDC dc;
757 dc.SelectObject( bitmap );
758 dc.SetPen(*wxGREEN_PEN);
f048e32f 759 dc.Clear();
45e41c05 760 dc.DrawEllipse(5, 5, 90, 90);
f048e32f 761 dc.DrawText("Bitmap", 30, 40);
45e41c05
VZ
762 dc.SelectObject( wxNullBitmap );
763
9121bed2 764 (void)new wxBitmapButton(panel, ID_BITMAP_BTN, bitmap, wxPoint(100, 20));
f048e32f 765
80a58c99 766#ifdef __WXMSW__
3e2dd3db
VZ
767 // test for masked bitmap display
768 bitmap = wxBitmap("test2.bmp", wxBITMAP_TYPE_BMP);
9bb3479c
JS
769 if (bitmap.Ok())
770 {
771 bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
669f7a11 772
9bb3479c
JS
773 (void)new wxStaticBitmap /* wxBitmapButton */ (panel, -1, bitmap, wxPoint(300, 120));
774 }
57160afe 775#endif
5ef2e633 776
f048e32f
VZ
777 wxBitmap bmp1(wxTheApp->GetStdIcon(wxICON_INFORMATION)),
778 bmp2(wxTheApp->GetStdIcon(wxICON_WARNING)),
779 bmp3(wxTheApp->GetStdIcon(wxICON_QUESTION));
780 wxBitmapButton *bmpBtn = new wxBitmapButton
781 (
782 panel, -1,
783 bmp1,
1db8dc4a 784 wxPoint(30, 70)
f048e32f
VZ
785 );
786 bmpBtn->SetBitmapSelected(bmp2);
787 bmpBtn->SetBitmapFocus(bmp3);
788
1db8dc4a
VZ
789 (void)new wxToggleButton(panel, ID_BUTTON_LABEL,
790 "&Toggle label", wxPoint(250, 20));
185fa6bf
VZ
791 m_label = new wxStaticText(panel, -1, "Label with some long text",
792 wxPoint(250, 60), wxDefaultSize,
f6bcfd97 793 wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
103aab26 794 m_label->SetForegroundColour( *wxBLUE );
2ac1b69a 795
45e41c05 796 m_notebook->AddPage(panel, "wxBitmapXXX");
dcc71398 797
9d9b7755 798 // layout constraints
dcc71398 799
9d9b7755
VZ
800 panel = new wxPanel(m_notebook);
801 panel->SetAutoLayout( TRUE );
d7928388 802
9d9b7755
VZ
803 c = new wxLayoutConstraints;
804 c->top.SameAs( panel, wxTop, 10 );
805 c->height.AsIs( );
806 c->left.SameAs( panel, wxLeft, 10 );
807 c->width.PercentOf( panel, wxWidth, 40 );
d7928388 808
3e2dd3db 809 wxButton *pMyButton = new wxButton(panel, ID_BUTTON_TEST1, "Test Button &1" );
9d9b7755 810 pMyButton->SetConstraints( c );
d7928388 811
9d9b7755
VZ
812 c = new wxLayoutConstraints;
813 c->top.SameAs( panel, wxTop, 10 );
814 c->bottom.SameAs( panel, wxBottom, 10 );
815 c->right.SameAs( panel, wxRight, 10 );
816 c->width.PercentOf( panel, wxWidth, 40 );
185fa6bf 817
3e2dd3db 818 wxButton *pMyButton2 = new wxButton(panel, ID_BUTTON_TEST2, "Test Button &2" );
9d9b7755 819 pMyButton2->SetConstraints( c );
185fa6bf 820
9d9b7755 821 m_notebook->AddPage(panel, "wxLayoutConstraint");
d7928388 822
9d9b7755 823 // sizer
dcc71398 824
9d9b7755
VZ
825 panel = new wxPanel(m_notebook);
826 panel->SetAutoLayout( TRUE );
dcc71398 827
9d9b7755
VZ
828 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
829
3e2dd3db 830 sizer->Add( new wxButton(panel, -1, "Test Button &1" ), 3, wxALL, 10 );
9d9b7755 831 sizer->Add( 20,20, 1 );
3e2dd3db 832 sizer->Add( new wxButton(panel, -1, "Test Button &2" ), 3, wxGROW|wxALL, 10 );
9d9b7755
VZ
833
834 panel->SetSizer( sizer );
835
836 m_notebook->AddPage(panel, "wxSizer");
1c005ff7
RR
837}
838
839void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
840{
ec9f7884
VZ
841 int x = 0;
842 int y = 0;
843 GetClientSize( &x, &y );
655822f3 844
ec9f7884
VZ
845 if (m_notebook) m_notebook->SetSize( 2, 2, x-4, y*2/3-4 );
846 if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 );
1c005ff7
RR
847}
848
4d0f3cd6
VZ
849void MyPanel::OnPageChanging( wxNotebookEvent &event )
850{
45e41c05
VZ
851 int selOld = event.GetOldSelection();
852 if ( selOld == 2 )
4d0f3cd6 853 {
65045edd
RR
854 if ( wxMessageBox("This demonstrates how a program may prevent the\n"
855 "page change from taking place - if you select\n"
856 "[No] the current page will stay the third one\n",
8c3c31d4 857 "Control sample",
f6bcfd97 858 wxICON_QUESTION | wxYES_NO, this) != wxYES )
8c3c31d4
VZ
859 {
860 event.Veto();
45e41c05 861
8c3c31d4
VZ
862 return;
863 }
4d0f3cd6 864 }
45e41c05
VZ
865
866 *m_text << "Notebook selection is being changed from " << selOld << "\n";
4d0f3cd6
VZ
867}
868
cb43b372
RR
869void MyPanel::OnPageChanged( wxNotebookEvent &event )
870{
ec9f7884 871 *m_text << "Notebook selection is " << event.GetSelection() << "\n";
cb43b372
RR
872}
873
3e2dd3db
VZ
874void MyPanel::OnTestButton(wxCommandEvent& event)
875{
876 wxLogMessage(_T("Button %c clicked."),
877 event.GetId() == ID_BUTTON_TEST1 ? _T('1') : _T('2'));
878}
879
9121bed2
VZ
880void MyPanel::OnBmpButton(wxCommandEvent& event)
881{
882 wxLogMessage(_T("Bitmap button clicked."));
883}
884
87a1e308
VZ
885void MyPanel::OnChangeColour(wxCommandEvent& WXUNUSED(event))
886{
887 static wxColour s_colOld;
888
889 // test panel colour changing and propagation to the subcontrols
890 if ( s_colOld.Ok() )
891 {
892 SetBackgroundColour(s_colOld);
893 s_colOld = wxNullColour;
894
103aab26
RR
895 m_lbSelectThis->SetForegroundColour("red");
896 m_lbSelectThis->SetBackgroundColour("white");
87a1e308
VZ
897 }
898 else
899 {
103aab26
RR
900 s_colOld = wxColour("red");
901 SetBackgroundColour("white");
87a1e308 902
57160afe 903 m_lbSelectThis->SetForegroundColour("white");
87a1e308
VZ
904 m_lbSelectThis->SetBackgroundColour("red");
905 }
906
907 m_lbSelectThis->Refresh();
908 Refresh();
909}
910
1c005ff7
RR
911void MyPanel::OnListBox( wxCommandEvent &event )
912{
2e0e025e 913// GetParent()->Move(100, 100);
e66ad5c6 914
846e1424
RR
915 if (event.GetInt() == -1)
916 {
917 m_text->AppendText( "ListBox has no selections anymore\n" );
918 return;
919 }
920
6c8a980f
VZ
921 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
922 : m_listboxSorted;
923
924 m_text->AppendText( "ListBox event selection string is: '" );
ec9f7884 925 m_text->AppendText( event.GetString() );
6c8a980f
VZ
926 m_text->AppendText( "'\n" );
927 m_text->AppendText( "ListBox control selection string is: '" );
928 m_text->AppendText( listbox->GetStringSelection() );
929 m_text->AppendText( "'\n" );
930
931 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
932 m_text->AppendText( "ListBox event client data string is: '" );
6e47faf1 933 if (obj) // BC++ doesn't like use of '? .. : .. ' in this context
74a533f7 934 m_text->AppendText( obj->GetData() );
6e47faf1 935 else
74a533f7 936 m_text->AppendText( wxString("none") );
6e47faf1 937
6c8a980f
VZ
938 m_text->AppendText( "'\n" );
939 m_text->AppendText( "ListBox control client data string is: '" );
940 obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection());
6e47faf1 941 if (obj)
74a533f7 942 m_text->AppendText( obj->GetData() );
6e47faf1 943 else
74a533f7 944 m_text->AppendText( wxString("none") );
6c8a980f 945 m_text->AppendText( "'\n" );
1c005ff7
RR
946}
947
5b077d48
RR
948void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
949{
ec9f7884
VZ
950 m_text->AppendText( "ListBox double click string is: " );
951 m_text->AppendText( event.GetString() );
952 m_text->AppendText( "\n" );
5b077d48
RR
953}
954
47908e25
RR
955void MyPanel::OnListBoxButtons( wxCommandEvent &event )
956{
ec9f7884 957 switch (event.GetId())
d3904ceb 958 {
ec9f7884
VZ
959 case ID_LISTBOX_ENABLE:
960 {
961 m_text->AppendText("Checkbox clicked.\n");
962 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
b8653fbf 963#if wxUSE_TOOLTIPS
ec9f7884
VZ
964 if (event.GetInt())
965 cb->SetToolTip( "Click to enable listbox" );
966 else
967 cb->SetToolTip( "Click to disable listbox" );
16f6dfd8 968#endif // wxUSE_TOOLTIPS
ec9f7884 969 m_listbox->Enable( event.GetInt() == 0 );
57160afe
VZ
970 m_lbSelectThis->Enable( event.GetInt() == 0 );
971 m_lbSelectNum->Enable( event.GetInt() == 0 );
6c8a980f 972 m_listboxSorted->Enable( event.GetInt() == 0 );
ee6e1b1d 973 FindWindow(ID_CHANGE_COLOUR)->Enable( event.GetInt() == 0 );
ec9f7884
VZ
974 break;
975 }
976 case ID_LISTBOX_SEL_NUM:
977 {
978 m_listbox->SetSelection( 2 );
6c8a980f 979 m_listboxSorted->SetSelection( 2 );
8c3c31d4 980 m_lbSelectThis->WarpPointer( 40, 14 );
ec9f7884
VZ
981 break;
982 }
983 case ID_LISTBOX_SEL_STR:
984 {
985 m_listbox->SetStringSelection( "This" );
6c8a980f 986 m_listboxSorted->SetStringSelection( "This" );
8c3c31d4 987 m_lbSelectNum->WarpPointer( 40, 14 );
ec9f7884
VZ
988 break;
989 }
990 case ID_LISTBOX_CLEAR:
991 {
992 m_listbox->Clear();
6c8a980f 993 m_listboxSorted->Clear();
ec9f7884
VZ
994 break;
995 }
996 case ID_LISTBOX_APPEND:
997 {
998 m_listbox->Append( "Hi!" );
6c8a980f 999 m_listboxSorted->Append( "Hi!" );
ec9f7884
VZ
1000 break;
1001 }
1002 case ID_LISTBOX_DELETE:
1003 {
6c8a980f
VZ
1004 int idx;
1005 idx = m_listbox->GetSelection();
f6bcfd97
BP
1006 if ( idx != wxNOT_FOUND )
1007 m_listbox->Delete( idx );
6c8a980f 1008 idx = m_listboxSorted->GetSelection();
f6bcfd97
BP
1009 if ( idx != wxNOT_FOUND )
1010 m_listboxSorted->Delete( idx );
ec9f7884
VZ
1011 break;
1012 }
1013 case ID_LISTBOX_FONT:
1014 {
1015 m_listbox->SetFont( *wxITALIC_FONT );
6c8a980f 1016 m_listboxSorted->SetFont( *wxITALIC_FONT );
ec9f7884
VZ
1017 m_checkbox->SetFont( *wxITALIC_FONT );
1018 break;
1019 }
868a2826 1020 }
47908e25
RR
1021}
1022
1023void MyPanel::OnChoice( wxCommandEvent &event )
1024{
6c8a980f
VZ
1025 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
1026 : m_choiceSorted;
1027
1028 m_text->AppendText( "Choice event selection string is: '" );
ec9f7884 1029 m_text->AppendText( event.GetString() );
6c8a980f 1030 m_text->AppendText( "'\n" );
b56c2246 1031 m_text->AppendText( "Choice control selection string is: '" );
6c8a980f
VZ
1032 m_text->AppendText( choice->GetStringSelection() );
1033 m_text->AppendText( "'\n" );
1034
1035 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
1036 m_text->AppendText( "Choice event client data string is: '" );
6e47faf1
JS
1037
1038 if (obj)
1039 m_text->AppendText( obj->GetData() );
1040 else
1041 m_text->AppendText( wxString("none") );
1042
6c8a980f
VZ
1043 m_text->AppendText( "'\n" );
1044 m_text->AppendText( "Choice control client data string is: '" );
1045 obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection());
6e47faf1
JS
1046
1047 if (obj)
1048 m_text->AppendText( obj->GetData() );
1049 else
1050 m_text->AppendText( wxString("none") );
6c8a980f 1051 m_text->AppendText( "'\n" );
47908e25
RR
1052}
1053
1054void MyPanel::OnChoiceButtons( wxCommandEvent &event )
1055{
ec9f7884 1056 switch (event.GetId())
47908e25 1057 {
ec9f7884
VZ
1058 case ID_CHOICE_ENABLE:
1059 {
1060 m_choice->Enable( event.GetInt() == 0 );
b56c2246 1061 m_choiceSorted->Enable( event.GetInt() == 0 );
ec9f7884
VZ
1062 break;
1063 }
1064 case ID_CHOICE_SEL_NUM:
1065 {
1066 m_choice->SetSelection( 2 );
b56c2246 1067 m_choiceSorted->SetSelection( 2 );
ec9f7884
VZ
1068 break;
1069 }
1070 case ID_CHOICE_SEL_STR:
1071 {
1072 m_choice->SetStringSelection( "This" );
b56c2246 1073 m_choiceSorted->SetStringSelection( "This" );
ec9f7884
VZ
1074 break;
1075 }
1076 case ID_CHOICE_CLEAR:
1077 {
1078 m_choice->Clear();
b56c2246 1079 m_choiceSorted->Clear();
ec9f7884
VZ
1080 break;
1081 }
1082 case ID_CHOICE_APPEND:
1083 {
1084 m_choice->Append( "Hi!" );
b56c2246 1085 m_choiceSorted->Append( "Hi!" );
ec9f7884
VZ
1086 break;
1087 }
1088 case ID_CHOICE_DELETE:
1089 {
1090 int idx = m_choice->GetSelection();
f6bcfd97
BP
1091 if ( idx != wxNOT_FOUND )
1092 m_choice->Delete( idx );
b56c2246 1093 idx = m_choiceSorted->GetSelection();
f6bcfd97
BP
1094 if ( idx != wxNOT_FOUND )
1095 m_choiceSorted->Delete( idx );
ec9f7884
VZ
1096 break;
1097 }
1098 case ID_CHOICE_FONT:
1099 {
1100 m_choice->SetFont( *wxITALIC_FONT );
b56c2246 1101 m_choiceSorted->SetFont( *wxITALIC_FONT );
ec9f7884
VZ
1102 break;
1103 }
868a2826 1104 }
47908e25
RR
1105}
1106
1107void MyPanel::OnCombo( wxCommandEvent &event )
1108{
19da4326 1109 m_text->AppendText( "ComboBox event selection string is: " );
ec9f7884
VZ
1110 m_text->AppendText( event.GetString() );
1111 m_text->AppendText( "\n" );
19da4326
RR
1112 m_text->AppendText( "ComboBox control selection string is: " );
1113 m_text->AppendText( m_combo->GetStringSelection() );
1114 m_text->AppendText( "\n" );
47908e25
RR
1115}
1116
f6bcfd97
BP
1117void MyPanel::OnComboTextChanged(wxCommandEvent& WXUNUSED(event))
1118{
1119 wxLogMessage(_T("Text in the combobox changed: now is '%s'."),
1120 m_combo->GetValue().c_str());
1121}
1122
1123void MyPanel::OnComboTextEnter(wxCommandEvent& WXUNUSED(event))
1124{
1125 wxLogMessage(_T("Enter pressed in the combobox: value is '%s'."),
1126 m_combo->GetValue().c_str());
1127}
1128
47908e25 1129void MyPanel::OnComboButtons( wxCommandEvent &event )
1c005ff7 1130{
ec9f7884 1131 switch (event.GetId())
2f6407b9 1132 {
ec9f7884
VZ
1133 case ID_COMBO_ENABLE:
1134 {
1135 m_combo->Enable( event.GetInt() == 0 );
1136 break;
1137 }
1138 case ID_COMBO_SEL_NUM:
1139 {
1140 m_combo->SetSelection( 2 );
1141 break;
1142 }
1143 case ID_COMBO_SEL_STR:
1144 {
1145 m_combo->SetStringSelection( "This" );
1146 break;
1147 }
1148 case ID_COMBO_CLEAR:
1149 {
1150 m_combo->Clear();
1151 break;
1152 }
1153 case ID_COMBO_APPEND:
1154 {
1155 m_combo->Append( "Hi!" );
1156 break;
1157 }
1158 case ID_COMBO_DELETE:
1159 {
1160 int idx = m_combo->GetSelection();
1161 m_combo->Delete( idx );
1162 break;
1163 }
1164 case ID_COMBO_FONT:
1165 {
1166 m_combo->SetFont( *wxITALIC_FONT );
1167 break;
1168 }
868a2826 1169 }
47908e25
RR
1170}
1171
1172void MyPanel::OnRadio( wxCommandEvent &event )
1173{
ec9f7884
VZ
1174 m_text->AppendText( "RadioBox selection string is: " );
1175 m_text->AppendText( event.GetString() );
1176 m_text->AppendText( "\n" );
47908e25
RR
1177}
1178
1179void MyPanel::OnRadioButtons( wxCommandEvent &event )
1180{
ec9f7884 1181 switch (event.GetId())
d3904ceb 1182 {
ec9f7884
VZ
1183 case ID_RADIOBOX_ENABLE:
1184 {
1185 m_radio->Enable( event.GetInt() == 0 );
1186 break;
1187 }
1188 case ID_RADIOBOX_SEL_NUM:
1189 {
1190 m_radio->SetSelection( 2 );
1191 break;
1192 }
1193 case ID_RADIOBOX_SEL_STR:
1194 {
1195 m_radio->SetStringSelection( "This" );
1196 break;
1197 }
1198 case ID_RADIOBOX_FONT:
1199 {
1200 m_radio->SetFont( *wxITALIC_FONT );
1201 break;
1202 }
868a2826 1203 }
1c005ff7
RR
1204}
1205
868a2826
RR
1206void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
1207{
ec9f7884
VZ
1208 m_fontButton->SetFont( *wxITALIC_FONT );
1209 m_text->SetFont( *wxITALIC_FONT );
868a2826
RR
1210}
1211
1db8dc4a 1212void MyPanel::OnUpdateLabel( wxCommandEvent &event )
185fa6bf 1213{
1db8dc4a
VZ
1214 m_label->SetLabel(event.GetInt() ? "Very very very very very long text."
1215 : "Shorter text.");
185fa6bf
VZ
1216}
1217
7bce6aec
RR
1218void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
1219{
ec9f7884 1220 m_gauge->SetValue( m_slider->GetValue() );
37ed3ae3 1221 m_gaugeVert->SetValue( m_slider->GetValue() / 2 );
7bce6aec
RR
1222}
1223
baccb514
VZ
1224#if wxUSE_SPINCTRL
1225
457e6c54 1226void MyPanel::OnSpinCtrl(wxSpinEvent& event)
baccb514
VZ
1227{
1228 wxString s;
57160afe
VZ
1229 s.Printf(_T("Spin ctrl changed: now %d (from event: %d)\n"),
1230 m_spinctrl->GetValue(), event.GetInt());
baccb514
VZ
1231 m_text->AppendText(s);
1232}
1233
1234#endif // wxUSE_SPINCTRL
1235
0e528b99 1236#if wxUSE_SPINBTN
8c3c31d4
VZ
1237void MyPanel::OnSpinUp( wxSpinEvent &event )
1238{
1239 wxString value;
1240 value.Printf( _T("Spin control up: current = %d\n"),
1241 m_spinbutton->GetValue());
1242
1243 if ( m_spinbutton->GetValue() > 17 )
1244 {
1245 value += _T("Preventing the spin button from going above 17.\n");
1246
1247 event.Veto();
1248 }
1249
1250 m_text->AppendText(value);
1251}
1252
1253void MyPanel::OnSpinDown( wxSpinEvent &event )
1254{
1255 wxString value;
1256 value.Printf( _T("Spin control down: current = %d\n"),
1257 m_spinbutton->GetValue());
1258
1259 if ( m_spinbutton->GetValue() < -17 )
1260 {
1261 value += _T("Preventing the spin button from going below -17.\n");
1262
1263 event.Veto();
1264 }
1265
1266 m_text->AppendText(value);
1267}
1268
e380f72b
RR
1269void MyPanel::OnSpinUpdate( wxSpinEvent &event )
1270{
ec9f7884 1271 wxString value;
f70d5829 1272 value.Printf( _T("%d"), event.GetPosition() );
ec9f7884 1273 m_spintext->SetValue( value );
6380910c 1274
f70d5829 1275 value.Printf( _T("Spin control range: (%d, %d), current = %d\n"),
6380910c
VZ
1276 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
1277 m_spinbutton->GetValue());
1278
1279 m_text->AppendText(value);
e380f72b 1280}
9726da4f
VZ
1281
1282void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
1283{
1284 event.Enable( m_spinbutton->GetValue() > 0 );
1285}
1286
1287void MyPanel::OnShowProgress( wxCommandEvent& WXUNUSED(event) )
1288{
1289 int max = m_spinbutton->GetValue();
1290 wxProgressDialog dialog("Progress dialog example",
1291 "An informative message",
1292 max, // range
1293 this, // parent
8c3c31d4 1294 wxPD_CAN_ABORT |
2c8e4738 1295 wxPD_AUTO_HIDE |
8c3c31d4
VZ
1296 wxPD_APP_MODAL |
1297 wxPD_ELAPSED_TIME |
1298 wxPD_ESTIMATED_TIME |
1299 wxPD_REMAINING_TIME);
2ac1b69a 1300
9726da4f
VZ
1301
1302 bool cont = TRUE;
abceee76 1303 for ( int i = 0; i <= max && cont; i++ )
9726da4f
VZ
1304 {
1305 wxSleep(1);
abceee76 1306 if ( i == max )
be9abe3f
VZ
1307 {
1308 cont = dialog.Update(i, "That's all, folks!");
1309 }
1310 else if ( i == max / 2 )
9726da4f 1311 {
abceee76 1312 cont = dialog.Update(i, "Only a half left (very long message)!");
9726da4f
VZ
1313 }
1314 else
1315 {
1316 cont = dialog.Update(i);
1317 }
1318 }
1319
1320 if ( !cont )
1321 {
1322 *m_text << "Progress dialog aborted!\n";
1323 }
1324 else
1325 {
1326 *m_text << "Countdown from " << max << " finished.\n";
1327 }
1328}
1329
0e528b99 1330#endif // wxUSE_SPINBTN
e380f72b 1331
2cb21a45
VZ
1332MyPanel::~MyPanel()
1333{
29e7e51a
VZ
1334 //wxLog::RemoveTraceMask(_T("focus"));
1335 delete wxLog::SetActiveTarget(m_logTargetOld);
1336
ec9f7884 1337 delete m_notebook->GetImageList();
2cb21a45
VZ
1338}
1339
1c005ff7
RR
1340//----------------------------------------------------------------------
1341// MyFrame
1342//----------------------------------------------------------------------
1343
1344BEGIN_EVENT_TABLE(MyFrame, wxFrame)
3e2dd3db
VZ
1345 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1346 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1347 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
16f6dfd8 1348#if wxUSE_TOOLTIPS
3e2dd3db
VZ
1349 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1350 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
16f6dfd8 1351#endif // wxUSE_TOOLTIPS
87a1e308 1352
3e2dd3db 1353 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
87a1e308
VZ
1354
1355 EVT_SIZE(MyFrame::OnSize)
97206645
VZ
1356 EVT_MOVE(MyFrame::OnMove)
1357
87a1e308 1358 EVT_IDLE(MyFrame::OnIdle)
1c005ff7
RR
1359END_EVENT_TABLE()
1360
9f3362c4 1361MyFrame::MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
ec9f7884 1362: wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
1c005ff7 1363{
5fb9fcfc 1364 CreateStatusBar(2);
9f3362c4 1365
87a1e308 1366 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1c005ff7
RR
1367}
1368
1369void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1370{
ec9f7884 1371 Close(TRUE);
1c005ff7
RR
1372}
1373
1374void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1375{
abceee76
VZ
1376 wxBusyCursor bc;
1377
ec9f7884
VZ
1378 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1379 dialog.ShowModal();
1c005ff7 1380}
9f3362c4 1381
3e2dd3db
VZ
1382void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1383{
1384 m_panel->m_text->Clear();
1385}
1386
16f6dfd8
VZ
1387#if wxUSE_TOOLTIPS
1388void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1389{
1390 static long s_delay = 5000;
1391
1392 wxString delay;
f70d5829 1393 delay.Printf( _T("%ld"), s_delay);
16f6dfd8
VZ
1394
1395 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
ec9f7884
VZ
1396 "Set tooltip delay",
1397 delay,
1398 this);
16f6dfd8
VZ
1399 if ( !delay )
1400 return; // cancelled
1401
f70d5829 1402 wxSscanf(delay, _T("%ld"), &s_delay);
16f6dfd8
VZ
1403
1404 wxToolTip::SetDelay(s_delay);
1405
f70d5829 1406 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
16f6dfd8
VZ
1407}
1408
1409void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1410{
1411 static bool s_enabled = TRUE;
1412
1413 s_enabled = !s_enabled;
1414
1415 wxToolTip::Enable(s_enabled);
1416
f70d5829 1417 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
16f6dfd8
VZ
1418}
1419#endif // tooltips
1420
87a1e308
VZ
1421void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event))
1422{
1423 static bool s_enable = TRUE;
1424
1425 s_enable = !s_enable;
1426 m_panel->Enable(s_enable);
1427}
1428
97206645
VZ
1429void MyFrame::OnMove( wxMoveEvent& event )
1430{
1431 UpdateStatusBar(event.GetPosition(), GetSize());
1432
1433 event.Skip();
1434}
1435
5fb9fcfc
VZ
1436void MyFrame::OnSize( wxSizeEvent& event )
1437{
97206645 1438 UpdateStatusBar(GetPosition(), event.GetSize());
5fb9fcfc
VZ
1439
1440 event.Skip();
1441}
1442
9f3362c4
VZ
1443void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
1444{
1445 // track the window which has the focus in the status bar
1446 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1447 wxWindow *focus = wxWindow::FindFocus();
1448 if ( focus && (focus != s_windowFocus) )
1449 {
1450 s_windowFocus = focus;
1451
1452 wxString msg;
f70d5829 1453 msg.Printf(
9f3362c4 1454#ifdef __WXMSW__
29e7e51a 1455 _T("Focus: %s, HWND = %08x"),
f70d5829 1456#else
29e7e51a 1457 _T("Focus: %s"),
f70d5829 1458#endif
29e7e51a 1459 s_windowFocus->GetClassInfo()->GetClassName()
9f3362c4 1460#ifdef __WXMSW__
ec9f7884 1461 , s_windowFocus->GetHWND()
f70d5829 1462#endif
9f3362c4
VZ
1463 );
1464
1465 SetStatusText(msg);
1466 }
341c92a8 1467}
6c8a980f 1468
f6bcfd97
BP
1469void MyComboBox::OnChar(wxKeyEvent& event)
1470{
1471 wxLogMessage(_T("MyComboBox::OnChar"));
1472
1473 if ( event.KeyCode() == 'w' )
1474 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1475 else
1476 event.Skip();
1477}
1478
1479void MyComboBox::OnKeyDown(wxKeyEvent& event)
1480{
1481 wxLogMessage(_T("MyComboBox::OnKeyDown"));
1482
1483 if ( event.KeyCode() == 'w' )
1484 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1485 else
1486 event.Skip();
1487}
1488
1489void MyComboBox::OnKeyUp(wxKeyEvent& event)
1490{
1491 wxLogMessage(_T("MyComboBox::OnKeyUp"));
1492
1493 event.Skip();
1494}
1495
6c8a980f
VZ
1496static void SetControlClientData(const char *name,
1497 wxControlWithItems *control)
1498{
1499 size_t count = control->GetCount();
1500 for ( size_t n = 0; n < count; n++ )
1501 {
1502 wxString s;
1503 s.Printf("%s client data for '%s'",
1504 name, control->GetString(n).c_str());
1505
1506 control->SetClientObject(n, new wxStringClientData(s));
1507 }
1508}