]> git.saurik.com Git - wxWidgets.git/blob - samples/controls/controls.cpp
c08dff38078fb96f7abf8f4ee68dfbfc5c6214d4
[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/notebook.h"
30 #include "wx/imaglist.h"
31
32 #if wxUSE_TOOLTIPS
33 #include "wx/tooltip.h"
34 #endif
35
36 #if defined(__WXGTK__) || defined(__WXMOTIF__)
37 #define USE_XPM
38 #endif
39
40 #ifdef USE_XPM
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"
48 #endif
49
50 #ifdef __WIN16__
51 // Win16 doesn't have them
52 #undef wxUSE_SPINBUTTON
53 #define wxUSE_SPINBUTTON 0
54 #else
55 #if !defined(wxUSE_SPINBUTTON)
56 #define wxUSE_SPINBUTTON 1
57 #endif
58 #endif // __WIN16__
59
60 #include "wx/progdlg.h"
61
62 // VZ: this is a temp. hack, will remove soon
63 #define wxUSE_SPINCTRL 1
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 OnComboButtons( wxCommandEvent &event );
93 void OnRadio( wxCommandEvent &event );
94 void OnRadioButtons( wxCommandEvent &event );
95 void OnSetFont( wxCommandEvent &event );
96 void OnPageChanged( wxNotebookEvent &event );
97 void OnPageChanging( wxNotebookEvent &event );
98 void OnSliderUpdate( wxCommandEvent &event );
99 #if wxUSE_SPINBUTTON
100 void OnSpinUp( wxSpinEvent &event );
101 void OnSpinDown( wxSpinEvent &event );
102 void OnSpinUpdate( wxSpinEvent &event );
103 void OnUpdateShowProgress( wxUpdateUIEvent& event );
104 void OnShowProgress( wxCommandEvent &event );
105 #endif // wxUSE_SPINBUTTON
106
107 wxListBox *m_listbox,
108 *m_listboxSorted;
109 wxChoice *m_choice,
110 *m_choiceSorted;
111 wxComboBox *m_combo;
112 wxRadioBox *m_radio;
113 wxGauge *m_gauge;
114 wxSlider *m_slider;
115 wxButton *m_fontButton;
116 wxButton *m_lbSelectNum;
117 wxButton *m_lbSelectThis;
118 #if wxUSE_SPINBUTTON
119 wxSpinButton *m_spinbutton;
120 wxButton *m_btnProgress;
121 #endif // wxUSE_SPINBUTTON
122
123 #if wxUSE_SPINCTRL
124 wxSpinCtrl *m_spinctrl;
125 #endif // wxUSE_SPINCTRL
126
127 wxTextCtrl *m_spintext;
128 wxCheckBox *m_checkbox;
129
130 wxTextCtrl *m_text;
131 wxNotebook *m_notebook;
132
133 private:
134 DECLARE_EVENT_TABLE()
135 };
136
137 class MyFrame: public wxFrame
138 {
139 public:
140 MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
141
142 void OnQuit(wxCommandEvent& event);
143 void OnAbout(wxCommandEvent& event);
144 #if wxUSE_TOOLTIPS
145 void OnSetTooltipDelay(wxCommandEvent& event);
146 void OnToggleTooltips(wxCommandEvent& event);
147 #endif // wxUSE_TOOLTIPS
148 void OnIdle( wxIdleEvent& event );
149 void OnSize( wxSizeEvent& event );
150
151 private:
152 DECLARE_EVENT_TABLE()
153 };
154
155 //----------------------------------------------------------------------
156 // other
157 //----------------------------------------------------------------------
158
159 static void SetControlClientData(const char *name,
160 wxControlWithItems *control);
161
162 IMPLEMENT_APP(MyApp)
163
164 //----------------------------------------------------------------------
165 // MyApp
166 //----------------------------------------------------------------------
167
168 enum
169 {
170 MINIMAL_QUIT = 100,
171 MINIMAL_TEXT,
172 MINIMAL_ABOUT,
173
174 // tooltip menu
175 MINIMAL_SET_TOOLTIP_DELAY = 200,
176 MINIMAL_ENABLE_TOOLTIPS
177 };
178
179 bool MyApp::OnInit()
180 {
181 // Create the main frame window
182 MyFrame *frame = new MyFrame((wxFrame *) NULL,
183 "Controls wxWindows App",
184 50, 50, 530, 420);
185
186 // Give it an icon
187 // The wxICON() macros loads an icon from a resource under Windows
188 // and uses an #included XPM image under GTK+ and Motif
189
190 frame->SetIcon( wxICON(mondrian) );
191
192 wxMenu *file_menu = new wxMenu("", wxMENU_TEAROFF );
193 file_menu->Append(MINIMAL_ABOUT, "&About\tF1");
194 file_menu->Append(MINIMAL_QUIT, "E&xit\tAlt-X", "Quit controls sample");
195
196 wxMenuBar *menu_bar = new wxMenuBar;
197 menu_bar->Append(file_menu, "&File");
198
199 #if wxUSE_TOOLTIPS
200 wxMenu *tooltip_menu = new wxMenu;
201 tooltip_menu->Append(MINIMAL_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
202 tooltip_menu->AppendSeparator();
203 tooltip_menu->Append(MINIMAL_ENABLE_TOOLTIPS, "&Toggle tooltips\tCrtl-T",
204 "enable/disable tooltips", TRUE);
205 tooltip_menu->Check(MINIMAL_ENABLE_TOOLTIPS, TRUE);
206 menu_bar->Append(tooltip_menu, "&Tooltips");
207 #endif // wxUSE_TOOLTIPS
208
209 frame->SetMenuBar(menu_bar);
210
211 frame->Show(TRUE);
212 frame->SetCursor(wxCursor(wxCURSOR_HAND));
213
214 SetTopWindow(frame);
215
216 return TRUE;
217 }
218
219 //----------------------------------------------------------------------
220 // MyPanel
221 //----------------------------------------------------------------------
222
223 const int ID_NOTEBOOK = 1000;
224
225 const int ID_LISTBOX = 130;
226 const int ID_LISTBOX_SEL_NUM = 131;
227 const int ID_LISTBOX_SEL_STR = 132;
228 const int ID_LISTBOX_CLEAR = 133;
229 const int ID_LISTBOX_APPEND = 134;
230 const int ID_LISTBOX_DELETE = 135;
231 const int ID_LISTBOX_FONT = 136;
232 const int ID_LISTBOX_ENABLE = 137;
233 const int ID_LISTBOX_SORTED = 138;
234
235 const int ID_CHOICE = 120;
236 const int ID_CHOICE_SEL_NUM = 121;
237 const int ID_CHOICE_SEL_STR = 122;
238 const int ID_CHOICE_CLEAR = 123;
239 const int ID_CHOICE_APPEND = 124;
240 const int ID_CHOICE_DELETE = 125;
241 const int ID_CHOICE_FONT = 126;
242 const int ID_CHOICE_ENABLE = 127;
243 const int ID_CHOICE_SORTED = 128;
244
245 const int ID_COMBO = 140;
246 const int ID_COMBO_SEL_NUM = 141;
247 const int ID_COMBO_SEL_STR = 142;
248 const int ID_COMBO_CLEAR = 143;
249 const int ID_COMBO_APPEND = 144;
250 const int ID_COMBO_DELETE = 145;
251 const int ID_COMBO_FONT = 146;
252 const int ID_COMBO_ENABLE = 147;
253
254 const int ID_RADIOBOX = 160;
255 const int ID_RADIOBOX_SEL_NUM = 161;
256 const int ID_RADIOBOX_SEL_STR = 162;
257 const int ID_RADIOBOX_FONT = 163;
258 const int ID_RADIOBOX_ENABLE = 164;
259
260 const int ID_RADIOBUTTON_1 = 166;
261 const int ID_RADIOBUTTON_2 = 167;
262
263 const int ID_SET_FONT = 170;
264
265 const int ID_GAUGE = 180;
266 const int ID_SLIDER = 181;
267
268 const int ID_SPIN = 182;
269 const int ID_BTNPROGRESS = 183;
270
271 BEGIN_EVENT_TABLE(MyPanel, wxPanel)
272 EVT_SIZE ( MyPanel::OnSize)
273 EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MyPanel::OnPageChanging)
274 EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, MyPanel::OnPageChanged)
275 EVT_LISTBOX (ID_LISTBOX, MyPanel::OnListBox)
276 EVT_LISTBOX (ID_LISTBOX_SORTED, MyPanel::OnListBox)
277 EVT_LISTBOX_DCLICK(ID_LISTBOX, MyPanel::OnListBoxDoubleClick)
278 EVT_BUTTON (ID_LISTBOX_SEL_NUM, MyPanel::OnListBoxButtons)
279 EVT_BUTTON (ID_LISTBOX_SEL_STR, MyPanel::OnListBoxButtons)
280 EVT_BUTTON (ID_LISTBOX_CLEAR, MyPanel::OnListBoxButtons)
281 EVT_BUTTON (ID_LISTBOX_APPEND, MyPanel::OnListBoxButtons)
282 EVT_BUTTON (ID_LISTBOX_DELETE, MyPanel::OnListBoxButtons)
283 EVT_BUTTON (ID_LISTBOX_FONT, MyPanel::OnListBoxButtons)
284 EVT_CHECKBOX (ID_LISTBOX_ENABLE, MyPanel::OnListBoxButtons)
285 EVT_CHOICE (ID_CHOICE, MyPanel::OnChoice)
286 EVT_CHOICE (ID_CHOICE_SORTED, MyPanel::OnChoice)
287 EVT_BUTTON (ID_CHOICE_SEL_NUM, MyPanel::OnChoiceButtons)
288 EVT_BUTTON (ID_CHOICE_SEL_STR, MyPanel::OnChoiceButtons)
289 EVT_BUTTON (ID_CHOICE_CLEAR, MyPanel::OnChoiceButtons)
290 EVT_BUTTON (ID_CHOICE_APPEND, MyPanel::OnChoiceButtons)
291 EVT_BUTTON (ID_CHOICE_DELETE, MyPanel::OnChoiceButtons)
292 EVT_BUTTON (ID_CHOICE_FONT, MyPanel::OnChoiceButtons)
293 EVT_CHECKBOX (ID_CHOICE_ENABLE, MyPanel::OnChoiceButtons)
294 EVT_COMBOBOX (ID_COMBO, MyPanel::OnCombo)
295 EVT_BUTTON (ID_COMBO_SEL_NUM, MyPanel::OnComboButtons)
296 EVT_BUTTON (ID_COMBO_SEL_STR, MyPanel::OnComboButtons)
297 EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons)
298 EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons)
299 EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons)
300 EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons)
301 EVT_CHECKBOX (ID_COMBO_ENABLE, MyPanel::OnComboButtons)
302 EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio)
303 EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons)
304 EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons)
305 EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons)
306 EVT_CHECKBOX (ID_RADIOBOX_ENABLE, MyPanel::OnRadioButtons)
307 EVT_BUTTON (ID_SET_FONT, MyPanel::OnSetFont)
308 EVT_SLIDER (ID_SLIDER, MyPanel::OnSliderUpdate)
309 #if wxUSE_SPINBUTTON
310 EVT_SPIN (ID_SPIN, MyPanel::OnSpinUpdate)
311 EVT_SPIN_UP (ID_SPIN, MyPanel::OnSpinUp)
312 EVT_SPIN_DOWN (ID_SPIN, MyPanel::OnSpinDown)
313 EVT_UPDATE_UI (ID_BTNPROGRESS, MyPanel::OnUpdateShowProgress)
314 EVT_BUTTON (ID_BTNPROGRESS, MyPanel::OnShowProgress)
315 #endif
316 END_EVENT_TABLE()
317
318 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
319 : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) ),
320 m_text(NULL), m_notebook(NULL)
321 {
322 // SetBackgroundColour("cadet blue");
323
324 m_text = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,50), wxSize(100,50), wxTE_MULTILINE );
325 // m_text->SetBackgroundColour("wheat");
326
327 delete wxLog::SetActiveTarget(new wxLogStderr);
328
329 m_notebook = new wxNotebook( this, ID_NOTEBOOK, wxPoint(0,0), wxSize(200,150) );
330
331 wxString choices[] =
332 {
333 "This",
334 "is one of my",
335 "really",
336 "wonderful",
337 "examples."
338 };
339
340 #ifdef USE_XPM
341 // image ids
342 enum
343 {
344 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
345 };
346
347 // fill the image list
348 wxImageList *imagelist = new wxImageList(32, 32);
349
350 imagelist-> Add( wxBitmap( list_xpm ));
351 imagelist-> Add( wxBitmap( choice_xpm ));
352 imagelist-> Add( wxBitmap( combo_xpm ));
353 imagelist-> Add( wxBitmap( text_xpm ));
354 imagelist-> Add( wxBitmap( radio_xpm ));
355 imagelist-> Add( wxBitmap( gauge_xpm ));
356 m_notebook->SetImageList(imagelist);
357 #elif defined(__WXMSW__)
358 // load images from resources
359 enum
360 {
361 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
362 };
363 wxImageList *imagelist = new wxImageList(16, 16, FALSE, Image_Max);
364
365 static const char *s_iconNames[Image_Max] =
366 {
367 "list", "choice", "combo", "text", "radio", "gauge"
368 };
369
370 for ( size_t n = 0; n < Image_Max; n++ )
371 {
372 wxBitmap bmp(s_iconNames[n]);
373 if ( !bmp.Ok() || (imagelist->Add(bmp) == -1) )
374 {
375 wxLogWarning("Couldn't load the image '%s' for the notebook page %d.",
376 s_iconNames[n], n);
377 }
378 }
379
380 m_notebook->SetImageList(imagelist);
381 #else
382
383 // No images for now
384 #define Image_List -1
385 #define Image_Choice -1
386 #define Image_Combo -1
387 #define Image_Text -1
388 #define Image_Radio -1
389 #define Image_Gauge -1
390 #define Image_Max -1
391
392 #endif
393
394 wxPanel *panel = new wxPanel(m_notebook);
395 m_listbox = new wxListBox( panel, ID_LISTBOX,
396 wxPoint(10,10), wxSize(120,70),
397 5, choices, wxLB_ALWAYS_SB );
398 m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED,
399 wxPoint(10,90), wxSize(120,70),
400 5, choices, wxLB_SORT );
401
402 SetControlClientData("listbox", m_listbox);
403 SetControlClientData("listbox", m_listboxSorted);
404
405 m_listbox->SetCursor(*wxCROSS_CURSOR);
406 #if wxUSE_TOOLTIPS
407 m_listbox->SetToolTip( "This is a list box" );
408 #endif // wxUSE_TOOLTIPS
409
410 m_lbSelectNum = new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
411 m_lbSelectThis = new wxButton( panel, ID_LISTBOX_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
412 (void)new wxButton( panel, ID_LISTBOX_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
413 (void)new wxButton( panel, ID_LISTBOX_APPEND, "Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
414 (void)new wxButton( panel, ID_LISTBOX_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) );
415 wxButton *button = new wxButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
416 #if wxUSE_TOOLTIPS
417 button->SetToolTip( "Press here to set italic font" );
418 #endif // wxUSE_TOOLTIPS
419
420 m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "&Disable", wxPoint(20,170) );
421 m_checkbox->SetValue(FALSE);
422 #if wxUSE_TOOLTIPS
423 m_checkbox->SetToolTip( "Click here to disable the listbox" );
424 #endif // wxUSE_TOOLTIPS
425 m_notebook->AddPage(panel, "wxListBox", TRUE, Image_List);
426
427 panel = new wxPanel(m_notebook);
428 m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 5, choices );
429 m_choiceSorted = new wxChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,-1),
430 5, choices, wxCB_SORT );
431
432 SetControlClientData("choice", m_choice);
433 SetControlClientData("choice", m_choiceSorted);
434
435 m_choice->SetSelection(2);
436 m_choice->SetBackgroundColour( "red" );
437 (void)new wxButton( panel, ID_CHOICE_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
438 (void)new wxButton( panel, ID_CHOICE_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
439 (void)new wxButton( panel, ID_CHOICE_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
440 (void)new wxButton( panel, ID_CHOICE_APPEND, "Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
441 (void)new wxButton( panel, ID_CHOICE_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) );
442 (void)new wxButton( panel, ID_CHOICE_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
443 (void)new wxCheckBox( panel, ID_CHOICE_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
444
445 m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
446
447 panel = new wxPanel(m_notebook);
448 m_combo = new wxComboBox( panel, ID_COMBO, "This", wxPoint(10,10), wxSize(120,-1), 5, choices, wxCB_READONLY );
449 (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
450 (void)new wxButton( panel, ID_COMBO_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
451 (void)new wxButton( panel, ID_COMBO_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
452 (void)new wxButton( panel, ID_COMBO_APPEND, "Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
453 (void)new wxButton( panel, ID_COMBO_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) );
454 (void)new wxButton( panel, ID_COMBO_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
455 (void)new wxCheckBox( panel, ID_COMBO_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
456 m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
457
458 wxString choices2[] =
459 {
460 "First", "Second",
461 /* "Third",
462 "Fourth", "Fifth", "Sixth",
463 "Seventh", "Eighth", "Nineth", "Tenth" */
464 };
465
466 panel = new wxPanel(m_notebook);
467 (void)new wxRadioBox( panel, ID_RADIOBOX, "That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
468 m_radio = new wxRadioBox( panel, ID_RADIOBOX, "This", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
469 (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
470 (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "Select 'This'", wxPoint(180,80), wxSize(140,30) );
471 m_fontButton = new wxButton( panel, ID_SET_FONT, "Set more Italic font", wxPoint(340,30), wxSize(140,30) );
472 (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set Italic font", wxPoint(340,80), wxSize(140,30) );
473 (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, "Disable", wxPoint(340,130), wxSize(140,30) );
474 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxSize(110,30), wxRB_GROUP );
475 rb->SetValue( FALSE );
476 (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "Radiobutton2", wxPoint(340,170), wxSize(110,30) );
477 m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
478
479 panel = new wxPanel(m_notebook);
480 (void)new wxStaticBox( panel, -1, "wxGauge and wxSlider", wxPoint(10,10), wxSize(200,130) );
481 m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30) );
482 m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1), wxSL_LABELS );
483 (void)new wxStaticBox( panel, -1, "Explanation", wxPoint(220,10), wxSize(270,130) );
484 #ifdef __WXMOTIF__
485 // No wrapping text in wxStaticText yet :-(
486 (void)new wxStaticText( panel, -1,
487 "Drag the slider!",
488 wxPoint(228,30),
489 wxSize(240, -1)
490 );
491 #else
492 (void)new wxStaticText( panel, -1,
493 "In order see the gauge (aka progress bar)\n"
494 "control do something you have to drag the\n"
495 "handle of the slider to the right.\n"
496 "\n"
497 "This is also supposed to demonstrate how\n"
498 "to use static controls.\n",
499 wxPoint(228,25),
500 wxSize(240, 110)
501 );
502 #endif
503 int initialSpinValue = -5;
504 wxString s;
505 s << initialSpinValue;
506 m_spintext = new wxTextCtrl( panel, -1, s, wxPoint(20,160), wxSize(80,-1) );
507 #if wxUSE_SPINBUTTON
508 m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(80, -1) );
509 m_spinbutton->SetRange(-10,30);
510 m_spinbutton->SetValue(initialSpinValue);
511
512 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, "Show progress dialog",
513 wxPoint(300, 160) );
514 #endif // wxUSE_SPINBUTTON
515
516 #if wxUSE_SPINCTRL
517 m_spinctrl = new wxSpinCtrl( panel, -1, wxPoint(200, 160), wxSize(80, -1) );
518 m_spinctrl->SetRange(10,30);
519 m_spinctrl->SetValue(15);
520 #endif // wxUSE_SPINCTRL
521
522 m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
523
524 panel = new wxPanel(m_notebook);
525
526 #ifndef __WXMOTIF__ // wxStaticBitmap not working under Motif yet. MB
527 wxIcon icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
528 wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon, wxPoint(10, 10));
529
530 bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
531 bmpStatic->SetIcon(wxTheApp->GetStdIcon(wxICON_QUESTION));
532 #endif // !Motif
533
534 wxBitmap bitmap( 100, 100 );
535 wxMemoryDC dc;
536 dc.SelectObject( bitmap );
537 dc.SetPen(*wxGREEN_PEN);
538 dc.DrawEllipse(5, 5, 90, 90);
539 dc.DrawText("Bitmap", 20, 20);
540 dc.SelectObject( wxNullBitmap );
541
542 wxBitmapButton *bmpBtn = new wxBitmapButton
543 (
544 panel,
545 -1,
546 bitmap,
547 wxPoint(100, 20)
548 );
549 bmpBtn = NULL; // suppress warning
550
551 new wxButton(panel, -1, "Another button", wxPoint(250, 20));
552
553 m_notebook->AddPage(panel, "wxBitmapXXX");
554
555 // --------------- TEST CODE ----------------------
556
557 // layout constraints
558
559 panel = new wxPanel(m_notebook);
560 panel->SetAutoLayout( true );
561
562 wxLayoutConstraints *c;
563 c = new wxLayoutConstraints;
564 c->top.SameAs( panel, wxTop, 10 );
565 c->height.AsIs( );
566 c->left.SameAs( panel, wxLeft, 10 );
567 c->width.PercentOf( panel, wxWidth, 40 );
568
569 wxButton *pMyButton = new wxButton(panel, -1, "Test Button" );
570 pMyButton->SetConstraints( c );
571
572 c = new wxLayoutConstraints;
573 c->top.SameAs( panel, wxTop, 10 );
574 c->bottom.SameAs( panel, wxBottom, 10 );
575 c->right.SameAs( panel, wxRight, 10 );
576 c->width.PercentOf( panel, wxWidth, 40 );
577
578 wxButton *pMyButton2 = new wxButton(panel, -1, "Test Button 2" );
579 pMyButton2->SetConstraints( c );
580
581 m_notebook->AddPage(panel, "wxLayoutConstraint");
582
583 // sizer
584
585 panel = new wxPanel(m_notebook);
586 panel->SetAutoLayout( true );
587
588 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
589
590 sizer->Add( new wxButton(panel, -1, "Test Button" ), 3, wxALL, 10 );
591 sizer->Add( 20,20, 1 );
592 sizer->Add( new wxButton(panel, -1, "Test Button 2" ), 3, wxGROW|wxALL, 10 );
593
594 panel->SetSizer( sizer );
595
596 m_notebook->AddPage(panel, "wxSizer");
597
598 // --------------- TEST CODE ----------------------
599
600 }
601
602 void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
603 {
604 int x = 0;
605 int y = 0;
606 GetClientSize( &x, &y );
607
608 if (m_notebook) m_notebook->SetSize( 2, 2, x-4, y*2/3-4 );
609 if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 );
610 }
611
612 void MyPanel::OnPageChanging( wxNotebookEvent &event )
613 {
614 int selOld = event.GetOldSelection();
615 if ( selOld == 2 )
616 {
617 if ( wxMessageBox("This demonstrates how a program may prevent the\n"
618 "page change from taking place - if you select\n"
619 "[No] the current page will stay the third one\n",
620 "Control sample",
621 wxICON_QUESTION | wxYES_NO) != wxYES )
622 {
623 event.Veto();
624
625 return;
626 }
627 }
628
629 *m_text << "Notebook selection is being changed from " << selOld << "\n";
630 }
631
632 void MyPanel::OnPageChanged( wxNotebookEvent &event )
633 {
634 *m_text << "Notebook selection is " << event.GetSelection() << "\n";
635 }
636
637 void MyPanel::OnListBox( wxCommandEvent &event )
638 {
639 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
640 : m_listboxSorted;
641
642 m_text->AppendText( "ListBox event selection string is: '" );
643 m_text->AppendText( event.GetString() );
644 m_text->AppendText( "'\n" );
645 m_text->AppendText( "ListBox control selection string is: '" );
646 m_text->AppendText( listbox->GetStringSelection() );
647 m_text->AppendText( "'\n" );
648
649 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
650 m_text->AppendText( "ListBox event client data string is: '" );
651 m_text->AppendText( obj ? obj->GetData() : wxString("none"));
652 m_text->AppendText( "'\n" );
653 m_text->AppendText( "ListBox control client data string is: '" );
654 obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection());
655 m_text->AppendText( obj ? obj->GetData() : wxString("none"));
656 m_text->AppendText( "'\n" );
657 }
658
659 void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
660 {
661 m_text->AppendText( "ListBox double click string is: " );
662 m_text->AppendText( event.GetString() );
663 m_text->AppendText( "\n" );
664 }
665
666 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
667 {
668 switch (event.GetId())
669 {
670 case ID_LISTBOX_ENABLE:
671 {
672 m_text->AppendText("Checkbox clicked.\n");
673 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
674 #if wxUSE_TOOLTIPS
675 if (event.GetInt())
676 cb->SetToolTip( "Click to enable listbox" );
677 else
678 cb->SetToolTip( "Click to disable listbox" );
679 #endif // wxUSE_TOOLTIPS
680 m_listbox->Enable( event.GetInt() == 0 );
681 m_listboxSorted->Enable( event.GetInt() == 0 );
682 break;
683 }
684 case ID_LISTBOX_SEL_NUM:
685 {
686 m_listbox->SetSelection( 2 );
687 m_listboxSorted->SetSelection( 2 );
688 m_lbSelectThis->WarpPointer( 40, 14 );
689 break;
690 }
691 case ID_LISTBOX_SEL_STR:
692 {
693 m_listbox->SetStringSelection( "This" );
694 m_listboxSorted->SetStringSelection( "This" );
695 m_lbSelectNum->WarpPointer( 40, 14 );
696 break;
697 }
698 case ID_LISTBOX_CLEAR:
699 {
700 m_listbox->Clear();
701 m_listboxSorted->Clear();
702 break;
703 }
704 case ID_LISTBOX_APPEND:
705 {
706 m_listbox->Append( "Hi!" );
707 m_listboxSorted->Append( "Hi!" );
708 break;
709 }
710 case ID_LISTBOX_DELETE:
711 {
712 int idx;
713 idx = m_listbox->GetSelection();
714 m_listbox->Delete( idx );
715 idx = m_listboxSorted->GetSelection();
716 m_listboxSorted->Delete( idx );
717 break;
718 }
719 case ID_LISTBOX_FONT:
720 {
721 m_listbox->SetFont( *wxITALIC_FONT );
722 m_listboxSorted->SetFont( *wxITALIC_FONT );
723 m_checkbox->SetFont( *wxITALIC_FONT );
724 break;
725 }
726 }
727 }
728
729 void MyPanel::OnChoice( wxCommandEvent &event )
730 {
731 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
732 : m_choiceSorted;
733
734 m_text->AppendText( "Choice event selection string is: '" );
735 m_text->AppendText( event.GetString() );
736 m_text->AppendText( "'\n" );
737 m_text->AppendText( "Choice control selection string is: '" );
738 m_text->AppendText( choice->GetStringSelection() );
739 m_text->AppendText( "'\n" );
740
741 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
742 m_text->AppendText( "Choice event client data string is: '" );
743 m_text->AppendText( obj ? obj->GetData() : wxString("none"));
744 m_text->AppendText( "'\n" );
745 m_text->AppendText( "Choice control client data string is: '" );
746 obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection());
747 m_text->AppendText( obj ? obj->GetData() : wxString("none"));
748 m_text->AppendText( "'\n" );
749 }
750
751 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
752 {
753 switch (event.GetId())
754 {
755 case ID_CHOICE_ENABLE:
756 {
757 m_choice->Enable( event.GetInt() == 0 );
758 m_choiceSorted->Enable( event.GetInt() == 0 );
759 break;
760 }
761 case ID_CHOICE_SEL_NUM:
762 {
763 m_choice->SetSelection( 2 );
764 m_choiceSorted->SetSelection( 2 );
765 break;
766 }
767 case ID_CHOICE_SEL_STR:
768 {
769 m_choice->SetStringSelection( "This" );
770 m_choiceSorted->SetStringSelection( "This" );
771 break;
772 }
773 case ID_CHOICE_CLEAR:
774 {
775 m_choice->Clear();
776 m_choiceSorted->Clear();
777 break;
778 }
779 case ID_CHOICE_APPEND:
780 {
781 m_choice->Append( "Hi!" );
782 m_choiceSorted->Append( "Hi!" );
783 break;
784 }
785 case ID_CHOICE_DELETE:
786 {
787 int idx = m_choice->GetSelection();
788 m_choice->Delete( idx );
789 idx = m_choiceSorted->GetSelection();
790 m_choiceSorted->Delete( idx );
791 break;
792 }
793 case ID_CHOICE_FONT:
794 {
795 m_choice->SetFont( *wxITALIC_FONT );
796 m_choiceSorted->SetFont( *wxITALIC_FONT );
797 break;
798 }
799 }
800 }
801
802 void MyPanel::OnCombo( wxCommandEvent &event )
803 {
804 m_text->AppendText( "ComboBox event selection string is: " );
805 m_text->AppendText( event.GetString() );
806 m_text->AppendText( "\n" );
807 m_text->AppendText( "ComboBox control selection string is: " );
808 m_text->AppendText( m_combo->GetStringSelection() );
809 m_text->AppendText( "\n" );
810 }
811
812 void MyPanel::OnComboButtons( wxCommandEvent &event )
813 {
814 switch (event.GetId())
815 {
816 case ID_COMBO_ENABLE:
817 {
818 m_combo->Enable( event.GetInt() == 0 );
819 break;
820 }
821 case ID_COMBO_SEL_NUM:
822 {
823 m_combo->SetSelection( 2 );
824 break;
825 }
826 case ID_COMBO_SEL_STR:
827 {
828 m_combo->SetStringSelection( "This" );
829 break;
830 }
831 case ID_COMBO_CLEAR:
832 {
833 m_combo->Clear();
834 break;
835 }
836 case ID_COMBO_APPEND:
837 {
838 m_combo->Append( "Hi!" );
839 break;
840 }
841 case ID_COMBO_DELETE:
842 {
843 int idx = m_combo->GetSelection();
844 m_combo->Delete( idx );
845 break;
846 }
847 case ID_COMBO_FONT:
848 {
849 m_combo->SetFont( *wxITALIC_FONT );
850 break;
851 }
852 }
853 }
854
855 void MyPanel::OnRadio( wxCommandEvent &event )
856 {
857 m_text->AppendText( "RadioBox selection string is: " );
858 m_text->AppendText( event.GetString() );
859 m_text->AppendText( "\n" );
860 }
861
862 void MyPanel::OnRadioButtons( wxCommandEvent &event )
863 {
864 switch (event.GetId())
865 {
866 case ID_RADIOBOX_ENABLE:
867 {
868 m_radio->Enable( event.GetInt() == 0 );
869 break;
870 }
871 case ID_RADIOBOX_SEL_NUM:
872 {
873 m_radio->SetSelection( 2 );
874 break;
875 }
876 case ID_RADIOBOX_SEL_STR:
877 {
878 m_radio->SetStringSelection( "This" );
879 break;
880 }
881 case ID_RADIOBOX_FONT:
882 {
883 m_radio->SetFont( *wxITALIC_FONT );
884 break;
885 }
886 }
887 }
888
889 void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
890 {
891 m_fontButton->SetFont( *wxITALIC_FONT );
892 m_text->SetFont( *wxITALIC_FONT );
893 }
894
895 void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
896 {
897 m_gauge->SetValue( m_slider->GetValue() );
898 }
899
900 #if wxUSE_SPINBUTTON
901 void MyPanel::OnSpinUp( wxSpinEvent &event )
902 {
903 wxString value;
904 value.Printf( _T("Spin control up: current = %d\n"),
905 m_spinbutton->GetValue());
906
907 if ( m_spinbutton->GetValue() > 17 )
908 {
909 value += _T("Preventing the spin button from going above 17.\n");
910
911 event.Veto();
912 }
913
914 m_text->AppendText(value);
915 }
916
917 void MyPanel::OnSpinDown( wxSpinEvent &event )
918 {
919 wxString value;
920 value.Printf( _T("Spin control down: current = %d\n"),
921 m_spinbutton->GetValue());
922
923 if ( m_spinbutton->GetValue() < -17 )
924 {
925 value += _T("Preventing the spin button from going below -17.\n");
926
927 event.Veto();
928 }
929
930 m_text->AppendText(value);
931 }
932
933 void MyPanel::OnSpinUpdate( wxSpinEvent &event )
934 {
935 wxString value;
936 value.Printf( _T("%d"), event.GetPosition() );
937 m_spintext->SetValue( value );
938
939 value.Printf( _T("Spin control range: (%d, %d), current = %d\n"),
940 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
941 m_spinbutton->GetValue());
942
943 m_text->AppendText(value);
944 }
945
946 void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
947 {
948 event.Enable( m_spinbutton->GetValue() > 0 );
949 }
950
951 void MyPanel::OnShowProgress( wxCommandEvent& WXUNUSED(event) )
952 {
953 int max = m_spinbutton->GetValue();
954 wxProgressDialog dialog("Progress dialog example",
955 "An informative message",
956 max, // range
957 this, // parent
958 wxPD_CAN_ABORT |
959 wxPD_APP_MODAL |
960 wxPD_ELAPSED_TIME |
961 wxPD_ESTIMATED_TIME |
962 wxPD_REMAINING_TIME);
963
964
965 bool cont = TRUE;
966 for ( int i = 0; i < max && cont; i++ )
967 {
968 wxSleep(1);
969 if ( i == max - 1 )
970 {
971 cont = dialog.Update(i, "That's all, folks!");
972 }
973 else if ( i == max / 2 )
974 {
975 cont = dialog.Update(i, "Only a half left!");
976 }
977 else
978 {
979 cont = dialog.Update(i);
980 }
981 }
982
983 if ( !cont )
984 {
985 *m_text << "Progress dialog aborted!\n";
986 }
987 else
988 {
989 *m_text << "Countdown from " << max << " finished.\n";
990 }
991 }
992
993 #endif // wxUSE_SPINBUTTON
994
995 MyPanel::~MyPanel()
996 {
997 delete m_notebook->GetImageList();
998 }
999
1000 //----------------------------------------------------------------------
1001 // MyFrame
1002 //----------------------------------------------------------------------
1003
1004 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1005 EVT_MENU(MINIMAL_QUIT, MyFrame::OnQuit)
1006 EVT_MENU(MINIMAL_ABOUT, MyFrame::OnAbout)
1007 #if wxUSE_TOOLTIPS
1008 EVT_MENU(MINIMAL_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1009 EVT_MENU(MINIMAL_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
1010 #endif // wxUSE_TOOLTIPS
1011 EVT_SIZE(MyFrame::OnSize)
1012 EVT_IDLE(MyFrame::OnIdle)
1013 END_EVENT_TABLE()
1014
1015 MyFrame::MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
1016 : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
1017 {
1018 CreateStatusBar(2);
1019
1020 (void)new MyPanel( this, 10, 10, 300, 100 );
1021 }
1022
1023 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1024 {
1025 Close(TRUE);
1026 }
1027
1028 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1029 {
1030 wxBeginBusyCursor();
1031
1032 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1033 dialog.ShowModal();
1034
1035 wxEndBusyCursor();
1036 }
1037
1038 #if wxUSE_TOOLTIPS
1039 void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1040 {
1041 static long s_delay = 5000;
1042
1043 wxString delay;
1044 delay.Printf( _T("%ld"), s_delay);
1045
1046 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
1047 "Set tooltip delay",
1048 delay,
1049 this);
1050 if ( !delay )
1051 return; // cancelled
1052
1053 wxSscanf(delay, _T("%ld"), &s_delay);
1054
1055 wxToolTip::SetDelay(s_delay);
1056
1057 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
1058 }
1059
1060 void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1061 {
1062 static bool s_enabled = TRUE;
1063
1064 s_enabled = !s_enabled;
1065
1066 wxToolTip::Enable(s_enabled);
1067
1068 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
1069 }
1070 #endif // tooltips
1071
1072 void MyFrame::OnSize( wxSizeEvent& event )
1073 {
1074 wxString msg;
1075 msg.Printf( _("%dx%d"), event.GetSize().x, event.GetSize().y);
1076 SetStatusText(msg, 1);
1077
1078 event.Skip();
1079 }
1080
1081 void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
1082 {
1083 // track the window which has the focus in the status bar
1084 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1085 wxWindow *focus = wxWindow::FindFocus();
1086 if ( focus && (focus != s_windowFocus) )
1087 {
1088 s_windowFocus = focus;
1089
1090 wxString msg;
1091 msg.Printf(
1092 #ifdef __WXMSW__
1093 _T("Focus: wxWindow = %p, HWND = %08x"),
1094 #else
1095 _T("Focus: wxWindow = %p"),
1096 #endif
1097 s_windowFocus
1098 #ifdef __WXMSW__
1099 , s_windowFocus->GetHWND()
1100 #endif
1101 );
1102
1103 SetStatusText(msg);
1104 }
1105 }
1106
1107 static void SetControlClientData(const char *name,
1108 wxControlWithItems *control)
1109 {
1110 size_t count = control->GetCount();
1111 for ( size_t n = 0; n < count; n++ )
1112 {
1113 wxString s;
1114 s.Printf("%s client data for '%s'",
1115 name, control->GetString(n).c_str());
1116
1117 control->SetClientObject(n, new wxStringClientData(s));
1118 }
1119 }