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