]> git.saurik.com Git - wxWidgets.git/blob - samples/controls/controls.cpp
applied (slightly modified) wxToggleButton patch from John Norris and Axel Schlueter
[wxWidgets.git] / samples / controls / controls.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: controls.cpp
3 // Purpose: Controls wxWindows sample
4 // Author: Robert Roebling
5 // Modified by:
6 // RCS-ID: $Id$
7 // Copyright: (c) Robert Roebling, Julian Smart
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifdef __GNUG__
12 #pragma implementation "controls.h"
13 #endif
14
15 // For compilers that support precompilation, includes "wx/wx.h".
16 #include "wx/wxprec.h"
17
18 #ifdef __BORLANDC__
19 #pragma hdrstop
20 #endif
21
22 #ifndef WX_PRECOMP
23 #include "wx/wx.h"
24 #endif
25
26 #if !defined( __WXMSW__ ) || defined( __WIN95__ )
27 #include "wx/spinbutt.h"
28 #endif
29 #include "wx/tglbtn.h"
30 #include "wx/notebook.h"
31 #include "wx/imaglist.h"
32
33 #if wxUSE_TOOLTIPS
34 #include "wx/tooltip.h"
35 #endif
36
37 #if defined(__WXGTK__) || defined(__WXMOTIF__)
38 #define USE_XPM
39 #endif
40
41 #ifdef USE_XPM
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"
49 #endif
50
51 #ifdef __WIN16__
52 // Win16 doesn't have them
53 #ifdef wxUSE_SPINBTN
54 #undef wxUSE_SPINBTN
55 #endif
56 #define wxUSE_SPINBTN 0
57 #else
58 #ifndef wxUSE_SPINBTN
59 #define wxUSE_SPINBTN 1
60 #endif
61 #endif // __WIN16__
62
63 #include "wx/progdlg.h"
64
65 #if wxUSE_SPINCTRL
66 #include "wx/spinctrl.h"
67 #endif // wxUSE_SPINCTRL
68
69 //----------------------------------------------------------------------
70 // class definitions
71 //----------------------------------------------------------------------
72
73 class MyApp: public wxApp
74 {
75 public:
76 bool OnInit();
77 };
78
79 class MyPanel: public wxPanel
80 {
81 public:
82 MyPanel(wxFrame *frame, int x, int y, int w, int h);
83 virtual ~MyPanel();
84
85 void OnSize( wxSizeEvent& event );
86 void OnListBox( wxCommandEvent &event );
87 void OnListBoxDoubleClick( wxCommandEvent &event );
88 void OnListBoxButtons( wxCommandEvent &event );
89 void OnChoice( wxCommandEvent &event );
90 void OnChoiceButtons( wxCommandEvent &event );
91 void OnCombo( wxCommandEvent &event );
92 void OnComboTextChanged( wxCommandEvent &event );
93 void OnComboTextEnter( wxCommandEvent &event );
94 void OnComboButtons( wxCommandEvent &event );
95 void OnRadio( wxCommandEvent &event );
96 void OnRadioButtons( wxCommandEvent &event );
97 void OnSetFont( wxCommandEvent &event );
98 void OnPageChanged( wxNotebookEvent &event );
99 void OnPageChanging( wxNotebookEvent &event );
100 void OnSliderUpdate( wxCommandEvent &event );
101 void OnUpdateLabel( wxCommandEvent &event );
102 #if wxUSE_SPINBTN
103 void OnSpinUp( wxSpinEvent &event );
104 void OnSpinDown( wxSpinEvent &event );
105 void OnSpinUpdate( wxSpinEvent &event );
106 void OnUpdateShowProgress( wxUpdateUIEvent& event );
107 void OnShowProgress( wxCommandEvent &event );
108 #endif // wxUSE_SPINBTN
109
110 #if wxUSE_SPINCTRL
111 void OnSpinCtrl(wxSpinEvent& event);
112 #endif // wxUSE_SPINCTRL
113
114 void OnEnableAll(wxCommandEvent& event);
115 void OnChangeColour(wxCommandEvent& event);
116 void OnTestButton(wxCommandEvent& event);
117 void OnBmpButton(wxCommandEvent& event);
118
119 wxListBox *m_listbox,
120 *m_listboxSorted;
121 wxChoice *m_choice,
122 *m_choiceSorted;
123 wxComboBox *m_combo;
124 wxRadioBox *m_radio;
125 wxGauge *m_gauge,
126 *m_gaugeVert;
127 wxSlider *m_slider;
128 wxButton *m_fontButton;
129 wxButton *m_lbSelectNum;
130 wxButton *m_lbSelectThis;
131 #if wxUSE_SPINBTN
132 wxSpinButton *m_spinbutton;
133 wxButton *m_btnProgress;
134 #endif // wxUSE_SPINBTN
135
136 #if wxUSE_SPINCTRL
137 wxSpinCtrl *m_spinctrl;
138 #endif // wxUSE_SPINCTRL
139
140 wxTextCtrl *m_spintext;
141 wxCheckBox *m_checkbox;
142
143 wxTextCtrl *m_text;
144 wxNotebook *m_notebook;
145
146 wxStaticText *m_label;
147
148 private:
149 wxLog *m_logTargetOld;
150
151 DECLARE_EVENT_TABLE()
152 };
153
154 class MyFrame: public wxFrame
155 {
156 public:
157 MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
158
159 void OnQuit(wxCommandEvent& event);
160 void OnAbout(wxCommandEvent& event);
161 void OnClearLog(wxCommandEvent& event);
162
163 #if wxUSE_TOOLTIPS
164 void OnSetTooltipDelay(wxCommandEvent& event);
165 void OnToggleTooltips(wxCommandEvent& event);
166 #endif // wxUSE_TOOLTIPS
167
168 void OnEnableAll(wxCommandEvent& event);
169
170 void OnIdle( wxIdleEvent& event );
171 void OnSize( wxSizeEvent& event );
172 void OnMove( wxMoveEvent& event );
173
174 MyPanel *GetPanel() const { return m_panel; }
175
176 private:
177 void UpdateStatusBar(const wxPoint& pos, const wxSize& size)
178 {
179 wxString msg;
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);
185 SetStatusText(msg, 1);
186 }
187
188 MyPanel *m_panel;
189
190 DECLARE_EVENT_TABLE()
191 };
192
193 // a button which intercepts double clicks (for testing...)
194 class MyButton : public wxButton
195 {
196 public:
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
213 private:
214 DECLARE_EVENT_TABLE()
215 };
216
217 // a combo which intercepts chars (to test Windows behaviour)
218 class MyComboBox : public wxComboBox
219 {
220 public:
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
232 protected:
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
243 private:
244 DECLARE_EVENT_TABLE()
245 };
246
247 // a radiobox which handles focus set/kill (for testing)
248 class MyRadioBox : public wxRadioBox
249 {
250 public:
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,
260 const wxString& name = wxRadioBoxNameStr)
261 : wxRadioBox(parent, id, title, pos, size, n, choices, majorDim,
262 style, validator, name) { }
263
264 protected:
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
279 private:
280 DECLARE_EVENT_TABLE()
281 };
282
283 //----------------------------------------------------------------------
284 // other
285 //----------------------------------------------------------------------
286
287 static void SetControlClientData(const char *name,
288 wxControlWithItems *control);
289
290 IMPLEMENT_APP(MyApp)
291
292 //----------------------------------------------------------------------
293 // MyApp
294 //----------------------------------------------------------------------
295
296 enum
297 {
298 CONTROLS_QUIT = 100,
299 CONTROLS_TEXT,
300 CONTROLS_ABOUT,
301 CONTROLS_CLEAR_LOG,
302
303 // tooltip menu
304 CONTROLS_SET_TOOLTIP_DELAY = 200,
305 CONTROLS_ENABLE_TOOLTIPS,
306
307 // panel menu
308 CONTROLS_ENABLE_ALL
309 };
310
311 bool MyApp::OnInit()
312 {
313 // parse the cmd line
314 int x = 50,
315 y = 50;
316 if ( argc == 3 )
317 {
318 wxSscanf(argv[1], "%d", &x);
319 wxSscanf(argv[2], "%d", &y);
320 }
321
322 // Create the main frame window
323 MyFrame *frame = new MyFrame((wxFrame *) NULL,
324 "Controls wxWindows App",
325 x, y, 540, 430);
326
327 frame->SetSizeHints( 500, 425 );
328
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
332
333 frame->SetIcon( wxICON(mondrian) );
334
335 wxMenu *file_menu = new wxMenu("", wxMENU_TEAROFF);
336
337 file_menu->Append(CONTROLS_CLEAR_LOG, "&Clear log\tCtrl-L");
338 file_menu->AppendSeparator();
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");
342
343 wxMenuBar *menu_bar = new wxMenuBar;
344 menu_bar->Append(file_menu, "&File");
345
346 #if wxUSE_TOOLTIPS
347 wxMenu *tooltip_menu = new wxMenu;
348 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
349 tooltip_menu->AppendSeparator();
350 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
351 "enable/disable tooltips", TRUE);
352 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, TRUE);
353 menu_bar->Append(tooltip_menu, "&Tooltips");
354 #endif // wxUSE_TOOLTIPS
355
356 wxMenu *panel_menu = new wxMenu;
357 panel_menu->Append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
358 "Enable/disable all panel controls", TRUE);
359 menu_bar->Append(panel_menu, "&Panel");
360
361 frame->SetMenuBar(menu_bar);
362
363 frame->Show(TRUE);
364
365 //frame->GetPanel()->m_notebook->SetSelection(6);
366
367 SetTopWindow(frame);
368
369 return TRUE;
370 }
371
372 //----------------------------------------------------------------------
373 // MyPanel
374 //----------------------------------------------------------------------
375
376 const int ID_NOTEBOOK = 1000;
377
378 const int ID_LISTBOX = 130;
379 const int ID_LISTBOX_SEL_NUM = 131;
380 const int ID_LISTBOX_SEL_STR = 132;
381 const int ID_LISTBOX_CLEAR = 133;
382 const int ID_LISTBOX_APPEND = 134;
383 const int ID_LISTBOX_DELETE = 135;
384 const int ID_LISTBOX_FONT = 136;
385 const int ID_LISTBOX_ENABLE = 137;
386 const int ID_LISTBOX_SORTED = 138;
387
388 const int ID_CHOICE = 120;
389 const int ID_CHOICE_SEL_NUM = 121;
390 const int ID_CHOICE_SEL_STR = 122;
391 const int ID_CHOICE_CLEAR = 123;
392 const int ID_CHOICE_APPEND = 124;
393 const int ID_CHOICE_DELETE = 125;
394 const int ID_CHOICE_FONT = 126;
395 const int ID_CHOICE_ENABLE = 127;
396 const int ID_CHOICE_SORTED = 128;
397
398 const int ID_COMBO = 140;
399 const int ID_COMBO_SEL_NUM = 141;
400 const int ID_COMBO_SEL_STR = 142;
401 const int ID_COMBO_CLEAR = 143;
402 const int ID_COMBO_APPEND = 144;
403 const int ID_COMBO_DELETE = 145;
404 const int ID_COMBO_FONT = 146;
405 const int ID_COMBO_ENABLE = 147;
406
407 const int ID_RADIOBOX = 160;
408 const int ID_RADIOBOX_SEL_NUM = 161;
409 const int ID_RADIOBOX_SEL_STR = 162;
410 const int ID_RADIOBOX_FONT = 163;
411 const int ID_RADIOBOX_ENABLE = 164;
412
413 const int ID_RADIOBUTTON_1 = 166;
414 const int ID_RADIOBUTTON_2 = 167;
415
416 const int ID_SET_FONT = 170;
417
418 const int ID_GAUGE = 180;
419 const int ID_SLIDER = 181;
420
421 const int ID_SPIN = 182;
422 const int ID_BTNPROGRESS = 183;
423 const int ID_BUTTON_LABEL = 184;
424 const int ID_SPINCTRL = 185;
425
426 const int ID_BUTTON_TEST1 = 190;
427 const int ID_BUTTON_TEST2 = 191;
428 const int ID_BITMAP_BTN = 192;
429
430 const int ID_CHANGE_COLOUR = 200;
431
432 BEGIN_EVENT_TABLE(MyPanel, wxPanel)
433 EVT_SIZE ( MyPanel::OnSize)
434 EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MyPanel::OnPageChanging)
435 EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, MyPanel::OnPageChanged)
436 EVT_LISTBOX (ID_LISTBOX, MyPanel::OnListBox)
437 EVT_LISTBOX (ID_LISTBOX_SORTED, MyPanel::OnListBox)
438 EVT_LISTBOX_DCLICK(ID_LISTBOX, MyPanel::OnListBoxDoubleClick)
439 EVT_BUTTON (ID_LISTBOX_SEL_NUM, MyPanel::OnListBoxButtons)
440 EVT_BUTTON (ID_LISTBOX_SEL_STR, MyPanel::OnListBoxButtons)
441 EVT_BUTTON (ID_LISTBOX_CLEAR, MyPanel::OnListBoxButtons)
442 EVT_BUTTON (ID_LISTBOX_APPEND, MyPanel::OnListBoxButtons)
443 EVT_BUTTON (ID_LISTBOX_DELETE, MyPanel::OnListBoxButtons)
444 EVT_BUTTON (ID_LISTBOX_FONT, MyPanel::OnListBoxButtons)
445 EVT_CHECKBOX (ID_LISTBOX_ENABLE, MyPanel::OnListBoxButtons)
446 EVT_CHOICE (ID_CHOICE, MyPanel::OnChoice)
447 EVT_CHOICE (ID_CHOICE_SORTED, MyPanel::OnChoice)
448 EVT_BUTTON (ID_CHOICE_SEL_NUM, MyPanel::OnChoiceButtons)
449 EVT_BUTTON (ID_CHOICE_SEL_STR, MyPanel::OnChoiceButtons)
450 EVT_BUTTON (ID_CHOICE_CLEAR, MyPanel::OnChoiceButtons)
451 EVT_BUTTON (ID_CHOICE_APPEND, MyPanel::OnChoiceButtons)
452 EVT_BUTTON (ID_CHOICE_DELETE, MyPanel::OnChoiceButtons)
453 EVT_BUTTON (ID_CHOICE_FONT, MyPanel::OnChoiceButtons)
454 EVT_CHECKBOX (ID_CHOICE_ENABLE, MyPanel::OnChoiceButtons)
455 EVT_COMBOBOX (ID_COMBO, MyPanel::OnCombo)
456 EVT_TEXT (ID_COMBO, MyPanel::OnComboTextChanged)
457 EVT_TEXT_ENTER(ID_COMBO, MyPanel::OnComboTextEnter)
458 EVT_BUTTON (ID_COMBO_SEL_NUM, MyPanel::OnComboButtons)
459 EVT_BUTTON (ID_COMBO_SEL_STR, MyPanel::OnComboButtons)
460 EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons)
461 EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons)
462 EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons)
463 EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons)
464 EVT_CHECKBOX (ID_COMBO_ENABLE, MyPanel::OnComboButtons)
465 EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio)
466 EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons)
467 EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons)
468 EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons)
469 EVT_CHECKBOX (ID_RADIOBOX_ENABLE, MyPanel::OnRadioButtons)
470 EVT_BUTTON (ID_SET_FONT, MyPanel::OnSetFont)
471 EVT_SLIDER (ID_SLIDER, MyPanel::OnSliderUpdate)
472 #if wxUSE_SPINBTN
473 EVT_SPIN (ID_SPIN, MyPanel::OnSpinUpdate)
474 EVT_SPIN_UP (ID_SPIN, MyPanel::OnSpinUp)
475 EVT_SPIN_DOWN (ID_SPIN, MyPanel::OnSpinDown)
476 EVT_UPDATE_UI (ID_BTNPROGRESS, MyPanel::OnUpdateShowProgress)
477 EVT_BUTTON (ID_BTNPROGRESS, MyPanel::OnShowProgress)
478 #endif // wxUSE_SPINBTN
479 #if wxUSE_SPINCTRL
480 EVT_SPINCTRL (ID_SPINCTRL, MyPanel::OnSpinCtrl)
481 #endif // wxUSE_SPINCTRL
482 EVT_TOGGLEBUTTON(ID_BUTTON_LABEL, MyPanel::OnUpdateLabel)
483 EVT_CHECKBOX (ID_CHANGE_COLOUR, MyPanel::OnChangeColour)
484 EVT_BUTTON (ID_BUTTON_TEST1, MyPanel::OnTestButton)
485 EVT_BUTTON (ID_BUTTON_TEST2, MyPanel::OnTestButton)
486 EVT_BUTTON (ID_BITMAP_BTN, MyPanel::OnBmpButton)
487 END_EVENT_TABLE()
488
489 BEGIN_EVENT_TABLE(MyButton, wxButton)
490 EVT_LEFT_DCLICK(MyButton::OnDClick)
491 END_EVENT_TABLE()
492
493 BEGIN_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)
499 END_EVENT_TABLE()
500
501 BEGIN_EVENT_TABLE(MyRadioBox, wxRadioBox)
502 EVT_SET_FOCUS(MyRadioBox::OnFocusGot)
503 EVT_KILL_FOCUS(MyRadioBox::OnFocusLost)
504 END_EVENT_TABLE()
505
506 // ============================================================================
507 // implementation
508 // ============================================================================
509
510 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
511 : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) ),
512 m_text(NULL), m_notebook(NULL)
513 {
514 wxLayoutConstraints *c;
515
516 m_text = new wxTextCtrl(this, -1, "This is the log window.\n",
517 wxPoint(0, 250), wxSize(100, 50), wxTE_MULTILINE);
518 m_text->SetBackgroundColour("wheat");
519
520 if ( 0 )
521 wxLog::AddTraceMask(_T("focus"));
522 m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
523
524 m_notebook = new wxNotebook(this, ID_NOTEBOOK);
525
526 wxString choices[] =
527 {
528 "This",
529 "is one of my",
530 "really",
531 "wonderful",
532 "examples."
533 };
534
535 #ifdef USE_XPM
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);
552 #elif defined(__WXMSW__)
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);
576 #else
577
578 // No images for now
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
587 #endif
588
589 wxPanel *panel = new wxPanel(m_notebook);
590 m_listbox = new wxListBox( panel, ID_LISTBOX,
591 wxPoint(10,10), wxSize(120,70),
592 5, choices, wxLB_ALWAYS_SB );
593 m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED,
594 wxPoint(10,90), wxSize(120,70),
595 5, choices, wxLB_SORT );
596
597 SetControlClientData("listbox", m_listbox);
598 SetControlClientData("listbox", m_listboxSorted);
599
600 m_listbox->SetCursor(*wxCROSS_CURSOR);
601 #if wxUSE_TOOLTIPS
602 m_listbox->SetToolTip( "This is a list box" );
603 #endif // wxUSE_TOOLTIPS
604
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) );
608 (void)new MyButton( panel, ID_LISTBOX_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
609 (void)new wxButton( panel, ID_LISTBOX_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
610 wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
611
612 button->SetDefault();
613
614 button->SetForegroundColour(*wxBLUE);
615
616 #if wxUSE_TOOLTIPS
617 button->SetToolTip( "Press here to set italic font" );
618 #endif // wxUSE_TOOLTIPS
619
620 m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "&Disable", wxPoint(20,170) );
621 m_checkbox->SetValue(FALSE);
622 #if wxUSE_TOOLTIPS
623 m_checkbox->SetToolTip( "Click here to disable the listbox" );
624 #endif // wxUSE_TOOLTIPS
625 (void)new wxCheckBox( panel, ID_CHANGE_COLOUR, "&Toggle colour",
626 wxPoint(110,170) );
627 panel->SetCursor(wxCursor(wxCURSOR_HAND));
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 );
632 m_choiceSorted = new wxChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,-1),
633 5, choices, wxCB_SORT );
634
635 SetControlClientData("choice", m_choice);
636 SetControlClientData("choice", m_choiceSorted);
637
638 m_choice->SetSelection(2);
639 m_choice->SetBackgroundColour( "red" );
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) );
647
648 m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
649
650 panel = new wxPanel(m_notebook);
651 (void)new wxStaticBox( panel, -1, "&Box around combobox",
652 wxPoint(5, 5), wxSize(150, 100));
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
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) );
665 m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
666
667 wxString choices2[] =
668 {
669 "First", "Second",
670 /* "Third",
671 "Fourth", "Fifth", "Sixth",
672 "Seventh", "Eighth", "Nineth", "Tenth" */
673 };
674
675 panel = new wxPanel(m_notebook);
676 (void)new MyRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
677 m_radio = new wxRadioBox( panel, ID_RADIOBOX, "T&his", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
678
679 #if wxUSE_TOOLTIPS
680 m_combo->SetToolTip("This is a natural\ncombobox - can you believe me?");
681 m_radio->SetToolTip("Ever seen a radiobox?");
682 #endif // wxUSE_TOOLTIPS
683
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 );
689 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxDefaultSize, wxRB_GROUP );
690 rb->SetValue( FALSE );
691 (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "&Radiobutton2", wxPoint(340,170), wxDefaultSize );
692 m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
693
694 panel = new wxPanel(m_notebook);
695 (void)new wxStaticBox( panel, -1, "&wxGauge and wxSlider", wxPoint(10,10), wxSize(222,130) );
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);
699 m_gaugeVert = new wxGauge( panel, -1, 100,
700 wxPoint(195,35), wxSize(30, 90),
701 wxGA_VERTICAL | wxGA_SMOOTH | wxNO_BORDER );
702 m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1), wxSL_LABELS );
703 (void)new wxStaticBox( panel, -1, "&Explanation", wxPoint(230,10), wxSize(270,130) );
704 #ifdef __WXMOTIF__
705 // No wrapping text in wxStaticText yet :-(
706 (void)new wxStaticText( panel, -1,
707 "Drag the slider!",
708 wxPoint(250,30),
709 wxSize(240, -1)
710 );
711 #else
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",
719 wxPoint(250,25),
720 wxSize(240, 110)
721 );
722 #endif
723 int initialSpinValue = -5;
724 wxString s;
725 s << initialSpinValue;
726 m_spintext = new wxTextCtrl( panel, -1, s, wxPoint(20,160), wxSize(80,-1) );
727 #if wxUSE_SPINBTN
728 m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(80, -1) );
729 m_spinbutton->SetRange(-10,30);
730 m_spinbutton->SetValue(initialSpinValue);
731
732 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, "&Show progress dialog",
733 wxPoint(300, 160) );
734 #endif // wxUSE_SPINBTN
735
736 #if wxUSE_SPINCTRL
737 m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, "", wxPoint(200, 160), wxSize(80, -1) );
738 m_spinctrl->SetRange(10,30);
739 m_spinctrl->SetValue(15);
740 #endif // wxUSE_SPINCTRL
741
742 m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
743
744 panel = new wxPanel(m_notebook);
745
746 #if !defined(__WXMOTIF__) && !defined(__WIN16__) // wxStaticBitmap not working under Motif yet; and icons not allowed under WIN16.
747 wxIcon icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
748 wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon,
749 wxPoint(10, 10));
750
751 bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
752 bmpStatic->SetIcon(wxTheApp->GetStdIcon(wxICON_QUESTION));
753 #endif // !Motif
754
755 wxBitmap bitmap( 100, 100 );
756 wxMemoryDC dc;
757 dc.SelectObject( bitmap );
758 dc.SetPen(*wxGREEN_PEN);
759 dc.Clear();
760 dc.DrawEllipse(5, 5, 90, 90);
761 dc.DrawText("Bitmap", 30, 40);
762 dc.SelectObject( wxNullBitmap );
763
764 (void)new wxBitmapButton(panel, ID_BITMAP_BTN, bitmap, wxPoint(100, 20));
765
766 #ifdef __WXMSW__
767 // test for masked bitmap display
768 bitmap = wxBitmap("test2.bmp", wxBITMAP_TYPE_BMP);
769 if (bitmap.Ok())
770 {
771 bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
772
773 (void)new wxStaticBitmap /* wxBitmapButton */ (panel, -1, bitmap, wxPoint(300, 120));
774 }
775 #endif
776
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,
784 wxPoint(30, 70)
785 );
786 bmpBtn->SetBitmapSelected(bmp2);
787 bmpBtn->SetBitmapFocus(bmp3);
788
789 (void)new wxToggleButton(panel, ID_BUTTON_LABEL,
790 "&Toggle label", wxPoint(250, 20));
791 m_label = new wxStaticText(panel, -1, "Label with some long text",
792 wxPoint(250, 60), wxDefaultSize,
793 wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
794 m_label->SetForegroundColour( *wxBLUE );
795
796 m_notebook->AddPage(panel, "wxBitmapXXX");
797
798 // layout constraints
799
800 panel = new wxPanel(m_notebook);
801 panel->SetAutoLayout( TRUE );
802
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 );
808
809 wxButton *pMyButton = new wxButton(panel, ID_BUTTON_TEST1, "Test Button &1" );
810 pMyButton->SetConstraints( c );
811
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 );
817
818 wxButton *pMyButton2 = new wxButton(panel, ID_BUTTON_TEST2, "Test Button &2" );
819 pMyButton2->SetConstraints( c );
820
821 m_notebook->AddPage(panel, "wxLayoutConstraint");
822
823 // sizer
824
825 panel = new wxPanel(m_notebook);
826 panel->SetAutoLayout( TRUE );
827
828 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
829
830 sizer->Add( new wxButton(panel, -1, "Test Button &1" ), 3, wxALL, 10 );
831 sizer->Add( 20,20, 1 );
832 sizer->Add( new wxButton(panel, -1, "Test Button &2" ), 3, wxGROW|wxALL, 10 );
833
834 panel->SetSizer( sizer );
835
836 m_notebook->AddPage(panel, "wxSizer");
837 }
838
839 void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
840 {
841 int x = 0;
842 int y = 0;
843 GetClientSize( &x, &y );
844
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 );
847 }
848
849 void MyPanel::OnPageChanging( wxNotebookEvent &event )
850 {
851 int selOld = event.GetOldSelection();
852 if ( selOld == 2 )
853 {
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",
857 "Control sample",
858 wxICON_QUESTION | wxYES_NO, this) != wxYES )
859 {
860 event.Veto();
861
862 return;
863 }
864 }
865
866 *m_text << "Notebook selection is being changed from " << selOld << "\n";
867 }
868
869 void MyPanel::OnPageChanged( wxNotebookEvent &event )
870 {
871 *m_text << "Notebook selection is " << event.GetSelection() << "\n";
872 }
873
874 void MyPanel::OnTestButton(wxCommandEvent& event)
875 {
876 wxLogMessage(_T("Button %c clicked."),
877 event.GetId() == ID_BUTTON_TEST1 ? _T('1') : _T('2'));
878 }
879
880 void MyPanel::OnBmpButton(wxCommandEvent& event)
881 {
882 wxLogMessage(_T("Bitmap button clicked."));
883 }
884
885 void 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
895 m_lbSelectThis->SetForegroundColour("red");
896 m_lbSelectThis->SetBackgroundColour("white");
897 }
898 else
899 {
900 s_colOld = wxColour("red");
901 SetBackgroundColour("white");
902
903 m_lbSelectThis->SetForegroundColour("white");
904 m_lbSelectThis->SetBackgroundColour("red");
905 }
906
907 m_lbSelectThis->Refresh();
908 Refresh();
909 }
910
911 void MyPanel::OnListBox( wxCommandEvent &event )
912 {
913 // GetParent()->Move(100, 100);
914
915 if (event.GetInt() == -1)
916 {
917 m_text->AppendText( "ListBox has no selections anymore\n" );
918 return;
919 }
920
921 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
922 : m_listboxSorted;
923
924 m_text->AppendText( "ListBox event selection string is: '" );
925 m_text->AppendText( event.GetString() );
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: '" );
933 if (obj) // BC++ doesn't like use of '? .. : .. ' in this context
934 m_text->AppendText( obj->GetData() );
935 else
936 m_text->AppendText( wxString("none") );
937
938 m_text->AppendText( "'\n" );
939 m_text->AppendText( "ListBox control client data string is: '" );
940 obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection());
941 if (obj)
942 m_text->AppendText( obj->GetData() );
943 else
944 m_text->AppendText( wxString("none") );
945 m_text->AppendText( "'\n" );
946 }
947
948 void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
949 {
950 m_text->AppendText( "ListBox double click string is: " );
951 m_text->AppendText( event.GetString() );
952 m_text->AppendText( "\n" );
953 }
954
955 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
956 {
957 switch (event.GetId())
958 {
959 case ID_LISTBOX_ENABLE:
960 {
961 m_text->AppendText("Checkbox clicked.\n");
962 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
963 #if wxUSE_TOOLTIPS
964 if (event.GetInt())
965 cb->SetToolTip( "Click to enable listbox" );
966 else
967 cb->SetToolTip( "Click to disable listbox" );
968 #endif // wxUSE_TOOLTIPS
969 m_listbox->Enable( event.GetInt() == 0 );
970 m_lbSelectThis->Enable( event.GetInt() == 0 );
971 m_lbSelectNum->Enable( event.GetInt() == 0 );
972 m_listboxSorted->Enable( event.GetInt() == 0 );
973 FindWindow(ID_CHANGE_COLOUR)->Enable( event.GetInt() == 0 );
974 break;
975 }
976 case ID_LISTBOX_SEL_NUM:
977 {
978 m_listbox->SetSelection( 2 );
979 m_listboxSorted->SetSelection( 2 );
980 m_lbSelectThis->WarpPointer( 40, 14 );
981 break;
982 }
983 case ID_LISTBOX_SEL_STR:
984 {
985 m_listbox->SetStringSelection( "This" );
986 m_listboxSorted->SetStringSelection( "This" );
987 m_lbSelectNum->WarpPointer( 40, 14 );
988 break;
989 }
990 case ID_LISTBOX_CLEAR:
991 {
992 m_listbox->Clear();
993 m_listboxSorted->Clear();
994 break;
995 }
996 case ID_LISTBOX_APPEND:
997 {
998 m_listbox->Append( "Hi!" );
999 m_listboxSorted->Append( "Hi!" );
1000 break;
1001 }
1002 case ID_LISTBOX_DELETE:
1003 {
1004 int idx;
1005 idx = m_listbox->GetSelection();
1006 if ( idx != wxNOT_FOUND )
1007 m_listbox->Delete( idx );
1008 idx = m_listboxSorted->GetSelection();
1009 if ( idx != wxNOT_FOUND )
1010 m_listboxSorted->Delete( idx );
1011 break;
1012 }
1013 case ID_LISTBOX_FONT:
1014 {
1015 m_listbox->SetFont( *wxITALIC_FONT );
1016 m_listboxSorted->SetFont( *wxITALIC_FONT );
1017 m_checkbox->SetFont( *wxITALIC_FONT );
1018 break;
1019 }
1020 }
1021 }
1022
1023 void MyPanel::OnChoice( wxCommandEvent &event )
1024 {
1025 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
1026 : m_choiceSorted;
1027
1028 m_text->AppendText( "Choice event selection string is: '" );
1029 m_text->AppendText( event.GetString() );
1030 m_text->AppendText( "'\n" );
1031 m_text->AppendText( "Choice control selection string is: '" );
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: '" );
1037
1038 if (obj)
1039 m_text->AppendText( obj->GetData() );
1040 else
1041 m_text->AppendText( wxString("none") );
1042
1043 m_text->AppendText( "'\n" );
1044 m_text->AppendText( "Choice control client data string is: '" );
1045 obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection());
1046
1047 if (obj)
1048 m_text->AppendText( obj->GetData() );
1049 else
1050 m_text->AppendText( wxString("none") );
1051 m_text->AppendText( "'\n" );
1052 }
1053
1054 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
1055 {
1056 switch (event.GetId())
1057 {
1058 case ID_CHOICE_ENABLE:
1059 {
1060 m_choice->Enable( event.GetInt() == 0 );
1061 m_choiceSorted->Enable( event.GetInt() == 0 );
1062 break;
1063 }
1064 case ID_CHOICE_SEL_NUM:
1065 {
1066 m_choice->SetSelection( 2 );
1067 m_choiceSorted->SetSelection( 2 );
1068 break;
1069 }
1070 case ID_CHOICE_SEL_STR:
1071 {
1072 m_choice->SetStringSelection( "This" );
1073 m_choiceSorted->SetStringSelection( "This" );
1074 break;
1075 }
1076 case ID_CHOICE_CLEAR:
1077 {
1078 m_choice->Clear();
1079 m_choiceSorted->Clear();
1080 break;
1081 }
1082 case ID_CHOICE_APPEND:
1083 {
1084 m_choice->Append( "Hi!" );
1085 m_choiceSorted->Append( "Hi!" );
1086 break;
1087 }
1088 case ID_CHOICE_DELETE:
1089 {
1090 int idx = m_choice->GetSelection();
1091 if ( idx != wxNOT_FOUND )
1092 m_choice->Delete( idx );
1093 idx = m_choiceSorted->GetSelection();
1094 if ( idx != wxNOT_FOUND )
1095 m_choiceSorted->Delete( idx );
1096 break;
1097 }
1098 case ID_CHOICE_FONT:
1099 {
1100 m_choice->SetFont( *wxITALIC_FONT );
1101 m_choiceSorted->SetFont( *wxITALIC_FONT );
1102 break;
1103 }
1104 }
1105 }
1106
1107 void MyPanel::OnCombo( wxCommandEvent &event )
1108 {
1109 m_text->AppendText( "ComboBox event selection string is: " );
1110 m_text->AppendText( event.GetString() );
1111 m_text->AppendText( "\n" );
1112 m_text->AppendText( "ComboBox control selection string is: " );
1113 m_text->AppendText( m_combo->GetStringSelection() );
1114 m_text->AppendText( "\n" );
1115 }
1116
1117 void 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
1123 void 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
1129 void MyPanel::OnComboButtons( wxCommandEvent &event )
1130 {
1131 switch (event.GetId())
1132 {
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 }
1169 }
1170 }
1171
1172 void MyPanel::OnRadio( wxCommandEvent &event )
1173 {
1174 m_text->AppendText( "RadioBox selection string is: " );
1175 m_text->AppendText( event.GetString() );
1176 m_text->AppendText( "\n" );
1177 }
1178
1179 void MyPanel::OnRadioButtons( wxCommandEvent &event )
1180 {
1181 switch (event.GetId())
1182 {
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 }
1203 }
1204 }
1205
1206 void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
1207 {
1208 m_fontButton->SetFont( *wxITALIC_FONT );
1209 m_text->SetFont( *wxITALIC_FONT );
1210 }
1211
1212 void MyPanel::OnUpdateLabel( wxCommandEvent &event )
1213 {
1214 m_label->SetLabel(event.GetInt() ? "Very very very very very long text."
1215 : "Shorter text.");
1216 }
1217
1218 void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
1219 {
1220 m_gauge->SetValue( m_slider->GetValue() );
1221 m_gaugeVert->SetValue( m_slider->GetValue() / 2 );
1222 }
1223
1224 #if wxUSE_SPINCTRL
1225
1226 void MyPanel::OnSpinCtrl(wxSpinEvent& event)
1227 {
1228 wxString s;
1229 s.Printf(_T("Spin ctrl changed: now %d (from event: %d)\n"),
1230 m_spinctrl->GetValue(), event.GetInt());
1231 m_text->AppendText(s);
1232 }
1233
1234 #endif // wxUSE_SPINCTRL
1235
1236 #if wxUSE_SPINBTN
1237 void 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
1253 void 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
1269 void MyPanel::OnSpinUpdate( wxSpinEvent &event )
1270 {
1271 wxString value;
1272 value.Printf( _T("%d"), event.GetPosition() );
1273 m_spintext->SetValue( value );
1274
1275 value.Printf( _T("Spin control range: (%d, %d), current = %d\n"),
1276 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
1277 m_spinbutton->GetValue());
1278
1279 m_text->AppendText(value);
1280 }
1281
1282 void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
1283 {
1284 event.Enable( m_spinbutton->GetValue() > 0 );
1285 }
1286
1287 void 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
1294 wxPD_CAN_ABORT |
1295 wxPD_AUTO_HIDE |
1296 wxPD_APP_MODAL |
1297 wxPD_ELAPSED_TIME |
1298 wxPD_ESTIMATED_TIME |
1299 wxPD_REMAINING_TIME);
1300
1301
1302 bool cont = TRUE;
1303 for ( int i = 0; i <= max && cont; i++ )
1304 {
1305 wxSleep(1);
1306 if ( i == max )
1307 {
1308 cont = dialog.Update(i, "That's all, folks!");
1309 }
1310 else if ( i == max / 2 )
1311 {
1312 cont = dialog.Update(i, "Only a half left (very long message)!");
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
1330 #endif // wxUSE_SPINBTN
1331
1332 MyPanel::~MyPanel()
1333 {
1334 //wxLog::RemoveTraceMask(_T("focus"));
1335 delete wxLog::SetActiveTarget(m_logTargetOld);
1336
1337 delete m_notebook->GetImageList();
1338 }
1339
1340 //----------------------------------------------------------------------
1341 // MyFrame
1342 //----------------------------------------------------------------------
1343
1344 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1345 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1346 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1347 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
1348 #if wxUSE_TOOLTIPS
1349 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1350 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
1351 #endif // wxUSE_TOOLTIPS
1352
1353 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
1354
1355 EVT_SIZE(MyFrame::OnSize)
1356 EVT_MOVE(MyFrame::OnMove)
1357
1358 EVT_IDLE(MyFrame::OnIdle)
1359 END_EVENT_TABLE()
1360
1361 MyFrame::MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
1362 : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
1363 {
1364 CreateStatusBar(2);
1365
1366 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1367 }
1368
1369 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1370 {
1371 Close(TRUE);
1372 }
1373
1374 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1375 {
1376 wxBusyCursor bc;
1377
1378 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1379 dialog.ShowModal();
1380 }
1381
1382 void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1383 {
1384 m_panel->m_text->Clear();
1385 }
1386
1387 #if wxUSE_TOOLTIPS
1388 void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1389 {
1390 static long s_delay = 5000;
1391
1392 wxString delay;
1393 delay.Printf( _T("%ld"), s_delay);
1394
1395 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
1396 "Set tooltip delay",
1397 delay,
1398 this);
1399 if ( !delay )
1400 return; // cancelled
1401
1402 wxSscanf(delay, _T("%ld"), &s_delay);
1403
1404 wxToolTip::SetDelay(s_delay);
1405
1406 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
1407 }
1408
1409 void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1410 {
1411 static bool s_enabled = TRUE;
1412
1413 s_enabled = !s_enabled;
1414
1415 wxToolTip::Enable(s_enabled);
1416
1417 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
1418 }
1419 #endif // tooltips
1420
1421 void 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
1429 void MyFrame::OnMove( wxMoveEvent& event )
1430 {
1431 UpdateStatusBar(event.GetPosition(), GetSize());
1432
1433 event.Skip();
1434 }
1435
1436 void MyFrame::OnSize( wxSizeEvent& event )
1437 {
1438 UpdateStatusBar(GetPosition(), event.GetSize());
1439
1440 event.Skip();
1441 }
1442
1443 void 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;
1453 msg.Printf(
1454 #ifdef __WXMSW__
1455 _T("Focus: %s, HWND = %08x"),
1456 #else
1457 _T("Focus: %s"),
1458 #endif
1459 s_windowFocus->GetClassInfo()->GetClassName()
1460 #ifdef __WXMSW__
1461 , s_windowFocus->GetHWND()
1462 #endif
1463 );
1464
1465 SetStatusText(msg);
1466 }
1467 }
1468
1469 void 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
1479 void 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
1489 void MyComboBox::OnKeyUp(wxKeyEvent& event)
1490 {
1491 wxLogMessage(_T("MyComboBox::OnKeyUp"));
1492
1493 event.Skip();
1494 }
1495
1496 static 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 }