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 #ifdef __BORLANDC__
23     #pragma hdrstop
24 #endif
25 
26 #if wxUSE_COMBOBOX
27 
28 // for all others, include the necessary headers
29 #ifndef WX_PRECOMP
30     #include "wx/log.h"
31 
32     #include "wx/bitmap.h"
33     #include "wx/button.h"
34     #include "wx/checkbox.h"
35     #include "wx/combobox.h"
36     #include "wx/radiobox.h"
37     #include "wx/statbox.h"
38     #include "wx/textctrl.h"
39 #endif
40 
41 #include "wx/sizer.h"
42 
43 #include "itemcontainer.h"
44 #include "widgets.h"
45 #include "icons/combobox.xpm"
46 
47 // ----------------------------------------------------------------------------
48 // constants
49 // ----------------------------------------------------------------------------
50 
51 // control ids
52 enum
53 {
54     ComboPage_Reset = wxID_HIGHEST,
55     ComboPage_Popup,
56     ComboPage_Dismiss,
57     ComboPage_SetCurrent,
58     ComboPage_CurText,
59     ComboPage_InsertionPointText,
60     ComboPage_Insert,
61     ComboPage_InsertText,
62     ComboPage_Add,
63     ComboPage_AddText,
64     ComboPage_SetFirst,
65     ComboPage_SetFirstText,
66     ComboPage_AddSeveral,
67     ComboPage_AddMany,
68     ComboPage_Clear,
69     ComboPage_Change,
70     ComboPage_ChangeText,
71     ComboPage_Delete,
72     ComboPage_DeleteText,
73     ComboPage_DeleteSel,
74     ComboPage_SetValue,
75     ComboPage_SetValueText,
76     ComboPage_Combo,
77     ComboPage_ContainerTests
78 };
79 
80 // kinds of comboboxes
81 enum
82 {
83     ComboKind_Default,
84     ComboKind_Simple,
85     ComboKind_DropDown
86 };
87 
88 // ----------------------------------------------------------------------------
89 // ComboboxWidgetsPage
90 // ----------------------------------------------------------------------------
91 
92 class ComboboxWidgetsPage : public ItemContainerWidgetsPage
93 {
94 public:
95     ComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
96 
GetWidget() const97     virtual wxControl *GetWidget() const { return m_combobox; }
GetTextEntry() const98     virtual wxTextEntryBase *GetTextEntry() const { return m_combobox; }
GetContainer() const99     virtual wxItemContainer* GetContainer() const { return m_combobox; }
RecreateWidget()100     virtual void RecreateWidget() { CreateCombo(); }
101 
102     // lazy creation of the content
103     virtual void CreateContent();
104 
105 protected:
106     // event handlers
107     void OnButtonReset(wxCommandEvent& event);
OnButtonPopup(wxCommandEvent &)108     void OnButtonPopup(wxCommandEvent&) { m_combobox->Popup(); }
OnButtonDismiss(wxCommandEvent &)109     void OnButtonDismiss(wxCommandEvent&) { m_combobox->Dismiss(); }
110     void OnButtonChange(wxCommandEvent& event);
111     void OnButtonDelete(wxCommandEvent& event);
112     void OnButtonDeleteSel(wxCommandEvent& event);
113     void OnButtonClear(wxCommandEvent& event);
114     void OnButtonInsert(wxCommandEvent &event);
115     void OnButtonAdd(wxCommandEvent& event);
116     void OnButtonSetFirst(wxCommandEvent& event);
117     void OnButtonAddSeveral(wxCommandEvent& event);
118     void OnButtonAddMany(wxCommandEvent& event);
119     void OnButtonSetValue(wxCommandEvent& event);
120     void OnButtonSetCurrent(wxCommandEvent& event);
121 
122     void OnDropdown(wxCommandEvent& event);
123     void OnCloseup(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;
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, wxT("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         wxT("default"),
267         wxT("simple"),
268         wxT("drop down"),
269     };
270 
271     m_radioKind = new wxRadioBox(this, wxID_ANY, wxT("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, wxT("&Sort items"));
279     m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&Read only"));
280     m_chkProcessEnter = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("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, wxT("&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         wxT("&Change combobox contents"));
304     wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
305 
306     wxSizer *sizerRow;
307 
308     sizerRow = CreateSizerWithTextAndButton(ComboPage_SetCurrent,
309                                             wxT("Current &selection"),
310                                             ComboPage_CurText,
311                                             &m_textCur);
312 
313     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
314 
315     wxTextCtrl *text;
316     sizerRow = CreateSizerWithTextAndLabel(wxT("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                                             wxT("&Insert this string"),
325                                             ComboPage_InsertText,
326                                             &m_textInsert);
327     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
328 
329     sizerRow = CreateSizerWithTextAndButton(ComboPage_Add,
330                                             wxT("&Add this string"),
331                                             ComboPage_AddText,
332                                             &m_textAdd);
333     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
334 
335     sizerRow = CreateSizerWithTextAndButton(ComboPage_SetFirst,
336                                             wxT("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, wxT("&Append a few strings"));
342     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
343 
344     btn = new wxButton(this, ComboPage_AddMany, wxT("Append &many strings"));
345     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
346 
347     sizerRow = CreateSizerWithTextAndButton(ComboPage_Change,
348                                             wxT("C&hange current"),
349                                             ComboPage_ChangeText,
350                                             &m_textChange);
351     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
352 
353     sizerRow = CreateSizerWithTextAndButton(ComboPage_Delete,
354                                             wxT("&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, wxT("Delete &selection"));
360     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
361 
362     btn = new wxButton(this, ComboPage_Clear, wxT("&Clear"));
363     sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
364 
365     sizerRow = CreateSizerWithTextAndButton(ComboPage_SetValue,
366                                             wxT("SetValue"),
367                                             ComboPage_SetValueText,
368                                             &m_textSetValue);
369     sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
370 
371     btn = new wxButton(this, ComboPage_ContainerTests, wxT("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     sizerRight->SetMinSize(150, 0);
384     m_sizerCombo = sizerRight; // save it to modify it later
385 
386     // the 3 panes panes compose the window
387     sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
388     sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
389     sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
390 
391     // final initializations
392     Reset();
393 
394     SetSizer(sizerTop);
395 }
396 
397 // ----------------------------------------------------------------------------
398 // operations
399 // ----------------------------------------------------------------------------
400 
Reset()401 void ComboboxWidgetsPage::Reset()
402 {
403     m_chkSort->SetValue(false);
404     m_chkReadonly->SetValue(false);
405     m_chkProcessEnter->SetValue(false);
406 }
407 
CreateCombo()408 void ComboboxWidgetsPage::CreateCombo()
409 {
410     int flags = ms_defaultFlags;
411 
412     if ( m_chkSort->GetValue() )
413         flags |= wxCB_SORT;
414     if ( m_chkReadonly->GetValue() )
415         flags |= wxCB_READONLY;
416     if ( m_chkProcessEnter->GetValue() )
417         flags |= wxTE_PROCESS_ENTER;
418 
419 
420     switch ( m_radioKind->GetSelection() )
421     {
422         default:
423             wxFAIL_MSG( wxT("unknown combo kind") );
424             // fall through
425 
426         case ComboKind_Default:
427             break;
428 
429         case ComboKind_Simple:
430             flags |= wxCB_SIMPLE;
431             break;
432 
433         case ComboKind_DropDown:
434             flags = wxCB_DROPDOWN;
435             break;
436     }
437 
438     wxArrayString items;
439     if ( m_combobox )
440     {
441         unsigned int count = m_combobox->GetCount();
442         for ( unsigned int n = 0; n < count; n++ )
443         {
444             items.Add(m_combobox->GetString(n));
445         }
446 
447         m_sizerCombo->Detach( m_combobox );
448         delete m_combobox;
449     }
450 
451     m_combobox = new wxComboBox(this, ComboPage_Combo, wxEmptyString,
452                                 wxDefaultPosition, wxDefaultSize,
453                                 0, NULL,
454                                 flags);
455 
456     unsigned int count = items.GetCount();
457     for ( unsigned int n = 0; n < count; n++ )
458     {
459         m_combobox->Append(items[n]);
460     }
461 
462     m_sizerCombo->Add(m_combobox, 0, wxGROW | wxALL, 5);
463     m_sizerCombo->Layout();
464 }
465 
466 // ----------------------------------------------------------------------------
467 // event handlers
468 // ----------------------------------------------------------------------------
469 
OnButtonReset(wxCommandEvent & WXUNUSED (event))470 void ComboboxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
471 {
472     Reset();
473 
474     CreateCombo();
475 }
476 
OnButtonChange(wxCommandEvent & WXUNUSED (event))477 void ComboboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
478 {
479     int sel = m_combobox->GetSelection();
480     if ( sel != wxNOT_FOUND )
481     {
482         m_combobox->SetString(sel, m_textChange->GetValue());
483     }
484 }
485 
OnButtonDelete(wxCommandEvent & WXUNUSED (event))486 void ComboboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
487 {
488     unsigned long n;
489     if ( !m_textDelete->GetValue().ToULong(&n) ||
490             (n >= m_combobox->GetCount()) )
491     {
492         return;
493     }
494 
495     m_combobox->Delete(n);
496 }
497 
OnButtonDeleteSel(wxCommandEvent & WXUNUSED (event))498 void ComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
499 {
500     int sel = m_combobox->GetSelection();
501     if ( sel != wxNOT_FOUND )
502     {
503         m_combobox->Delete(sel);
504     }
505 }
506 
OnButtonSetValue(wxCommandEvent & WXUNUSED (event))507 void ComboboxWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event))
508 {
509     wxString value = m_textSetValue->GetValue();
510     m_combobox->SetValue( value );
511 }
512 
OnButtonClear(wxCommandEvent & WXUNUSED (event))513 void ComboboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
514 {
515     m_combobox->Clear();
516 }
517 
OnButtonInsert(wxCommandEvent & WXUNUSED (event))518 void ComboboxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
519 {
520     static unsigned int s_item = 0;
521 
522     wxString s = m_textInsert->GetValue();
523     if ( !m_textInsert->IsModified() )
524     {
525         // update the default string
526         m_textInsert->SetValue(wxString::Format(wxT("test item %u"), ++s_item));
527     }
528 
529     if (m_combobox->GetSelection() >= 0)
530         m_combobox->Insert(s, m_combobox->GetSelection());
531 }
532 
OnButtonAdd(wxCommandEvent & WXUNUSED (event))533 void ComboboxWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
534 {
535     static unsigned int s_item = 0;
536 
537     wxString s = m_textAdd->GetValue();
538     if ( !m_textAdd->IsModified() )
539     {
540         // update the default string
541         m_textAdd->SetValue(wxString::Format(wxT("test item %u"), ++s_item));
542     }
543 
544     m_combobox->Append(s);
545 }
546 
OnButtonSetFirst(wxCommandEvent & WXUNUSED (event))547 void ComboboxWidgetsPage::OnButtonSetFirst(wxCommandEvent& WXUNUSED(event))
548 {
549     if ( m_combobox->IsListEmpty() )
550     {
551         wxLogWarning("No string to change.");
552         return;
553     }
554 
555     m_combobox->SetString(0, m_textSetFirst->GetValue());
556 }
557 
OnButtonAddMany(wxCommandEvent & WXUNUSED (event))558 void ComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
559 {
560     // "many" means 1000 here
561     for ( unsigned int n = 0; n < 1000; n++ )
562     {
563         m_combobox->Append(wxString::Format(wxT("item #%u"), n));
564     }
565 }
566 
OnButtonSetCurrent(wxCommandEvent & WXUNUSED (event))567 void ComboboxWidgetsPage::OnButtonSetCurrent(wxCommandEvent& WXUNUSED(event))
568 {
569     long n;
570     if ( !m_textCur->GetValue().ToLong(&n) )
571         return;
572 
573     m_combobox->SetSelection(n);
574 }
575 
OnButtonAddSeveral(wxCommandEvent & WXUNUSED (event))576 void ComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
577 {
578     m_combobox->Append(wxT("First"));
579     m_combobox->Append(wxT("another one"));
580     m_combobox->Append(wxT("and the last (very very very very very very very very very very long) one"));
581 }
582 
OnUpdateUIInsertionPointText(wxUpdateUIEvent & event)583 void ComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent& event)
584 {
585     if (m_combobox)
586         event.SetText( wxString::Format(wxT("%ld"), m_combobox->GetInsertionPoint()) );
587 }
588 
OnUpdateUIResetButton(wxUpdateUIEvent & event)589 void ComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
590 {
591     event.Enable( m_chkSort->GetValue() ||
592                     m_chkReadonly->GetValue() ||
593                         m_chkProcessEnter->GetValue() );
594 }
595 
OnUpdateUIInsert(wxUpdateUIEvent & event)596 void ComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent& event)
597 {
598     if (m_combobox)
599     {
600         bool enable = !(m_combobox->GetWindowStyle() & wxCB_SORT) &&
601                        (m_combobox->GetSelection() >= 0);
602 
603         event.Enable(enable);
604     }
605 }
606 
OnUpdateUIDeleteButton(wxUpdateUIEvent & event)607 void ComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
608 {
609     if (m_combobox)
610     {
611       unsigned long n;
612       event.Enable(m_textDelete->GetValue().ToULong(&n) &&
613         (n < (unsigned)m_combobox->GetCount()));
614     }
615 }
616 
OnUpdateUIDeleteSelButton(wxUpdateUIEvent & event)617 void ComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
618 {
619     if (m_combobox)
620         event.Enable(m_combobox->GetSelection() != wxNOT_FOUND);
621 }
622 
OnUpdateUIClearButton(wxUpdateUIEvent & event)623 void ComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
624 {
625     if (m_combobox)
626         event.Enable(m_combobox->GetCount() != 0);
627 }
628 
OnUpdateUIAddSeveral(wxUpdateUIEvent & event)629 void ComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
630 {
631     if (m_combobox)
632         event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
633 }
634 
OnUpdateUISetCurrent(wxUpdateUIEvent & event)635 void ComboboxWidgetsPage::OnUpdateUISetCurrent(wxUpdateUIEvent& event)
636 {
637     long n;
638     event.Enable( m_textCur->GetValue().ToLong(&n) &&
639                     (n == wxNOT_FOUND ||
640                         (n >= 0 && (unsigned)n < m_combobox->GetCount())) );
641 }
642 
OnComboText(wxCommandEvent & event)643 void ComboboxWidgetsPage::OnComboText(wxCommandEvent& event)
644 {
645     if (!m_combobox)
646         return;
647 
648     wxString s = event.GetString();
649 
650     wxASSERT_MSG( s == m_combobox->GetValue(),
651                   wxT("event and combobox values should be the same") );
652 
653     if (event.GetEventType() == wxEVT_TEXT_ENTER)
654     {
655         wxLogMessage(wxT("Combobox enter pressed (now '%s')"), s.c_str());
656     }
657     else
658     {
659         wxLogMessage(wxT("Combobox text changed (now '%s')"), s.c_str());
660     }
661 }
662 
OnComboTextPasted(wxClipboardTextEvent & event)663 void ComboboxWidgetsPage::OnComboTextPasted(wxClipboardTextEvent& event)
664 {
665     wxLogMessage("Text pasted from clipboard.");
666     event.Skip();
667 }
668 
OnComboBox(wxCommandEvent & event)669 void ComboboxWidgetsPage::OnComboBox(wxCommandEvent& event)
670 {
671     long sel = event.GetInt();
672     const wxString selstr = wxString::Format(wxT("%ld"), sel);
673     m_textDelete->SetValue(selstr);
674     m_textCur->SetValue(selstr);
675 
676     wxLogMessage(wxT("Combobox item %ld selected"), sel);
677 
678     wxLogMessage(wxT("Combobox GetValue(): %s"), m_combobox->GetValue().c_str() );
679 
680     if ( event.GetString() != m_combobox->GetValue() )
681     {
682         wxLogMessage("ERROR: Event has different string \"%s\"",
683                      event.GetString());
684     }
685 }
686 
OnCheckOrRadioBox(wxCommandEvent & WXUNUSED (event))687 void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
688 {
689     CreateCombo();
690 }
691 
OnDropdown(wxCommandEvent & WXUNUSED (event))692 void ComboboxWidgetsPage::OnDropdown(wxCommandEvent& WXUNUSED(event))
693 {
694     wxLogMessage(wxT("Combobox dropped down"));
695 }
696 
OnCloseup(wxCommandEvent & WXUNUSED (event))697 void ComboboxWidgetsPage::OnCloseup(wxCommandEvent& WXUNUSED(event))
698 {
699     wxLogMessage(wxT("Combobox closed up"));
700 }
701 
702 #endif // wxUSE_COMBOBOX
703