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