]> git.saurik.com Git - wxWidgets.git/blob - samples/widgets/combobox.cpp
Make storing non-trivial data in wxThreadSpecificInfo possible.
[wxWidgets.git] / samples / widgets / combobox.cpp
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
97 virtual wxControl *GetWidget() const { return m_combobox; }
98 virtual wxTextEntryBase *GetTextEntry() const { return m_combobox; }
99 virtual wxItemContainer* GetContainer() const { return m_combobox; }
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);
108 void OnButtonPopup(wxCommandEvent&) { m_combobox->Popup(); }
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 DECLARE_EVENT_TABLE()
172 DECLARE_WIDGETS_PAGE(ComboboxWidgetsPage)
173 };
174
175 // ----------------------------------------------------------------------------
176 // event tables
177 // ----------------------------------------------------------------------------
178
179 BEGIN_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 END_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
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
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
401 void ComboboxWidgetsPage::Reset()
402 {
403 m_chkSort->SetValue(false);
404 m_chkReadonly->SetValue(false);
405 m_chkProcessEnter->SetValue(false);
406 }
407
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
470 void ComboboxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
471 {
472 Reset();
473
474 CreateCombo();
475 }
476
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
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
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
507 void ComboboxWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event))
508 {
509 wxString value = m_textSetValue->GetValue();
510 m_combobox->SetValue( value );
511 }
512
513 void ComboboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
514 {
515 m_combobox->Clear();
516 }
517
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
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
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
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
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
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
583 void ComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent& event)
584 {
585 if (m_combobox)
586 event.SetText( wxString::Format(wxT("%ld"), m_combobox->GetInsertionPoint()) );
587 }
588
589 void ComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
590 {
591 event.Enable( m_chkSort->GetValue() ||
592 m_chkReadonly->GetValue() ||
593 m_chkProcessEnter->GetValue() );
594 }
595
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
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
617 void ComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
618 {
619 if (m_combobox)
620 event.Enable(m_combobox->GetSelection() != wxNOT_FOUND);
621 }
622
623 void ComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
624 {
625 if (m_combobox)
626 event.Enable(m_combobox->GetCount() != 0);
627 }
628
629 void ComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
630 {
631 if (m_combobox)
632 event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
633 }
634
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
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
663 void ComboboxWidgetsPage::OnComboTextPasted(wxClipboardTextEvent& event)
664 {
665 wxLogMessage("Text pasted from clipboard.");
666 event.Skip();
667 }
668
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
687 void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
688 {
689 CreateCombo();
690 }
691
692 void ComboboxWidgetsPage::OnDropdown(wxCommandEvent& WXUNUSED(event))
693 {
694 wxLogMessage(wxT("Combobox dropped down"));
695 }
696
697 void ComboboxWidgetsPage::OnCloseup(wxCommandEvent& WXUNUSED(event))
698 {
699 wxLogMessage(wxT("Combobox closed up"));
700 }
701
702 #endif // wxUSE_COMBOBOX