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