'[ 1530831 ] wxOwnerDrawnComboBox page for Widgets sample' extended with icon.
[wxWidgets.git] / samples / widgets / odcombobox.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
3 // Name: odcombobox.cpp
4 // Purpose: Part of the widgets sample showing wxOwnerDrawnComboBox
5 // Author: Jaakko Salli (based on combobox page by Vadim Zeitlin)
6 // Created: Jul-28-2006
7 // Id: $Id$
8 // Copyright: (c) 2006 Jaakko Salli
9 // License: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // for compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 #if wxUSE_ODCOMBOBOX
28
29 // for all others, include the necessary headers
30 #ifndef WX_PRECOMP
31 #include "wx/log.h"
32
33 #include "wx/bitmap.h"
34 #include "wx/button.h"
35 #include "wx/checkbox.h"
36 #include "wx/combobox.h"
37 #include "wx/radiobox.h"
38 #include "wx/statbox.h"
39 #include "wx/textctrl.h"
40 #endif
41
42 #include "wx/dc.h"
43 #include "wx/dcmemory.h"
44 #include "wx/sizer.h"
45 #include "wx/odcombo.h"
46
47
48 #include "widgets.h"
49
50 #include "icons/odcombobox.xpm"
51
52 // ----------------------------------------------------------------------------
53 // constants
54 // ----------------------------------------------------------------------------
55
56 // control ids
57 enum
58 {
59 ODComboPage_Reset = wxID_HIGHEST,
60 ODComboPage_PopupMinWidth,
61 ODComboPage_PopupHeight,
62 ODComboPage_ButtonWidth,
63 ODComboPage_ButtonHeight,
64 ODComboPage_ButtonSpacing,
65 ODComboPage_CurText,
66 ODComboPage_InsertionPointText,
67 ODComboPage_Insert,
68 ODComboPage_InsertText,
69 ODComboPage_Add,
70 ODComboPage_AddText,
71 ODComboPage_AddSeveral,
72 ODComboPage_AddMany,
73 ODComboPage_Clear,
74 ODComboPage_Change,
75 ODComboPage_ChangeText,
76 ODComboPage_Delete,
77 ODComboPage_DeleteText,
78 ODComboPage_DeleteSel,
79 ODComboPage_Combo
80 };
81
82
83 // ----------------------------------------------------------------------------
84 // ODComboboxWidgetsPage
85 // ----------------------------------------------------------------------------
86
87 class ODComboboxWidgetsPage : public WidgetsPage
88 {
89 public:
90 ODComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
91
92 virtual wxControl *GetWidget() const { return m_combobox; }
93 virtual void RecreateWidget() { CreateCombo(); }
94
95 // lazy creation of the content
96 virtual void CreateContent();
97
98 protected:
99 // event handlers
100 void OnButtonReset(wxCommandEvent& event);
101 void OnButtonChange(wxCommandEvent& event);
102 void OnButtonDelete(wxCommandEvent& event);
103 void OnButtonDeleteSel(wxCommandEvent& event);
104 void OnButtonClear(wxCommandEvent& event);
105 void OnButtonInsert(wxCommandEvent &event);
106 void OnButtonAdd(wxCommandEvent& event);
107 void OnButtonAddSeveral(wxCommandEvent& event);
108 void OnButtonAddMany(wxCommandEvent& event);
109
110 void OnComboBox(wxCommandEvent& event);
111 void OnComboText(wxCommandEvent& event);
112
113 void OnCheckOrRadioBox(wxCommandEvent& event);
114
115 void OnTextPopupWidth(wxCommandEvent& event);
116 void OnTextPopupHeight(wxCommandEvent& event);
117 void OnTextButtonAll(wxCommandEvent& event);
118
119 void OnUpdateUICurText(wxUpdateUIEvent& event);
120 void OnUpdateUIInsertionPointText(wxUpdateUIEvent& event);
121
122 void OnUpdateUIInsert(wxUpdateUIEvent& event);
123 void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
124 void OnUpdateUIClearButton(wxUpdateUIEvent& event);
125 void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
126 void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
127 void OnUpdateUIResetButton(wxUpdateUIEvent& event);
128
129 // reset the odcombobox parameters
130 void Reset();
131
132 // (re)create the odcombobox
133 void CreateCombo();
134
135 // helper that gets all button values from controls and calls SetButtonPosition
136 void GetButtonPosition();
137
138 // helper to create the button bitmap
139 wxBitmap CreateBitmap(const wxColour& colour);
140
141 // the controls
142 // ------------
143
144 // the checkboxes for styles
145 wxCheckBox *m_chkSort,
146 *m_chkReadonly,
147 *m_chkDclickcycles,
148 *m_chkBitmapbutton,
149 *m_chkStdbutton;
150
151 // the text entries for popup and button adjustment
152 wxTextCtrl *m_textPopupMinWidth,
153 *m_textPopupHeight,
154 *m_textButtonWidth,
155 *m_textButtonHeight,
156 *m_textButtonSpacing;
157
158 // the checkboxes for same
159 wxCheckBox *m_chkAlignpopupright,
160 *m_chkAlignbutleft;
161
162 // the combobox itself and the sizer it is in
163 wxOwnerDrawnComboBox *m_combobox;
164 wxSizer *m_sizerCombo;
165
166 // the text entries for "Add/change string" and "Delete" buttons
167 wxTextCtrl *m_textInsert,
168 *m_textAdd,
169 *m_textChange,
170 *m_textDelete;
171
172 private:
173 DECLARE_EVENT_TABLE()
174 DECLARE_WIDGETS_PAGE(ODComboboxWidgetsPage)
175 };
176
177 // ----------------------------------------------------------------------------
178 // event tables
179 // ----------------------------------------------------------------------------
180
181 BEGIN_EVENT_TABLE(ODComboboxWidgetsPage, WidgetsPage)
182 EVT_BUTTON(ODComboPage_Reset, ODComboboxWidgetsPage::OnButtonReset)
183 EVT_BUTTON(ODComboPage_Change, ODComboboxWidgetsPage::OnButtonChange)
184 EVT_BUTTON(ODComboPage_Delete, ODComboboxWidgetsPage::OnButtonDelete)
185 EVT_BUTTON(ODComboPage_DeleteSel, ODComboboxWidgetsPage::OnButtonDeleteSel)
186 EVT_BUTTON(ODComboPage_Clear, ODComboboxWidgetsPage::OnButtonClear)
187 EVT_BUTTON(ODComboPage_Insert, ODComboboxWidgetsPage::OnButtonInsert)
188 EVT_BUTTON(ODComboPage_Add, ODComboboxWidgetsPage::OnButtonAdd)
189 EVT_BUTTON(ODComboPage_AddSeveral, ODComboboxWidgetsPage::OnButtonAddSeveral)
190 EVT_BUTTON(ODComboPage_AddMany, ODComboboxWidgetsPage::OnButtonAddMany)
191
192 EVT_TEXT_ENTER(ODComboPage_InsertText, ODComboboxWidgetsPage::OnButtonInsert)
193 EVT_TEXT_ENTER(ODComboPage_AddText, ODComboboxWidgetsPage::OnButtonAdd)
194 EVT_TEXT_ENTER(ODComboPage_DeleteText, ODComboboxWidgetsPage::OnButtonDelete)
195
196 EVT_TEXT(ODComboPage_PopupMinWidth, ODComboboxWidgetsPage::OnTextPopupWidth)
197 EVT_TEXT(ODComboPage_PopupHeight, ODComboboxWidgetsPage::OnTextPopupHeight)
198 EVT_TEXT(ODComboPage_ButtonWidth, ODComboboxWidgetsPage::OnTextButtonAll)
199 EVT_TEXT(ODComboPage_ButtonHeight, ODComboboxWidgetsPage::OnTextButtonAll)
200 EVT_TEXT(ODComboPage_ButtonSpacing, ODComboboxWidgetsPage::OnTextButtonAll)
201
202 EVT_UPDATE_UI(ODComboPage_CurText, ODComboboxWidgetsPage::OnUpdateUICurText)
203 EVT_UPDATE_UI(ODComboPage_InsertionPointText, ODComboboxWidgetsPage::OnUpdateUIInsertionPointText)
204
205 EVT_UPDATE_UI(ODComboPage_Reset, ODComboboxWidgetsPage::OnUpdateUIResetButton)
206 EVT_UPDATE_UI(ODComboPage_Insert, ODComboboxWidgetsPage::OnUpdateUIInsert)
207 EVT_UPDATE_UI(ODComboPage_AddSeveral, ODComboboxWidgetsPage::OnUpdateUIAddSeveral)
208 EVT_UPDATE_UI(ODComboPage_Clear, ODComboboxWidgetsPage::OnUpdateUIClearButton)
209 EVT_UPDATE_UI(ODComboPage_DeleteText, ODComboboxWidgetsPage::OnUpdateUIClearButton)
210 EVT_UPDATE_UI(ODComboPage_Delete, ODComboboxWidgetsPage::OnUpdateUIDeleteButton)
211 EVT_UPDATE_UI(ODComboPage_Change, ODComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
212 EVT_UPDATE_UI(ODComboPage_ChangeText, ODComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
213 EVT_UPDATE_UI(ODComboPage_DeleteSel, ODComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
214
215 EVT_COMBOBOX(ODComboPage_Combo, ODComboboxWidgetsPage::OnComboBox)
216 EVT_TEXT(ODComboPage_Combo, ODComboboxWidgetsPage::OnComboText)
217 EVT_TEXT_ENTER(ODComboPage_Combo, ODComboboxWidgetsPage::OnComboText)
218
219 EVT_CHECKBOX(wxID_ANY, ODComboboxWidgetsPage::OnCheckOrRadioBox)
220 EVT_RADIOBOX(wxID_ANY, ODComboboxWidgetsPage::OnCheckOrRadioBox)
221 END_EVENT_TABLE()
222
223 // ============================================================================
224 // implementation
225 // ============================================================================
226
227 //
228 // wxOwnerDrawnComboBox needs to subclassed so that owner-drawing
229 // callbacks can be implemented.
230 class DemoODComboBox : public wxOwnerDrawnComboBox
231 {
232 public:
233 virtual void OnDrawItem(wxDC& dc,
234 const wxRect& rect,
235 int item,
236 int WXUNUSED(flags)) const
237 {
238 if ( item == wxNOT_FOUND )
239 return;
240
241 wxColour txtCol;
242 int mod = item % 4;
243
244 if ( mod == 0 )
245 txtCol = *wxBLACK;
246 else if ( mod == 1 )
247 txtCol = *wxRED;
248 else if ( mod == 2 )
249 txtCol = *wxGREEN;
250 else
251 txtCol = *wxBLUE;
252
253 dc.SetTextForeground(txtCol);
254
255 dc.DrawText(GetString(item),
256 rect.x + 3,
257 rect.y + ((rect.height - dc.GetCharHeight())/2)
258 );
259 }
260
261 virtual void OnDrawBackground(wxDC& dc, const wxRect& rect,
262 int item, int flags ) const
263 {
264
265 // If item is selected or even, or we are painting the
266 // combo control itself, use the default rendering.
267 if ( GetVListBoxComboPopup()->IsCurrent((size_t)item) ||
268 (flags & wxODCB_PAINTING_CONTROL) ||
269 (item & 1) == 0 )
270 {
271 wxOwnerDrawnComboBox::OnDrawBackground(dc,rect,item,flags);
272 return;
273 }
274
275 // Otherwise, draw every other background with different colour.
276 wxColour bgCol(240,240,250);
277 dc.SetBrush(wxBrush(bgCol));
278 dc.SetPen(wxPen(bgCol));
279 dc.DrawRectangle(rect);
280 }
281
282 virtual wxCoord OnMeasureItem(size_t WXUNUSED(item)) const
283 {
284 return 48;
285 }
286
287 virtual wxCoord OnMeasureItemWidth(size_t WXUNUSED(item)) const
288 {
289 return -1; // default - will be measured from text width
290 }
291 };
292
293
294 IMPLEMENT_WIDGETS_PAGE(ODComboboxWidgetsPage, _T("OwnerDrawnCombobox"),
295 GENERIC_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS
296 );
297
298 ODComboboxWidgetsPage::ODComboboxWidgetsPage(WidgetsBookCtrl *book,
299 wxImageList *imaglist)
300 : WidgetsPage(book, imaglist, odcombobox_xpm)
301 {
302 // init everything
303 m_chkSort =
304 m_chkReadonly =
305 m_chkDclickcycles = (wxCheckBox *)NULL;
306
307 m_combobox = (wxOwnerDrawnComboBox *)NULL;
308 m_sizerCombo = (wxSizer *)NULL;
309 }
310
311 void ODComboboxWidgetsPage::CreateContent()
312 {
313 /*
314 What we create here is a frame having 3 panes: style pane is the
315 leftmost one, in the middle the pane with buttons allowing to perform
316 miscellaneous combobox operations and the pane containing the combobox
317 itself to the right
318 */
319 wxTextCtrl *text;
320 wxSizer *sizerRow;
321
322 wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
323
324 wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
325
326 // left pane - style box
327 wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style"));
328
329 wxSizer *sizerStyle = new wxStaticBoxSizer(box, wxVERTICAL);
330
331 m_chkSort = CreateCheckBoxAndAddToSizer(sizerStyle, _T("&Sort items"));
332 m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerStyle, _T("&Read only"));
333 m_chkDclickcycles = CreateCheckBoxAndAddToSizer(sizerStyle, _T("&Double-click Cycles"));
334
335 sizerStyle->AddSpacer(4);
336
337 m_chkBitmapbutton = CreateCheckBoxAndAddToSizer(sizerStyle, _T("&Bitmap button"));
338 m_chkStdbutton = CreateCheckBoxAndAddToSizer(sizerStyle, _T("B&lank button background"));
339
340 wxButton *btn = new wxButton(this, ODComboPage_Reset, _T("&Reset"));
341 sizerStyle->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 3);
342
343 sizerLeft->Add(sizerStyle, 0, wxGROW | wxALIGN_CENTRE_HORIZONTAL);
344
345 // left pane - popup adjustment box
346 box = new wxStaticBox(this, wxID_ANY, _T("Adjust &popup"));
347
348 wxSizer *sizerPopupPos = new wxStaticBoxSizer(box, wxVERTICAL);
349
350 sizerRow = CreateSizerWithTextAndLabel(_T("Min. Width:"),
351 ODComboPage_PopupMinWidth,
352 &m_textPopupMinWidth);
353 m_textPopupMinWidth->SetValue(wxT("-1"));
354 sizerPopupPos->Add(sizerRow, 0, wxALL | wxGROW, 5);
355
356 sizerRow = CreateSizerWithTextAndLabel(_T("Max. Height:"),
357 ODComboPage_PopupHeight,
358 &m_textPopupHeight);
359 m_textPopupHeight->SetValue(wxT("-1"));
360 sizerPopupPos->Add(sizerRow, 0, wxALL | wxGROW, 5);
361
362 m_chkAlignpopupright = CreateCheckBoxAndAddToSizer(sizerPopupPos, _T("Align Right"));
363
364 sizerLeft->Add(sizerPopupPos, 0, wxGROW | wxALIGN_CENTRE_HORIZONTAL | wxTOP, 2);
365
366 // left pane - button adjustment box
367 box = new wxStaticBox(this, wxID_ANY, _T("Adjust &button"));
368
369 wxSizer *sizerButtonPos = new wxStaticBoxSizer(box, wxVERTICAL);
370
371 sizerRow = CreateSizerWithTextAndLabel(_T("Width:"),
372 ODComboPage_ButtonWidth,
373 &m_textButtonWidth);
374 m_textButtonWidth->SetValue(wxT("-1"));
375 sizerButtonPos->Add(sizerRow, 0, wxALL | wxGROW, 5);
376
377 sizerRow = CreateSizerWithTextAndLabel(_T("VSpacing:"),
378 ODComboPage_ButtonSpacing,
379 &m_textButtonSpacing);
380 m_textButtonSpacing->SetValue(wxT("0"));
381 sizerButtonPos->Add(sizerRow, 0, wxALL | wxGROW, 5);
382
383 sizerRow = CreateSizerWithTextAndLabel(_T("Height:"),
384 ODComboPage_ButtonHeight,
385 &m_textButtonHeight);
386 m_textButtonHeight->SetValue(wxT("-1"));
387 sizerButtonPos->Add(sizerRow, 0, wxALL | wxGROW, 5);
388
389 m_chkAlignbutleft = CreateCheckBoxAndAddToSizer(sizerButtonPos, _T("Align Left"));
390
391 sizerLeft->Add(sizerButtonPos, 0, wxGROW | wxALIGN_CENTRE_HORIZONTAL | wxTOP, 2);
392
393 // middle pane
394 wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,
395 _T("&Change combobox contents"));
396 wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
397
398 sizerRow = CreateSizerWithTextAndLabel(_T("Current selection"),
399 ODComboPage_CurText,
400 &text);
401 text->SetEditable(false);
402
403 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
404
405 sizerRow = CreateSizerWithTextAndLabel(_T("Insertion Point"),
406 ODComboPage_InsertionPointText,
407 &text);
408 text->SetEditable(false);
409
410 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
411
412 sizerRow = CreateSizerWithTextAndButton(ODComboPage_Insert,
413 _T("&Insert this string"),
414 ODComboPage_InsertText,
415 &m_textInsert);
416 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
417
418 sizerRow = CreateSizerWithTextAndButton(ODComboPage_Add,
419 _T("&Add this string"),
420 ODComboPage_AddText,
421 &m_textAdd);
422 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
423
424 btn = new wxButton(this, ODComboPage_AddSeveral, _T("&Append a few strings"));
425 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
426
427 btn = new wxButton(this, ODComboPage_AddMany, _T("Append &many strings"));
428 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
429
430 sizerRow = CreateSizerWithTextAndButton(ODComboPage_Change,
431 _T("C&hange current"),
432 ODComboPage_ChangeText,
433 &m_textChange);
434 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
435
436 sizerRow = CreateSizerWithTextAndButton(ODComboPage_Delete,
437 _T("&Delete this item"),
438 ODComboPage_DeleteText,
439 &m_textDelete);
440 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
441
442 btn = new wxButton(this, ODComboPage_DeleteSel, _T("Delete &selection"));
443 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
444
445 btn = new wxButton(this, ODComboPage_Clear, _T("&Clear"));
446 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
447
448 // right pane
449 wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
450 m_combobox = new DemoODComboBox();
451 m_combobox->Create(this, ODComboPage_Combo, wxEmptyString,
452 wxDefaultPosition, wxDefaultSize,
453 0, NULL,
454 0);
455 sizerRight->Add(m_combobox, 0, wxGROW | wxALL, 5);
456 sizerRight->SetMinSize(150, 0);
457 m_sizerCombo = sizerRight; // save it to modify it later
458
459 // the 3 panes panes compose the window
460 sizerTop->Add(sizerLeft, 4, wxGROW | (wxALL & ~wxLEFT), 10);
461 sizerTop->Add(sizerMiddle, 5, wxGROW | wxALL, 10);
462 sizerTop->Add(sizerRight, 4, wxGROW | (wxALL & ~wxRIGHT), 10);
463
464 // final initializations
465 Reset();
466
467 SetSizer(sizerTop);
468
469 sizerTop->Fit(this);
470 }
471
472 // ----------------------------------------------------------------------------
473 // operations
474 // ----------------------------------------------------------------------------
475
476 void ODComboboxWidgetsPage::Reset()
477 {
478 m_chkSort->SetValue(false);
479 m_chkReadonly->SetValue(false);
480 m_chkDclickcycles->SetValue(false);
481 m_chkDclickcycles->Enable(false);
482 m_chkBitmapbutton->SetValue(false);
483 m_chkStdbutton->SetValue(false);
484 m_chkStdbutton->Enable(false);
485 }
486
487 void ODComboboxWidgetsPage::CreateCombo()
488 {
489 int flags = ms_defaultFlags;
490
491 if ( m_chkSort->GetValue() )
492 flags |= wxCB_SORT;
493 if ( m_chkReadonly->GetValue() )
494 flags |= wxCB_READONLY;
495 if ( m_chkDclickcycles->GetValue() )
496 flags |= wxODCB_DCLICK_CYCLES;
497
498 wxArrayString items;
499 if ( m_combobox )
500 {
501 unsigned int count = m_combobox->GetCount();
502 for ( unsigned int n = 0; n < count; n++ )
503 {
504 items.Add(m_combobox->GetString(n));
505 }
506
507 m_sizerCombo->Detach( m_combobox );
508 delete m_combobox;
509 }
510
511 m_combobox = new DemoODComboBox();
512 m_combobox->Create(this, ODComboPage_Combo, wxEmptyString,
513 wxDefaultPosition, wxDefaultSize,
514 0, NULL,
515 flags);
516
517 unsigned int count = items.GetCount();
518 for ( unsigned int n = 0; n < count; n++ )
519 {
520 m_combobox->Append(items[n]);
521 }
522
523 // Update from controls that edit popup position etc.
524
525 wxUpdateUIEvent tempEvt;
526 OnTextPopupWidth(tempEvt);
527 OnTextPopupHeight(tempEvt);
528 GetButtonPosition();
529
530 m_combobox->SetPopupAnchor( m_chkAlignpopupright->GetValue() ? wxRIGHT : wxLEFT );
531
532 if ( m_chkBitmapbutton->GetValue() )
533 {
534 wxBitmap bmpNormal = CreateBitmap(wxColour(0,0,255));
535 wxBitmap bmpPressed = CreateBitmap(wxColour(0,0,128));
536 wxBitmap bmpHover = CreateBitmap(wxColour(128,128,255));
537 m_combobox->SetButtonBitmaps(bmpNormal,m_chkStdbutton->GetValue(),bmpPressed,bmpHover);
538 }
539
540 m_sizerCombo->Add(m_combobox, 0, wxGROW | wxALL, 5);
541 m_sizerCombo->Layout();
542 }
543
544 // ----------------------------------------------------------------------------
545 // event handlers
546 // ----------------------------------------------------------------------------
547
548 void ODComboboxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
549 {
550 Reset();
551
552 CreateCombo();
553 }
554
555 void ODComboboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
556 {
557 int sel = m_combobox->GetSelection();
558 if ( sel != wxNOT_FOUND )
559 {
560 #ifndef __WXGTK__
561 m_combobox->SetString(sel, m_textChange->GetValue());
562 #else
563 wxLogMessage(_T("Not implemented in wxGTK"));
564 #endif
565 }
566 }
567
568 void ODComboboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
569 {
570 unsigned long n;
571 if ( !m_textDelete->GetValue().ToULong(&n) ||
572 (n >= m_combobox->GetCount()) )
573 {
574 return;
575 }
576
577 m_combobox->Delete(n);
578 }
579
580 void ODComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
581 {
582 int sel = m_combobox->GetSelection();
583 if ( sel != wxNOT_FOUND )
584 {
585 m_combobox->Delete(sel);
586 }
587 }
588
589 void ODComboboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
590 {
591 m_combobox->Clear();
592 }
593
594 void ODComboboxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
595 {
596 static unsigned int s_item = 0;
597
598 wxString s = m_textInsert->GetValue();
599 if ( !m_textInsert->IsModified() )
600 {
601 // update the default string
602 m_textInsert->SetValue(wxString::Format(_T("test item %u"), ++s_item));
603 }
604
605 if (m_combobox->GetSelection() >= 0)
606 m_combobox->Insert(s, m_combobox->GetSelection());
607 }
608
609 void ODComboboxWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
610 {
611 static unsigned int s_item = 0;
612
613 wxString s = m_textAdd->GetValue();
614 if ( !m_textAdd->IsModified() )
615 {
616 // update the default string
617 m_textAdd->SetValue(wxString::Format(_T("test item %u"), ++s_item));
618 }
619
620 m_combobox->Append(s);
621 }
622
623 void ODComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
624 {
625 // "many" means 1000 here
626 for ( unsigned int n = 0; n < 1000; n++ )
627 {
628 m_combobox->Append(wxString::Format(_T("item #%u"), n));
629 }
630 }
631
632 void ODComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
633 {
634 m_combobox->Append(_T("First"));
635 m_combobox->Append(_T("another one"));
636 m_combobox->Append(_T("and the last (very very very very very very very very very very long) one"));
637 }
638
639 void ODComboboxWidgetsPage::OnTextPopupWidth(wxCommandEvent& WXUNUSED(event))
640 {
641 long l = 0;
642
643 m_textPopupMinWidth->GetValue().ToLong(&l);
644
645 if (m_combobox && l > 0)
646 {
647 m_combobox->SetPopupMinWidth(l);
648 }
649 }
650
651 void ODComboboxWidgetsPage::OnTextPopupHeight(wxCommandEvent& WXUNUSED(event))
652 {
653 long l = 0;
654
655 m_textPopupHeight->GetValue().ToLong(&l);
656
657 if (m_combobox && l > 0)
658 {
659 m_combobox->SetPopupMaxHeight(l);
660 }
661 }
662
663 void ODComboboxWidgetsPage::GetButtonPosition()
664 {
665 long w = -1;
666 long h = -1;
667 long spacing = 0;
668
669 m_textButtonWidth->GetValue().ToLong(&w);
670 m_textButtonSpacing->GetValue().ToLong(&spacing);
671 m_textButtonHeight->GetValue().ToLong(&h);
672 int align = m_chkAlignbutleft->GetValue() ?
673 wxLEFT : wxRIGHT;
674
675 m_combobox->SetButtonPosition(w,h,align,spacing);
676 }
677
678 void ODComboboxWidgetsPage::OnTextButtonAll(wxCommandEvent& WXUNUSED(event))
679 {
680 if (m_combobox)
681 {
682 if ( m_chkBitmapbutton->GetValue() )
683 CreateCombo();
684 else
685 GetButtonPosition();
686 }
687 }
688
689 void ODComboboxWidgetsPage::OnUpdateUICurText(wxUpdateUIEvent& event)
690 {
691 if (m_combobox)
692 event.SetText( wxString::Format(_T("%d"), m_combobox->GetSelection()) );
693 }
694
695 void ODComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent& event)
696 {
697 if (m_combobox)
698 event.SetText( wxString::Format(_T("%ld"), m_combobox->GetInsertionPoint()) );
699 }
700
701 void ODComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
702 {
703 if (m_combobox)
704 event.Enable( m_chkSort->GetValue() || m_chkReadonly->GetValue() ||
705 m_chkBitmapbutton->GetValue() );
706 }
707
708 void ODComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent& event)
709 {
710 if (m_combobox)
711 {
712 bool enable = !(m_combobox->GetWindowStyle() & wxCB_SORT) &&
713 (m_combobox->GetSelection() >= 0);
714
715 event.Enable(enable);
716 }
717 }
718
719 void ODComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
720 {
721 if (m_combobox)
722 {
723 unsigned long n;
724 event.Enable(m_textDelete->GetValue().ToULong(&n) &&
725 (n < (unsigned)m_combobox->GetCount()));
726 }
727 }
728
729 void ODComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
730 {
731 if (m_combobox)
732 event.Enable(m_combobox->GetSelection() != wxNOT_FOUND);
733 }
734
735 void ODComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
736 {
737 if (m_combobox)
738 event.Enable(m_combobox->GetCount() != 0);
739 }
740
741 void ODComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
742 {
743 if (m_combobox)
744 event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
745 }
746
747 void ODComboboxWidgetsPage::OnComboText(wxCommandEvent& event)
748 {
749 if (!m_combobox)
750 return;
751
752 wxString s = event.GetString();
753
754 wxASSERT_MSG( s == m_combobox->GetValue(),
755 _T("event and combobox values should be the same") );
756
757 if (event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER)
758 wxLogMessage(_T("OwnerDrawnCombobox enter pressed (now '%s')"), s.c_str());
759 else
760 wxLogMessage(_T("OwnerDrawnCombobox text changed (now '%s')"), s.c_str());
761 }
762
763 void ODComboboxWidgetsPage::OnComboBox(wxCommandEvent& event)
764 {
765 long sel = event.GetInt();
766 m_textDelete->SetValue(wxString::Format(_T("%ld"), sel));
767
768 wxLogMessage(_T("OwnerDrawnCombobox item %ld selected"), sel);
769
770 wxLogMessage(_T("OwnerDrawnCombobox GetValue(): %s"), m_combobox->GetValue().c_str() );
771 }
772
773 void ODComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event)
774 {
775 wxObject* ctrl = event.GetEventObject();
776
777 // Double-click cycles only applies to read-only combobox
778 if ( ctrl == (wxObject*) m_chkReadonly )
779 {
780 m_chkDclickcycles->Enable( m_chkReadonly->GetValue() );
781 }
782 else if ( ctrl == (wxObject*) m_chkBitmapbutton )
783 {
784 m_chkStdbutton->Enable( m_chkBitmapbutton->GetValue() );
785 }
786 else if ( ctrl == (wxObject*) m_chkAlignbutleft )
787 {
788 wxUpdateUIEvent tempEvt;
789 OnTextButtonAll(tempEvt);
790 }
791
792 CreateCombo();
793 }
794
795 wxBitmap ODComboboxWidgetsPage::CreateBitmap(const wxColour& colour)
796 {
797 int ch = m_combobox->GetClientSize().y - 1;
798 int h0 = ch - 5;
799
800 long w = -1;
801 long h = -1;
802
803 m_textButtonWidth->GetValue().ToLong(&w);
804 m_textButtonHeight->GetValue().ToLong(&h);
805
806 if ( w <= 0 )
807 w = h0 - 1;
808 if ( h <= 0 )
809 h = h0;
810 if ( h > ch )
811 h = ch;
812
813 wxMemoryDC dc;
814 wxBitmap bmp(w,h);
815 dc.SelectObject(bmp);
816
817 // Draw transparent background
818 wxColour magic(255,0,255);
819 wxBrush magicBrush(magic);
820 dc.SetBrush(magicBrush);
821 dc.SetPen(*wxTRANSPARENT_PEN);
822 dc.DrawRectangle(0,0,bmp.GetWidth(),bmp.GetHeight());
823
824 // Draw image content
825 dc.SetBrush(wxBrush(colour));
826 dc.DrawCircle(h/2,h/2+1,(h/2));
827
828 dc.SelectObject(wxNullBitmap);
829
830 // Finalize transparency with a mask
831 wxMask *mask = new wxMask(bmp, magic);
832 bmp.SetMask(mask);
833
834 return bmp;
835 }
836
837 #endif //wxUSE_ODCOMBOBOX