1 /////////////////////////////////////////////////////////////////////////////
2 // Program:     wxWidgets Widgets Sample
3 // Name:        combobox.cpp
4 // Purpose:     Part of the widgets sample showing wxComboBox
5 // Author:      Vadim Zeitlin
6 // Created:     27.03.01
7 // Copyright:   (c) 2001 Vadim Zeitlin
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 // ============================================================================
12 // declarations
13 // ============================================================================
14 
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18 
19 // for compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
21 
22 
23 #if wxUSE_COMBOBOX
24 
25 // for all others, include the necessary headers
26 #ifndef WX_PRECOMP
27     #include "wx/log.h"
28 
29     #include "wx/bitmap.h"
30     #include "wx/button.h"
31     #include "wx/checkbox.h"
32     #include "wx/combobox.h"
33     #include "wx/radiobox.h"
34     #include "wx/statbox.h"
35     #include "wx/textctrl.h"
36 #endif
37 
38 #include "wx/sizer.h"
39 
40 #include "itemcontainer.h"
41 #include "widgets.h"
42 #include "icons/combobox.xpm"
43 
44 // ----------------------------------------------------------------------------
45 // constants
46 // ----------------------------------------------------------------------------
47 
48 // control ids
49 enum
50 {
51     ComboPage_Reset = wxID_HIGHEST,
52     ComboPage_Popup,
53     ComboPage_Dismiss,
54     ComboPage_SetCurrent,
55     ComboPage_CurText,
56     ComboPage_InsertionPointText,
57     ComboPage_Insert,
58     ComboPage_InsertText,
59     ComboPage_Add,
60     ComboPage_AddText,
61     ComboPage_SetFirst,
62     ComboPage_SetFirstText,
63     ComboPage_AddSeveral,
64     ComboPage_AddMany,
65     ComboPage_Clear,
66     ComboPage_Change,
67     ComboPage_ChangeText,
68     ComboPage_Delete,
69     ComboPage_DeleteText,
70     ComboPage_DeleteSel,
71     ComboPage_SetValue,
72     ComboPage_SetValueText,
73     ComboPage_Combo,
74     ComboPage_ContainerTests,
75     ComboPage_Dynamic
76 };
77 
78 // kinds of comboboxes
79 enum
80 {
81     ComboKind_Default,
82     ComboKind_Simple,
83     ComboKind_DropDown
84 };
85 
86 // ----------------------------------------------------------------------------
87 // ComboboxWidgetsPage
88 // ----------------------------------------------------------------------------
89 
90 class ComboboxWidgetsPage : public ItemContainerWidgetsPage
91 {
92 public:
93     ComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
94 
GetWidget() const95     virtual wxWindow *GetWidget() const wxOVERRIDE { return m_combobox; }
GetTextEntry() const96     virtual wxTextEntryBase *GetTextEntry() const wxOVERRIDE { return m_combobox; }
GetContainer() const97     virtual wxItemContainer* GetContainer() const wxOVERRIDE { return m_combobox; }
RecreateWidget()98     virtual void RecreateWidget() wxOVERRIDE { CreateCombo(); }
99 
100     // lazy creation of the content
101     virtual void CreateContent() wxOVERRIDE;
102 
103 protected:
104     // event handlers
105     void OnButtonReset(wxCommandEvent& event);
OnButtonPopup(wxCommandEvent &)106     void OnButtonPopup(wxCommandEvent&) { m_combobox->Popup(); }
OnButtonDismiss(wxCommandEvent &)107     void OnButtonDismiss(wxCommandEvent&) { m_combobox->Dismiss(); }
108     void OnButtonChange(wxCommandEvent& event);
109     void OnButtonDelete(wxCommandEvent& event);
110     void OnButtonDeleteSel(wxCommandEvent& event);
111     void OnButtonClear(wxCommandEvent& event);
112     void OnButtonInsert(wxCommandEvent &event);
113     void OnButtonAdd(wxCommandEvent& event);
114     void OnButtonSetFirst(wxCommandEvent& event);
115     void OnButtonAddSeveral(wxCommandEvent& event);
116     void OnButtonAddMany(wxCommandEvent& event);
117     void OnButtonSetValue(wxCommandEvent& event);
118     void OnButtonSetCurrent(wxCommandEvent& event);
119 
120     void OnDropdown(wxCommandEvent& event);
121     void OnCloseup(wxCommandEvent& event);
122     void OnPopup(wxCommandEvent &event);
123     void OnDismiss(wxCommandEvent &event);
124     void OnComboBox(wxCommandEvent& event);
125     void OnComboText(wxCommandEvent& event);
126     void OnComboTextPasted(wxClipboardTextEvent& event);
127 
128     void OnCheckOrRadioBox(wxCommandEvent& event);
129 
130     void OnUpdateUIInsertionPointText(wxUpdateUIEvent& event);
131 
132     void OnUpdateUIInsert(wxUpdateUIEvent& event);
133     void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
134     void OnUpdateUIClearButton(wxUpdateUIEvent& event);
135     void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
136     void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
137     void OnUpdateUIResetButton(wxUpdateUIEvent& event);
138     void OnUpdateUISetCurrent(wxUpdateUIEvent& event);
139 
140     // reset the combobox parameters
141     void Reset();
142 
143     // (re)create the combobox
144     void CreateCombo();
145 
146     // the controls
147     // ------------
148 
149     // the sel mode radiobox
150     wxRadioBox *m_radioKind;
151 
152     // the checkboxes for styles
153     wxCheckBox *m_chkSort,
154                *m_chkReadonly,
155                *m_chkProcessEnter;
156 
157     // the combobox itself and the sizer it is in
158     wxComboBox *m_combobox, *m_combobox1;
159     wxSizer *m_sizerCombo;
160 
161     // the text entries for "Add/change string" and "Delete" buttons
162     wxTextCtrl *m_textInsert,
163                *m_textAdd,
164                *m_textSetFirst,
165                *m_textChange,
166                *m_textSetValue,
167                *m_textDelete,
168                *m_textCur;
169 
170 private:
171     wxDECLARE_EVENT_TABLE();
172     DECLARE_WIDGETS_PAGE(ComboboxWidgetsPage)
173 };
174 
175 // ----------------------------------------------------------------------------
176 // event tables
177 // ----------------------------------------------------------------------------
178 
179 wxBEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage)
180     EVT_BUTTON(ComboPage_Reset, ComboboxWidgetsPage::OnButtonReset)
181     EVT_BUTTON(ComboPage_Popup, ComboboxWidgetsPage::OnButtonPopup)
182     EVT_BUTTON(ComboPage_Dismiss, ComboboxWidgetsPage::OnButtonDismiss)
183     EVT_BUTTON(ComboPage_Change, ComboboxWidgetsPage::OnButtonChange)
184     EVT_BUTTON(ComboPage_Delete, ComboboxWidgetsPage::OnButtonDelete)
185     EVT_BUTTON(ComboPage_DeleteSel, ComboboxWidgetsPage::OnButtonDeleteSel)
186     EVT_BUTTON(ComboPage_Clear, ComboboxWidgetsPage::OnButtonClear)
187     EVT_BUTTON(ComboPage_Insert, ComboboxWidgetsPage::OnButtonInsert)
188     EVT_BUTTON(ComboPage_Add, ComboboxWidgetsPage::OnButtonAdd)
189     EVT_BUTTON(ComboPage_SetFirst, ComboboxWidgetsPage::OnButtonSetFirst)
190     EVT_BUTTON(ComboPage_AddSeveral, ComboboxWidgetsPage::OnButtonAddSeveral)
191     EVT_BUTTON(ComboPage_AddMany, ComboboxWidgetsPage::OnButtonAddMany)
192     EVT_BUTTON(ComboPage_SetValue, ComboboxWidgetsPage::OnButtonSetValue)
193     EVT_BUTTON(ComboPage_SetCurrent, ComboboxWidgetsPage::OnButtonSetCurrent)
194     EVT_BUTTON(ComboPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
195 
196     EVT_TEXT_ENTER(ComboPage_InsertText, ComboboxWidgetsPage::OnButtonInsert)
197     EVT_TEXT_ENTER(ComboPage_AddText, ComboboxWidgetsPage::OnButtonAdd)
198     EVT_TEXT_ENTER(ComboPage_DeleteText, ComboboxWidgetsPage::OnButtonDelete)
199 
200     EVT_UPDATE_UI(ComboPage_InsertionPointText, ComboboxWidgetsPage::OnUpdateUIInsertionPointText)
201 
202     EVT_UPDATE_UI(ComboPage_Reset, ComboboxWidgetsPage::OnUpdateUIResetButton)
203     EVT_UPDATE_UI(ComboPage_Insert, ComboboxWidgetsPage::OnUpdateUIInsert)
204     EVT_UPDATE_UI(ComboPage_AddSeveral, ComboboxWidgetsPage::OnUpdateUIAddSeveral)
205     EVT_UPDATE_UI(ComboPage_Clear, ComboboxWidgetsPage::OnUpdateUIClearButton)
206     EVT_UPDATE_UI(ComboPage_DeleteText, ComboboxWidgetsPage::OnUpdateUIClearButton)
207     EVT_UPDATE_UI(ComboPage_Delete, ComboboxWidgetsPage::OnUpdateUIDeleteButton)
208     EVT_UPDATE_UI(ComboPage_Change, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
209     EVT_UPDATE_UI(ComboPage_ChangeText, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
210     EVT_UPDATE_UI(ComboPage_DeleteSel, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
211     EVT_UPDATE_UI(ComboPage_SetCurrent, ComboboxWidgetsPage::OnUpdateUISetCurrent)
212 
213     EVT_COMBOBOX(ComboPage_Combo, ComboboxWidgetsPage::OnComboBox)
214     EVT_COMBOBOX_DROPDOWN(ComboPage_Combo, ComboboxWidgetsPage::OnDropdown)
215     EVT_COMBOBOX_CLOSEUP(ComboPage_Combo, ComboboxWidgetsPage::OnCloseup)
216     EVT_TEXT(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
217     EVT_TEXT_ENTER(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
218     EVT_TEXT_PASTE(ComboPage_Combo, ComboboxWidgetsPage::OnComboTextPasted)
219 
220     EVT_CHECKBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
221     EVT_RADIOBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
222 wxEND_EVENT_TABLE()
223 
224 // ============================================================================
225 // implementation
226 // ============================================================================
227 
228 #if defined(__WXUNIVERSAL__)
229     #define FAMILY_CTRLS UNIVERSAL_CTRLS
230 #else
231     #define FAMILY_CTRLS NATIVE_CTRLS
232 #endif
233 
234 IMPLEMENT_WIDGETS_PAGE(ComboboxWidgetsPage, "Combobox",
235                        FAMILY_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS
236                        );
237 
ComboboxWidgetsPage(WidgetsBookCtrl * book,wxImageList * imaglist)238 ComboboxWidgetsPage::ComboboxWidgetsPage(WidgetsBookCtrl *book,
239                                          wxImageList *imaglist)
240                   : ItemContainerWidgetsPage(book, imaglist, combobox_xpm)
241 {
242     // init everything
243     m_chkSort =
244     m_chkReadonly =
245     m_chkProcessEnter = (wxCheckBox *)NULL;
246 
247     m_combobox = (wxComboBox *)NULL;
248     m_sizerCombo = (wxSizer *)NULL;
249 }
250 
CreateContent()251 void ComboboxWidgetsPage::CreateContent()
252 {
253     /*
254        What we create here is a frame having 3 panes: style pane is the
255        leftmost one, in the middle the pane with buttons allowing to perform
256        miscellaneous combobox operations and the pane containing the combobox
257        itself to the right
258     */
259     wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
260 
261     // upper left pane
262 
263     // should be in sync with ComboKind_XXX values
264     static const wxString kinds[] =
265     {
266         "default",
267         "simple",
268         "drop down",
269     };
270 
271     m_radioKind = new wxRadioBox(this, wxID_ANY, "Combobox &kind:",
272                                  wxDefaultPosition, wxDefaultSize,
273                                  WXSIZEOF(kinds), kinds,
274                                  1, wxRA_SPECIFY_COLS);
275 
276     wxSizer *sizerLeftTop = new wxStaticBoxSizer(wxVERTICAL, this, "&Set style");
277 
278     m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeftTop, "&Sort items");
279     m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeftTop, "&Read only");
280     m_chkProcessEnter = CreateCheckBoxAndAddToSizer(sizerLeftTop, "Process &Enter");
281 
282     sizerLeftTop->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
283     sizerLeftTop->Add(m_radioKind, 0, wxGROW | wxALL, 5);
284 
285     wxButton *btn = new wxButton(this, ComboPage_Reset, "&Reset");
286     sizerLeftTop->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
287 
288     // lower left pane
289     wxSizer *sizerLeftBottom = new wxStaticBoxSizer(wxVERTICAL, this, "&Popup");
290     sizerLeftBottom->Add(new wxButton(this, ComboPage_Popup, "&Show"),
291                          wxSizerFlags().Border().Centre());
292     sizerLeftBottom->Add(new wxButton(this, ComboPage_Dismiss, "&Hide"),
293                          wxSizerFlags().Border().Centre());
294 
295 
296     wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
297     sizerLeft->Add(sizerLeftTop);
298     sizerLeft->AddSpacer(10);
299     sizerLeft->Add(sizerLeftBottom, wxSizerFlags().Expand());
300 
301     // middle pane
302     wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,
303         "&Change combobox contents");
304     wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
305 
306     wxSizer *sizerRow;
307 
308     sizerRow = CreateSizerWithTextAndButton(ComboPage_SetCurrent,
309                                             "Current &selection",
310                                             ComboPage_CurText,
311                                             &m_textCur);
312 
313     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
314 
315     wxTextCtrl *text;
316     sizerRow = CreateSizerWithTextAndLabel("Insertion Point",
317                                            ComboPage_InsertionPointText,
318                                            &text);
319     text->SetEditable(false);
320 
321     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
322 
323     sizerRow = CreateSizerWithTextAndButton(ComboPage_Insert,
324                                             "&Insert this string",
325                                             ComboPage_InsertText,
326                                             &m_textInsert);
327     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
328 
329     sizerRow = CreateSizerWithTextAndButton(ComboPage_Add,
330                                             "&Add this string",
331                                             ComboPage_AddText,
332                                             &m_textAdd);
333     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
334 
335     sizerRow = CreateSizerWithTextAndButton(ComboPage_SetFirst,
336                                             "Change &1st string",
337                                             ComboPage_SetFirstText,
338                                             &m_textSetFirst);
339     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
340 
341     btn = new wxButton(this, ComboPage_AddSeveral, "&Append a few strings");
342     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
343 
344     btn = new wxButton(this, ComboPage_AddMany, "Append &many strings");
345     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
346 
347     sizerRow = CreateSizerWithTextAndButton(ComboPage_Change,
348                                             "C&hange current",
349                                             ComboPage_ChangeText,
350                                             &m_textChange);
351     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
352 
353     sizerRow = CreateSizerWithTextAndButton(ComboPage_Delete,
354                                             "&Delete this item",
355                                             ComboPage_DeleteText,
356                                             &m_textDelete);
357     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
358 
359     btn = new wxButton(this, ComboPage_DeleteSel, "Delete &selection");
360     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
361 
362     btn = new wxButton(this, ComboPage_Clear, "&Clear");
363     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
364 
365     sizerRow = CreateSizerWithTextAndButton(ComboPage_SetValue,
366                                             "SetValue",
367                                             ComboPage_SetValueText,
368                                             &m_textSetValue);
369     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
370 
371     btn = new wxButton(this, ComboPage_ContainerTests, "Run &tests");
372     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
373 
374 
375 
376     // right pane
377     wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
378     m_combobox = new wxComboBox(this, ComboPage_Combo, wxEmptyString,
379                                 wxDefaultPosition, wxDefaultSize,
380                                 0, NULL,
381                                 0);
382     sizerRight->Add(m_combobox, 0, wxGROW | wxALL, 5);
383     m_combobox1 = new wxComboBox( this, ComboPage_Dynamic );
384     m_combobox1->Append( "Dynamic ComboBox Test - Click me!" );
385     m_combobox1->SetSelection( 0 );
386     sizerRight->Add( 20, 20, 0, wxEXPAND, 0 );
387     sizerRight->Add( m_combobox1, 0, wxGROW | wxALL, 5 );
388     m_combobox1->Bind( wxEVT_COMBOBOX_DROPDOWN, &ComboboxWidgetsPage::OnPopup, this );
389     m_combobox1->Bind( wxEVT_COMBOBOX_CLOSEUP, &ComboboxWidgetsPage::OnDismiss, this );
390     sizerRight->SetMinSize(150, 0);
391     m_sizerCombo = sizerRight; // save it to modify it later
392 
393     // the 3 panes panes compose the window
394     sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
395     sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
396     sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
397 
398     // final initializations
399     Reset();
400 
401     SetSizer(sizerTop);
402 }
403 
404 // ----------------------------------------------------------------------------
405 // operations
406 // ----------------------------------------------------------------------------
407 
Reset()408 void ComboboxWidgetsPage::Reset()
409 {
410     m_chkSort->SetValue(false);
411     m_chkReadonly->SetValue(false);
412     m_chkProcessEnter->SetValue(false);
413 }
414 
CreateCombo()415 void ComboboxWidgetsPage::CreateCombo()
416 {
417     wxCHECK_RET( m_combobox, "No combo box exists" );
418 
419     int flags = GetAttrs().m_defaultFlags;
420 
421     if ( m_chkSort->GetValue() )
422         flags |= wxCB_SORT;
423     if ( m_chkReadonly->GetValue() )
424         flags |= wxCB_READONLY;
425     if ( m_chkProcessEnter->GetValue() )
426         flags |= wxTE_PROCESS_ENTER;
427 
428 
429     switch ( m_radioKind->GetSelection() )
430     {
431         default:
432             wxFAIL_MSG( "unknown combo kind" );
433             wxFALLTHROUGH;
434 
435         case ComboKind_Default:
436             break;
437 
438         case ComboKind_Simple:
439             flags |= wxCB_SIMPLE;
440             break;
441 
442         case ComboKind_DropDown:
443             flags |= wxCB_DROPDOWN;
444             break;
445     }
446 
447     wxArrayString items;
448     unsigned int count = m_combobox->GetCount();
449     for ( unsigned int n = 0; n < count; n++ )
450     {
451          items.Add(m_combobox->GetString(n));
452     }
453     int selItem  = m_combobox->GetSelection();
454 
455     wxComboBox* newCb = new wxComboBox(this, wxID_ANY, wxEmptyString,
456                                 wxDefaultPosition, wxDefaultSize,
457                                 items,
458                                 flags);
459 
460     if ( selItem != wxNOT_FOUND )
461         newCb->SetSelection(selItem);
462 
463     m_sizerCombo->Replace(m_combobox, newCb);
464     m_sizerCombo->Layout();
465 
466     delete m_combobox;
467     m_combobox = newCb;
468     m_combobox->SetId(ComboPage_Combo);
469 }
470 
471 // ----------------------------------------------------------------------------
472 // event handlers
473 // ----------------------------------------------------------------------------
474 
OnButtonReset(wxCommandEvent & WXUNUSED (event))475 void ComboboxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
476 {
477     Reset();
478 
479     CreateCombo();
480 }
481 
OnButtonChange(wxCommandEvent & WXUNUSED (event))482 void ComboboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
483 {
484     int sel = m_combobox->GetSelection();
485     if ( sel != wxNOT_FOUND )
486     {
487         m_combobox->SetString(sel, m_textChange->GetValue());
488     }
489 }
490 
OnButtonDelete(wxCommandEvent & WXUNUSED (event))491 void ComboboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
492 {
493     unsigned long n;
494     if ( !m_textDelete->GetValue().ToULong(&n) ||
495             (n >= m_combobox->GetCount()) )
496     {
497         return;
498     }
499 
500     m_combobox->Delete(n);
501 }
502 
OnButtonDeleteSel(wxCommandEvent & WXUNUSED (event))503 void ComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
504 {
505     int sel = m_combobox->GetSelection();
506     if ( sel != wxNOT_FOUND )
507     {
508         m_combobox->Delete(sel);
509     }
510 }
511 
OnButtonSetValue(wxCommandEvent & WXUNUSED (event))512 void ComboboxWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event))
513 {
514     wxString value = m_textSetValue->GetValue();
515     m_combobox->SetValue( value );
516 }
517 
OnButtonClear(wxCommandEvent & WXUNUSED (event))518 void ComboboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
519 {
520     m_combobox->Clear();
521 }
522 
OnButtonInsert(wxCommandEvent & WXUNUSED (event))523 void ComboboxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
524 {
525     static unsigned int s_item = 0;
526 
527     wxString s = m_textInsert->GetValue();
528     if ( !m_textInsert->IsModified() )
529     {
530         // update the default string
531         m_textInsert->SetValue(wxString::Format("test item %u", ++s_item));
532     }
533 
534     if (m_combobox->GetSelection() >= 0)
535         m_combobox->Insert(s, m_combobox->GetSelection());
536 }
537 
OnButtonAdd(wxCommandEvent & WXUNUSED (event))538 void ComboboxWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
539 {
540     static unsigned int s_item = 0;
541 
542     wxString s = m_textAdd->GetValue();
543     if ( !m_textAdd->IsModified() )
544     {
545         // update the default string
546         m_textAdd->SetValue(wxString::Format("test item %u", ++s_item));
547     }
548 
549     m_combobox->Append(s);
550 }
551 
OnButtonSetFirst(wxCommandEvent & WXUNUSED (event))552 void ComboboxWidgetsPage::OnButtonSetFirst(wxCommandEvent& WXUNUSED(event))
553 {
554     if ( m_combobox->IsListEmpty() )
555     {
556         wxLogWarning("No string to change.");
557         return;
558     }
559 
560     m_combobox->SetString(0, m_textSetFirst->GetValue());
561 }
562 
OnButtonAddMany(wxCommandEvent & WXUNUSED (event))563 void ComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
564 {
565     // "many" means 1000 here
566     for ( unsigned int n = 0; n < 1000; n++ )
567     {
568         m_combobox->Append(wxString::Format("item #%u", n));
569     }
570 }
571 
OnButtonSetCurrent(wxCommandEvent & WXUNUSED (event))572 void ComboboxWidgetsPage::OnButtonSetCurrent(wxCommandEvent& WXUNUSED(event))
573 {
574     long n;
575     if ( !m_textCur->GetValue().ToLong(&n) )
576         return;
577 
578     m_combobox->SetSelection(n);
579 }
580 
OnButtonAddSeveral(wxCommandEvent & WXUNUSED (event))581 void ComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
582 {
583     m_combobox->Append("First");
584     m_combobox->Append("another one");
585     m_combobox->Append("and the last (very very very very very very very very very very long) one");
586 }
587 
OnUpdateUIInsertionPointText(wxUpdateUIEvent & event)588 void ComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent& event)
589 {
590     if (m_combobox)
591         event.SetText( wxString::Format("%ld", m_combobox->GetInsertionPoint()) );
592 }
593 
OnUpdateUIResetButton(wxUpdateUIEvent & event)594 void ComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
595 {
596     event.Enable( m_chkSort->GetValue() ||
597                     m_chkReadonly->GetValue() ||
598                         m_chkProcessEnter->GetValue() );
599 }
600 
OnUpdateUIInsert(wxUpdateUIEvent & event)601 void ComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent& event)
602 {
603     if (m_combobox)
604     {
605         bool enable = !(m_combobox->GetWindowStyle() & wxCB_SORT) &&
606                        (m_combobox->GetSelection() >= 0);
607 
608         event.Enable(enable);
609     }
610 }
611 
OnUpdateUIDeleteButton(wxUpdateUIEvent & event)612 void ComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
613 {
614     if (m_combobox)
615     {
616       unsigned long n;
617       event.Enable(m_textDelete->GetValue().ToULong(&n) &&
618         (n < (unsigned)m_combobox->GetCount()));
619     }
620 }
621 
OnUpdateUIDeleteSelButton(wxUpdateUIEvent & event)622 void ComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
623 {
624     if (m_combobox)
625         event.Enable(m_combobox->GetSelection() != wxNOT_FOUND);
626 }
627 
OnUpdateUIClearButton(wxUpdateUIEvent & event)628 void ComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
629 {
630     if (m_combobox)
631         event.Enable(m_combobox->GetCount() != 0);
632 }
633 
OnUpdateUIAddSeveral(wxUpdateUIEvent & event)634 void ComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
635 {
636     if (m_combobox)
637         event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
638 }
639 
OnUpdateUISetCurrent(wxUpdateUIEvent & event)640 void ComboboxWidgetsPage::OnUpdateUISetCurrent(wxUpdateUIEvent& event)
641 {
642     long n;
643     event.Enable( m_textCur->GetValue().ToLong(&n) &&
644                     (n == wxNOT_FOUND ||
645                         (n >= 0 && (unsigned)n < m_combobox->GetCount())) );
646 }
647 
OnComboText(wxCommandEvent & event)648 void ComboboxWidgetsPage::OnComboText(wxCommandEvent& event)
649 {
650     if (!m_combobox)
651         return;
652 
653     wxString s = event.GetString();
654 
655     wxASSERT_MSG( s == m_combobox->GetValue(),
656                   "event and combobox values should be the same" );
657 
658     if (event.GetEventType() == wxEVT_TEXT_ENTER)
659     {
660         wxLogMessage("Combobox enter pressed (now '%s')", s);
661     }
662     else
663     {
664         wxLogMessage("Combobox text changed (now '%s')", s);
665     }
666 }
667 
OnComboTextPasted(wxClipboardTextEvent & event)668 void ComboboxWidgetsPage::OnComboTextPasted(wxClipboardTextEvent& event)
669 {
670     wxLogMessage("Text pasted from clipboard.");
671     event.Skip();
672 }
673 
OnComboBox(wxCommandEvent & event)674 void ComboboxWidgetsPage::OnComboBox(wxCommandEvent& event)
675 {
676     long sel = event.GetInt();
677     const wxString selstr = wxString::Format("%ld", sel);
678     m_textDelete->SetValue(selstr);
679     m_textCur->SetValue(selstr);
680 
681     wxLogMessage("Combobox item %ld selected", sel);
682 
683     wxLogMessage("Combobox GetValue(): %s", m_combobox->GetValue() );
684 
685     if ( event.GetString() != m_combobox->GetValue() )
686     {
687         wxLogMessage("ERROR: Event has different string \"%s\"",
688                      event.GetString());
689     }
690 }
691 
OnCheckOrRadioBox(wxCommandEvent & WXUNUSED (event))692 void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
693 {
694     CreateCombo();
695 }
696 
OnDropdown(wxCommandEvent & WXUNUSED (event))697 void ComboboxWidgetsPage::OnDropdown(wxCommandEvent& WXUNUSED(event))
698 {
699     wxLogMessage("Combobox dropped down");
700 }
701 
OnCloseup(wxCommandEvent & WXUNUSED (event))702 void ComboboxWidgetsPage::OnCloseup(wxCommandEvent& WXUNUSED(event))
703 {
704     wxLogMessage("Combobox closed up");
705 }
706 
OnPopup(wxCommandEvent & WXUNUSED (event))707 void ComboboxWidgetsPage::OnPopup(wxCommandEvent &WXUNUSED(event))
708 {
709     m_combobox1->Clear();
710     m_combobox1->Append( "Selection 1" );
711     m_combobox1->Append( "Selection 2" );
712     m_combobox1->Append( "Selection 3" );
713     wxLogMessage("The number of items is %d", m_combobox1->GetCount());
714 }
715 
OnDismiss(wxCommandEvent & WXUNUSED (event))716 void ComboboxWidgetsPage::OnDismiss(wxCommandEvent &WXUNUSED(event))
717 {
718     if ( m_combobox1->GetSelection() == wxNOT_FOUND )
719     {
720         m_combobox1->Clear();
721         m_combobox1->Append( "Dynamic ComboBox Test - Click me!" );
722         m_combobox1->SetSelection( 0 );
723     }
724     wxLogMessage("The number of items is %d", m_combobox1->GetCount());
725 }
726 
727 #endif // wxUSE_COMBOBOX
728