]> git.saurik.com Git - wxWidgets.git/blob - samples/listbox/lboxtest.cpp
Order of initializations according to class construction.
[wxWidgets.git] / samples / listbox / lboxtest.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: lboxtest.cpp
3 // Purpose: wxListBox sample
4 // Author: Vadim Zeitlin
5 // Id: $Id$
6 // Copyright: (c) 2000 Vadim Zeitlin
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10 /*
11 Current bugs:
12
13 +1. horz scrollbar doesn't appear in listbox
14 +2. truncating text ctrl doesn't update display
15 +3. deleting last listbox item doesn't update display
16 4. text ctrl background corrupted after resize
17 */
18
19 // ============================================================================
20 // declarations
21 // ============================================================================
22
23 #ifdef __GNUG__
24 #pragma implementation "lboxtest.cpp"
25 #pragma interface "lboxtest.cpp"
26 #endif
27
28 // ----------------------------------------------------------------------------
29 // headers
30 // ----------------------------------------------------------------------------
31
32 // for compilers that support precompilation, includes "wx/wx.h".
33 #include "wx/wxprec.h"
34
35 #ifdef __BORLANDC__
36 #pragma hdrstop
37 #endif
38
39 // for all others, include the necessary headers
40 #ifndef WX_PRECOMP
41 #include "wx/wx.h"
42 #include "wx/app.h"
43 #include "wx/frame.h"
44 #include "wx/dcclient.h"
45
46 #include "wx/button.h"
47 #include "wx/checkbox.h"
48 #include "wx/checklst.h"
49 #include "wx/listbox.h"
50 #include "wx/radiobox.h"
51 #include "wx/radiobut.h"
52 #include "wx/statbox.h"
53 #include "wx/stattext.h"
54 #include "wx/textctrl.h"
55 #endif
56
57 #include "wx/sizer.h"
58
59 #ifdef __WXUNIVERSAL__
60 #include "wx/univ/theme.h"
61 #endif // __WXUNIVERSAL__
62
63 // ----------------------------------------------------------------------------
64 // constants
65 // ----------------------------------------------------------------------------
66
67 // control ids
68 enum
69 {
70 LboxTest_Reset = 100,
71 LboxTest_Create,
72 LboxTest_Add,
73 LboxTest_AddText,
74 LboxTest_AddSeveral,
75 LboxTest_AddMany,
76 LboxTest_Clear,
77 #if wxUSE_LOG
78 LboxTest_ClearLog,
79 #endif // wxUSE_LOG
80 LboxTest_Change,
81 LboxTest_ChangeText,
82 LboxTest_Delete,
83 LboxTest_DeleteText,
84 LboxTest_DeleteSel,
85 LboxTest_Listbox,
86 LboxTest_Quit
87 };
88
89 // ----------------------------------------------------------------------------
90 // our classes
91 // ----------------------------------------------------------------------------
92
93 // Define a new application type, each program should derive a class from wxApp
94 class LboxTestApp : public wxApp
95 {
96 public:
97 // override base class virtuals
98 // ----------------------------
99
100 // this one is called on application startup and is a good place for the app
101 // initialization (doing it here and not in the ctor allows to have an error
102 // return: if OnInit() returns false, the application terminates)
103 virtual bool OnInit();
104 };
105
106 // Define a new frame type: this is going to be our main frame
107 class LboxTestFrame : public wxFrame
108 {
109 public:
110 // ctor(s) and dtor
111 LboxTestFrame(const wxString& title);
112 virtual ~LboxTestFrame();
113
114 protected:
115 // event handlers
116 void OnButtonReset(wxCommandEvent& event);
117 void OnButtonCreate(wxCommandEvent& event);
118 void OnButtonChange(wxCommandEvent& event);
119 void OnButtonDelete(wxCommandEvent& event);
120 void OnButtonDeleteSel(wxCommandEvent& event);
121 void OnButtonClear(wxCommandEvent& event);
122 #if wxUSE_LOG
123 void OnButtonClearLog(wxCommandEvent& event);
124 #endif // wxUSE_LOG
125 void OnButtonAdd(wxCommandEvent& event);
126 void OnButtonAddSeveral(wxCommandEvent& event);
127 void OnButtonAddMany(wxCommandEvent& event);
128 void OnButtonQuit(wxCommandEvent& event);
129
130 void OnListbox(wxCommandEvent& event);
131 void OnListboxDClick(wxCommandEvent& event);
132
133 void OnCheckOrRadioBox(wxCommandEvent& event);
134
135 void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
136 void OnUpdateUICreateButton(wxUpdateUIEvent& event);
137 void OnUpdateUIClearButton(wxUpdateUIEvent& event);
138 void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
139 void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
140
141 // reset the listbox parameters
142 void Reset();
143
144 // (re)create the listbox
145 void CreateLbox();
146
147 // listbox parameters
148 // ------------------
149
150 // the selection mode
151 enum LboxSelection
152 {
153 LboxSel_Single,
154 LboxSel_Extended,
155 LboxSel_Multiple
156 } m_lboxSelMode;
157
158 // should it be sorted?
159 bool m_sorted;
160
161 // should it have horz scroll/vert scrollbar permanently shown?
162 bool m_horzScroll,
163 m_vertScrollAlways;
164
165 // should the recreate button be enabled?
166 bool m_dirty;
167
168 // the controls
169 // ------------
170
171 // the sel mode radiobox
172 wxRadioBox *m_radioSelMode;
173
174 // the checkboxes
175 wxCheckBox *m_chkSort,
176 *m_chkHScroll,
177 *m_chkVScroll;
178
179 // the listbox itself and the sizer it is in
180 wxListBox *m_lbox;
181 wxSizer *m_sizerLbox;
182
183 #if wxUSE_LOG
184 // the listbox for logging messages
185 wxListBox *m_lboxLog;
186 #endif // wxUSE_LOG
187
188 // the text entries for "Add/change string" and "Delete" buttons
189 wxTextCtrl *m_textAdd,
190 *m_textChange,
191 *m_textDelete;
192
193 private:
194 #if wxUSE_LOG
195 // the log target we use to redirect messages to the listbox
196 wxLog *m_logTarget;
197 #endif // wxUSE_LOG
198
199 // any class wishing to process wxWidgets events must use this macro
200 DECLARE_EVENT_TABLE()
201 };
202
203 #if wxUSE_LOG
204 // A log target which just redirects the messages to a listbox
205 class LboxLogger : public wxLog
206 {
207 public:
208 LboxLogger(wxListBox *lbox, wxLog *logOld)
209 {
210 m_lbox = lbox;
211 //m_lbox->Disable(); -- looks ugly under MSW
212 m_logOld = logOld;
213 }
214
215 virtual ~LboxLogger()
216 {
217 wxLog::SetActiveTarget(m_logOld);
218 }
219
220 private:
221 // implement sink functions
222 virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t)
223 {
224 // don't put trace messages into listbox or we can get into infinite
225 // recursion
226 if ( level == wxLOG_Trace )
227 {
228 if ( m_logOld )
229 {
230 // cast is needed to call protected method
231 ((LboxLogger *)m_logOld)->DoLog(level, szString, t);
232 }
233 }
234 else
235 {
236 wxLog::DoLog(level, szString, t);
237 }
238 }
239
240 virtual void DoLogString(const wxChar *szString, time_t WXUNUSED(t))
241 {
242 wxString msg;
243 TimeStamp(&msg);
244 msg += szString;
245 #ifdef __WXUNIVERSAL__
246 m_lbox->AppendAndEnsureVisible(msg);
247 #else // other ports don't have this method yet
248 m_lbox->Append(msg);
249
250 // SetFirstItem() isn't implemented in wxGTK
251 #ifndef __WXGTK__
252 m_lbox->SetFirstItem(m_lbox->GetCount() - 1);
253 #endif
254 #endif
255 }
256
257 // the control we use
258 wxListBox *m_lbox;
259
260 // the old log target
261 wxLog *m_logOld;
262 };
263 #endif // wxUSE_LOG
264
265 // ----------------------------------------------------------------------------
266 // misc macros
267 // ----------------------------------------------------------------------------
268
269 IMPLEMENT_APP(LboxTestApp)
270
271 // ----------------------------------------------------------------------------
272 // event tables
273 // ----------------------------------------------------------------------------
274
275 BEGIN_EVENT_TABLE(LboxTestFrame, wxFrame)
276 EVT_BUTTON(LboxTest_Reset, LboxTestFrame::OnButtonReset)
277 EVT_BUTTON(LboxTest_Create, LboxTestFrame::OnButtonCreate)
278 EVT_BUTTON(LboxTest_Change, LboxTestFrame::OnButtonChange)
279 EVT_BUTTON(LboxTest_Delete, LboxTestFrame::OnButtonDelete)
280 EVT_BUTTON(LboxTest_DeleteSel, LboxTestFrame::OnButtonDeleteSel)
281 EVT_BUTTON(LboxTest_Clear, LboxTestFrame::OnButtonClear)
282 #if wxUSE_LOG
283 EVT_BUTTON(LboxTest_ClearLog, LboxTestFrame::OnButtonClearLog)
284 #endif // wxUSE_LOG
285 EVT_BUTTON(LboxTest_Add, LboxTestFrame::OnButtonAdd)
286 EVT_BUTTON(LboxTest_AddSeveral, LboxTestFrame::OnButtonAddSeveral)
287 EVT_BUTTON(LboxTest_AddMany, LboxTestFrame::OnButtonAddMany)
288 EVT_BUTTON(LboxTest_Quit, LboxTestFrame::OnButtonQuit)
289
290 EVT_TEXT_ENTER(LboxTest_AddText, LboxTestFrame::OnButtonAdd)
291 EVT_TEXT_ENTER(LboxTest_DeleteText, LboxTestFrame::OnButtonDelete)
292
293 EVT_UPDATE_UI_RANGE(LboxTest_Reset, LboxTest_Create,
294 LboxTestFrame::OnUpdateUICreateButton)
295
296 EVT_UPDATE_UI(LboxTest_AddSeveral, LboxTestFrame::OnUpdateUIAddSeveral)
297 EVT_UPDATE_UI(LboxTest_Clear, LboxTestFrame::OnUpdateUIClearButton)
298 EVT_UPDATE_UI(LboxTest_DeleteText, LboxTestFrame::OnUpdateUIClearButton)
299 EVT_UPDATE_UI(LboxTest_Delete, LboxTestFrame::OnUpdateUIDeleteButton)
300 EVT_UPDATE_UI(LboxTest_Change, LboxTestFrame::OnUpdateUIDeleteSelButton)
301 EVT_UPDATE_UI(LboxTest_ChangeText, LboxTestFrame::OnUpdateUIDeleteSelButton)
302 EVT_UPDATE_UI(LboxTest_DeleteSel, LboxTestFrame::OnUpdateUIDeleteSelButton)
303
304 EVT_LISTBOX(LboxTest_Listbox, LboxTestFrame::OnListbox)
305 EVT_LISTBOX_DCLICK(wxID_ANY, LboxTestFrame::OnListboxDClick)
306 EVT_CHECKBOX(wxID_ANY, LboxTestFrame::OnCheckOrRadioBox)
307 EVT_RADIOBOX(wxID_ANY, LboxTestFrame::OnCheckOrRadioBox)
308 END_EVENT_TABLE()
309
310 // ============================================================================
311 // implementation
312 // ============================================================================
313
314 // ----------------------------------------------------------------------------
315 // app class
316 // ----------------------------------------------------------------------------
317
318 bool LboxTestApp::OnInit()
319 {
320 wxFrame *frame = new LboxTestFrame(_T("wxListBox sample"));
321 frame->Show();
322
323 #if wxUSE_LOG
324 //wxLog::AddTraceMask(_T("listbox"));
325 wxLog::AddTraceMask(_T("scrollbar"));
326 #endif // wxUSE_LOG
327
328 return true;
329 }
330
331 // ----------------------------------------------------------------------------
332 // top level frame class
333 // ----------------------------------------------------------------------------
334
335 LboxTestFrame::LboxTestFrame(const wxString& title)
336 : wxFrame(NULL, wxID_ANY, title, wxPoint(100, 100))
337 {
338 // init everything
339 m_dirty = false;
340 m_radioSelMode = (wxRadioBox *)NULL;
341
342 m_chkVScroll =
343 m_chkHScroll =
344 m_chkSort = (wxCheckBox *)NULL;
345
346 m_lbox = (wxListBox *)NULL;
347 #if wxUSE_LOG
348 m_lboxLog = (wxListBox *)NULL;
349 #endif // wxUSE_LOG
350 m_sizerLbox = (wxSizer *)NULL;
351
352 #if wxUSE_LOG
353 m_logTarget = (wxLog *)NULL;
354 #endif // wxUSE_LOG
355
356 wxPanel *panel = new wxPanel(this, wxID_ANY);
357
358 /*
359 What we create here is a frame having 3 panes: the explanatory pane to
360 the left allowing to set the listbox styles and recreate the control,
361 the pane containing the listbox itself and the lower pane containing
362 the buttons which allow to add/change/delete strings to/from it.
363 */
364 wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL),
365 *sizerUp = new wxBoxSizer(wxHORIZONTAL),
366 *sizerLeft,
367 *sizerRight = new wxBoxSizer(wxVERTICAL);
368
369 // upper left pane
370 static const wxString modes[] =
371 {
372 _T("single"),
373 _T("extended"),
374 _T("multiple"),
375 };
376
377 wxStaticBox *box = new wxStaticBox(panel, wxID_ANY, _T("&Set listbox parameters"));
378 m_radioSelMode = new wxRadioBox(panel, wxID_ANY, _T("Selection &mode:"),
379 wxDefaultPosition, wxDefaultSize,
380 WXSIZEOF(modes), modes,
381 1, wxRA_SPECIFY_COLS);
382
383 m_chkVScroll = new wxCheckBox(panel, wxID_ANY, _T("Always show &vertical scrollbar"));
384 m_chkHScroll = new wxCheckBox(panel, wxID_ANY, _T("Show &horizontal scrollbar"));
385 m_chkSort = new wxCheckBox(panel, wxID_ANY, _T("&Sort items"));
386
387 sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
388
389 sizerLeft->Add(m_chkVScroll, 0, wxLEFT | wxRIGHT, 5);
390 sizerLeft->Add(m_chkHScroll, 0, wxLEFT | wxRIGHT, 5);
391 sizerLeft->Add(m_chkSort, 0, wxLEFT | wxRIGHT, 5);
392 sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
393 sizerLeft->Add(m_radioSelMode, 0, wxGROW | wxALL, 5);
394
395 wxSizer *sizerBtn = new wxBoxSizer(wxHORIZONTAL);
396 wxButton *btn = new wxButton(panel, LboxTest_Reset, _T("&Reset"));
397 sizerBtn->Add(btn, 0, wxLEFT | wxRIGHT, 5);
398 btn = new wxButton(panel, LboxTest_Create, _T("&Create"));
399 sizerBtn->Add(btn, 0, wxLEFT | wxRIGHT, 5);
400 sizerLeft->Add(sizerBtn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
401
402 // middle pane
403 wxStaticBox *box2 = new wxStaticBox(panel, wxID_ANY, _T("&Change listbox contents"));
404 wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
405
406 wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
407 btn = new wxButton(panel, LboxTest_Add, _T("&Add this string"));
408 m_textAdd = new wxTextCtrl(panel, LboxTest_AddText, _T("test item 0"));
409 sizerRow->Add(btn, 0, wxRIGHT, 5);
410 sizerRow->Add(m_textAdd, 1, wxLEFT, 5);
411 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
412
413 btn = new wxButton(panel, LboxTest_AddSeveral, _T("&Insert a few strings"));
414 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
415
416 btn = new wxButton(panel, LboxTest_AddMany, _T("Add &many strings"));
417 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
418
419 sizerRow = new wxBoxSizer(wxHORIZONTAL);
420 btn = new wxButton(panel, LboxTest_Change, _T("C&hange current"));
421 m_textChange = new wxTextCtrl(panel, LboxTest_ChangeText, wxEmptyString);
422 sizerRow->Add(btn, 0, wxRIGHT, 5);
423 sizerRow->Add(m_textChange, 1, wxLEFT, 5);
424 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
425
426 sizerRow = new wxBoxSizer(wxHORIZONTAL);
427 btn = new wxButton(panel, LboxTest_Delete, _T("&Delete this item"));
428 m_textDelete = new wxTextCtrl(panel, LboxTest_DeleteText, wxEmptyString);
429 sizerRow->Add(btn, 0, wxRIGHT, 5);
430 sizerRow->Add(m_textDelete, 1, wxLEFT, 5);
431 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
432
433 btn = new wxButton(panel, LboxTest_DeleteSel, _T("Delete &selection"));
434 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
435
436 btn = new wxButton(panel, LboxTest_Clear, _T("&Clear"));
437 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
438
439 // right pane
440 m_lbox = new wxListBox(panel, LboxTest_Listbox,
441 wxDefaultPosition, wxDefaultSize,
442 0, NULL,
443 wxLB_HSCROLL);
444 sizerRight->Add(m_lbox, 1, wxGROW | wxALL, 5);
445 sizerRight->SetMinSize(250, 0);
446 m_sizerLbox = sizerRight; // save it to modify it later
447
448 // the 3 panes panes compose the upper part of the window
449 sizerUp->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
450 sizerUp->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
451 sizerUp->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
452
453 // the lower one only has the log listbox and a button to clear it
454 #if wxUSE_LOG
455 wxSizer *sizerDown = new wxStaticBoxSizer
456 (
457 new wxStaticBox(panel, wxID_ANY, _T("&Log window")),
458 wxVERTICAL
459 );
460 m_lboxLog = new wxListBox(panel, wxID_ANY);
461 sizerDown->Add(m_lboxLog, 1, wxGROW | wxALL, 5);
462 #else
463 wxSizer *sizerDown = new wxBoxSizer(wxVERTICAL);
464 #endif // wxUSE_LOG
465 wxBoxSizer *sizerBtns = new wxBoxSizer(wxHORIZONTAL);
466 #if wxUSE_LOG
467 btn = new wxButton(panel, LboxTest_ClearLog, _T("Clear &log"));
468 sizerBtns->Add(btn);
469 sizerBtns->Add(10, 0); // spacer
470 #endif // wxUSE_LOG
471 btn = new wxButton(panel, LboxTest_Quit, _T("E&xit"));
472 sizerBtns->Add(btn);
473 sizerDown->Add(sizerBtns, 0, wxALL | wxALIGN_RIGHT, 5);
474
475 // put everything together
476 sizerTop->Add(sizerUp, 1, wxGROW | (wxALL & ~wxBOTTOM), 10);
477 sizerTop->Add(0, 5, 0, wxGROW); // spacer in between
478 sizerTop->Add(sizerDown, 0, wxGROW | (wxALL & ~wxTOP), 10);
479
480 // final initialization
481 Reset();
482 m_dirty = false;
483
484 panel->SetSizer(sizerTop);
485
486 sizerTop->Fit(this);
487 sizerTop->SetSizeHints(this);
488
489 #if wxUSE_LOG
490 // now that everything is created we can redirect the log messages to the
491 // listbox
492 m_logTarget = new LboxLogger(m_lboxLog, wxLog::GetActiveTarget());
493 wxLog::SetActiveTarget(m_logTarget);
494 #endif // wxUSE_LOG
495 }
496
497 LboxTestFrame::~LboxTestFrame()
498 {
499 #if wxUSE_LOG
500 delete m_logTarget;
501 #endif // wxUSE_LOG
502 }
503
504 // ----------------------------------------------------------------------------
505 // operations
506 // ----------------------------------------------------------------------------
507
508 void LboxTestFrame::Reset()
509 {
510 if ( m_radioSelMode->GetSelection() == LboxSel_Single &&
511 !m_chkSort->GetValue() &&
512 m_chkHScroll->GetValue() &&
513 !m_chkVScroll->GetValue() )
514 {
515 // nothing to do
516 return;
517 }
518
519 m_radioSelMode->SetSelection(LboxSel_Single);
520 m_chkSort->SetValue(false);
521 m_chkHScroll->SetValue(true);
522 m_chkVScroll->SetValue(false);
523
524 m_dirty = true;
525 }
526
527 void LboxTestFrame::CreateLbox()
528 {
529 int flags = 0;
530 switch ( m_radioSelMode->GetSelection() )
531 {
532 default:
533 wxFAIL_MSG( _T("unexpected radio box selection") );
534
535 case LboxSel_Single: flags |= wxLB_SINGLE; break;
536 case LboxSel_Extended: flags |= wxLB_EXTENDED; break;
537 case LboxSel_Multiple: flags |= wxLB_MULTIPLE; break;
538 }
539
540 if ( m_chkVScroll->GetValue() )
541 flags |= wxLB_ALWAYS_SB;
542 if ( m_chkHScroll->GetValue() )
543 flags |= wxLB_HSCROLL;
544 if ( m_chkSort->GetValue() )
545 flags |= wxLB_SORT;
546
547 wxArrayString items;
548 if ( m_lbox )
549 {
550 int count = m_lbox->GetCount();
551 for ( int n = 0; n < count; n++ )
552 {
553 items.Add(m_lbox->GetString(n));
554 }
555
556 m_sizerLbox->Detach(m_lbox);
557 delete m_lbox;
558 }
559
560 m_lbox = new wxListBox(this, wxID_ANY,
561 wxDefaultPosition, wxDefaultSize,
562 0, NULL,
563 flags);
564 m_lbox->Set(items);
565 m_sizerLbox->Add(m_lbox, 1, wxGROW | wxALL, 5);
566 m_sizerLbox->Layout();
567
568 m_dirty = false;
569 }
570
571 // ----------------------------------------------------------------------------
572 // event handlers
573 // ----------------------------------------------------------------------------
574
575 void LboxTestFrame::OnButtonQuit(wxCommandEvent& WXUNUSED(event))
576 {
577 Close();
578 }
579
580 void LboxTestFrame::OnButtonReset(wxCommandEvent& WXUNUSED(event))
581 {
582 Reset();
583 }
584
585 void LboxTestFrame::OnButtonCreate(wxCommandEvent& WXUNUSED(event))
586 {
587 CreateLbox();
588 }
589
590 void LboxTestFrame::OnButtonChange(wxCommandEvent& WXUNUSED(event))
591 {
592 wxArrayInt selections;
593 int count = m_lbox->GetSelections(selections);
594 wxString s = m_textChange->GetValue();
595 for ( int n = 0; n < count; n++ )
596 {
597 m_lbox->SetString(selections[n], s);
598 }
599 }
600
601 void LboxTestFrame::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
602 {
603 unsigned long n;
604 if ( !m_textDelete->GetValue().ToULong(&n) ||
605 (n >= (unsigned)m_lbox->GetCount()) )
606 {
607 return;
608 }
609
610 m_lbox->Delete(n);
611 }
612
613 void LboxTestFrame::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
614 {
615 wxArrayInt selections;
616 int n = m_lbox->GetSelections(selections);
617 while ( n > 0 )
618 {
619 m_lbox->Delete(selections[--n]);
620 }
621 }
622
623 void LboxTestFrame::OnButtonClear(wxCommandEvent& WXUNUSED(event))
624 {
625 m_lbox->Clear();
626 }
627
628 #if wxUSE_LOG
629 void LboxTestFrame::OnButtonClearLog(wxCommandEvent& WXUNUSED(event))
630 {
631 m_lboxLog->Clear();
632 }
633 #endif // wxUSE_LOG
634
635 void LboxTestFrame::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
636 {
637 static size_t s_item = 0;
638
639 wxString s = m_textAdd->GetValue();
640 if ( !m_textAdd->IsModified() )
641 {
642 // update the default string
643 m_textAdd->SetValue(wxString::Format(_T("test item %u"), ++s_item));
644 }
645
646 m_lbox->Append(s);
647 }
648
649 void LboxTestFrame::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
650 {
651 // "many" means 1000 here
652 for ( size_t n = 0; n < 1000; n++ )
653 {
654 m_lbox->Append(wxString::Format(_T("item #%u"), n));
655 }
656 }
657
658 void LboxTestFrame::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
659 {
660 wxArrayString items;
661 items.Add(_T("First"));
662 items.Add(_T("another one"));
663 items.Add(_T("and the last (very very very very very very very very very very long) one"));
664 m_lbox->InsertItems(items, 0);
665 }
666
667 void LboxTestFrame::OnUpdateUICreateButton(wxUpdateUIEvent& event)
668 {
669 event.Enable(m_dirty);
670 }
671
672 void LboxTestFrame::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
673 {
674 unsigned long n;
675 event.Enable(m_textDelete->GetValue().ToULong(&n) &&
676 (n < (unsigned)m_lbox->GetCount()));
677 }
678
679 void LboxTestFrame::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
680 {
681 wxArrayInt selections;
682 event.Enable(m_lbox->GetSelections(selections) != 0);
683 }
684
685 void LboxTestFrame::OnUpdateUIClearButton(wxUpdateUIEvent& event)
686 {
687 event.Enable(m_lbox->GetCount() != 0);
688 }
689
690 void LboxTestFrame::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
691 {
692 event.Enable(!(m_lbox->GetWindowStyle() & wxLB_SORT));
693 }
694
695 void LboxTestFrame::OnListbox(wxCommandEvent& event)
696 {
697 int sel = event.GetInt();
698 m_textDelete->SetValue(wxString::Format(_T("%d"), sel));
699
700 wxLogMessage(_T("Listbox item %d selected"), sel);
701 }
702
703 void LboxTestFrame::OnListboxDClick(wxCommandEvent& event)
704 {
705 int sel = event.GetInt();
706 wxLogMessage(_T("Listbox item %d double clicked"), sel);
707 }
708
709 void LboxTestFrame::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
710 {
711 m_dirty = true;
712 }
713