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
8 // Copyright: (c) 2006 Jaakko Salli
9 // License: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // for compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
29 // for all others, include the necessary headers
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"
43 #include "wx/dcmemory.h"
45 #include "wx/odcombo.h"
50 #include "icons/odcombobox.xpm"
52 // ----------------------------------------------------------------------------
54 // ----------------------------------------------------------------------------
59 ODComboPage_Reset
= wxID_HIGHEST
,
60 ODComboPage_PopupMinWidth
,
61 ODComboPage_PopupHeight
,
62 ODComboPage_ButtonWidth
,
63 ODComboPage_ButtonHeight
,
64 ODComboPage_ButtonSpacing
,
66 ODComboPage_InsertionPointText
,
68 ODComboPage_InsertText
,
71 ODComboPage_AddSeveral
,
75 ODComboPage_ChangeText
,
77 ODComboPage_DeleteText
,
78 ODComboPage_DeleteSel
,
83 // ----------------------------------------------------------------------------
84 // ODComboboxWidgetsPage
85 // ----------------------------------------------------------------------------
87 class ODComboboxWidgetsPage
: public WidgetsPage
90 ODComboboxWidgetsPage(WidgetsBookCtrl
*book
, wxImageList
*imaglist
);
92 virtual wxControl
*GetWidget() const { return m_combobox
; }
93 virtual void RecreateWidget() { CreateCombo(); }
95 // lazy creation of the content
96 virtual void CreateContent();
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
);
110 void OnComboBox(wxCommandEvent
& event
);
111 void OnComboText(wxCommandEvent
& event
);
113 void OnCheckOrRadioBox(wxCommandEvent
& event
);
115 void OnTextPopupWidth(wxCommandEvent
& event
);
116 void OnTextPopupHeight(wxCommandEvent
& event
);
117 void OnTextButtonAll(wxCommandEvent
& event
);
119 void OnUpdateUICurText(wxUpdateUIEvent
& event
);
120 void OnUpdateUIInsertionPointText(wxUpdateUIEvent
& event
);
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
);
129 // reset the odcombobox parameters
132 // (re)create the odcombobox
135 // helper that gets all button values from controls and calls SetButtonPosition
136 void GetButtonPosition();
138 // helper to create the button bitmap
139 wxBitmap
CreateBitmap(const wxColour
& colour
);
144 // the checkboxes for styles
145 wxCheckBox
*m_chkSort
,
151 // the text entries for popup and button adjustment
152 wxTextCtrl
*m_textPopupMinWidth
,
156 *m_textButtonSpacing
;
158 // the checkboxes for same
159 wxCheckBox
*m_chkAlignpopupright
,
162 // the combobox itself and the sizer it is in
163 wxOwnerDrawnComboBox
*m_combobox
;
164 wxSizer
*m_sizerCombo
;
166 // the text entries for "Add/change string" and "Delete" buttons
167 wxTextCtrl
*m_textInsert
,
173 DECLARE_EVENT_TABLE()
174 DECLARE_WIDGETS_PAGE(ODComboboxWidgetsPage
)
177 // ----------------------------------------------------------------------------
179 // ----------------------------------------------------------------------------
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
)
192 EVT_TEXT_ENTER(ODComboPage_InsertText
, ODComboboxWidgetsPage::OnButtonInsert
)
193 EVT_TEXT_ENTER(ODComboPage_AddText
, ODComboboxWidgetsPage::OnButtonAdd
)
194 EVT_TEXT_ENTER(ODComboPage_DeleteText
, ODComboboxWidgetsPage::OnButtonDelete
)
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
)
202 EVT_UPDATE_UI(ODComboPage_CurText
, ODComboboxWidgetsPage::OnUpdateUICurText
)
203 EVT_UPDATE_UI(ODComboPage_InsertionPointText
, ODComboboxWidgetsPage::OnUpdateUIInsertionPointText
)
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
)
215 EVT_COMBOBOX(ODComboPage_Combo
, ODComboboxWidgetsPage::OnComboBox
)
216 EVT_TEXT(ODComboPage_Combo
, ODComboboxWidgetsPage::OnComboText
)
217 EVT_TEXT_ENTER(ODComboPage_Combo
, ODComboboxWidgetsPage::OnComboText
)
219 EVT_CHECKBOX(wxID_ANY
, ODComboboxWidgetsPage::OnCheckOrRadioBox
)
220 EVT_RADIOBOX(wxID_ANY
, ODComboboxWidgetsPage::OnCheckOrRadioBox
)
223 // ============================================================================
225 // ============================================================================
228 // wxOwnerDrawnComboBox needs to subclassed so that owner-drawing
229 // callbacks can be implemented.
230 class DemoODComboBox
: public wxOwnerDrawnComboBox
233 virtual void OnDrawItem(wxDC
& dc
,
236 int WXUNUSED(flags
)) const
238 if ( item
== wxNOT_FOUND
)
253 dc
.SetTextForeground(txtCol
);
255 dc
.DrawText(GetString(item
),
257 rect
.y
+ ((rect
.height
- dc
.GetCharHeight())/2)
261 virtual void OnDrawBackground(wxDC
& dc
, const wxRect
& rect
,
262 int item
, int flags
) const
265 // If item is selected or even, or we are painting the
266 // combo control itself, use the default rendering.
267 if ( (flags
& (wxODCB_PAINTING_CONTROL
|wxODCB_PAINTING_SELECTED
)) ||
270 wxOwnerDrawnComboBox::OnDrawBackground(dc
,rect
,item
,flags
);
274 // Otherwise, draw every other background with different colour.
275 wxColour
bgCol(240,240,250);
276 dc
.SetBrush(wxBrush(bgCol
));
277 dc
.SetPen(wxPen(bgCol
));
278 dc
.DrawRectangle(rect
);
281 virtual wxCoord
OnMeasureItem(size_t WXUNUSED(item
)) const
286 virtual wxCoord
OnMeasureItemWidth(size_t WXUNUSED(item
)) const
288 return -1; // default - will be measured from text width
293 IMPLEMENT_WIDGETS_PAGE(ODComboboxWidgetsPage
, _T("OwnerDrawnCombobox"),
294 GENERIC_CTRLS
| WITH_ITEMS_CTRLS
| COMBO_CTRLS
297 ODComboboxWidgetsPage::ODComboboxWidgetsPage(WidgetsBookCtrl
*book
,
298 wxImageList
*imaglist
)
299 : WidgetsPage(book
, imaglist
, odcombobox_xpm
)
304 m_chkDclickcycles
= (wxCheckBox
*)NULL
;
306 m_combobox
= (wxOwnerDrawnComboBox
*)NULL
;
307 m_sizerCombo
= (wxSizer
*)NULL
;
310 void ODComboboxWidgetsPage::CreateContent()
313 What we create here is a frame having 3 panes: style pane is the
314 leftmost one, in the middle the pane with buttons allowing to perform
315 miscellaneous combobox operations and the pane containing the combobox
321 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
323 wxSizer
*sizerLeft
= new wxBoxSizer(wxVERTICAL
);
325 // left pane - style box
326 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, _T("&Set style"));
328 wxSizer
*sizerStyle
= new wxStaticBoxSizer(box
, wxVERTICAL
);
330 m_chkSort
= CreateCheckBoxAndAddToSizer(sizerStyle
, _T("&Sort items"));
331 m_chkReadonly
= CreateCheckBoxAndAddToSizer(sizerStyle
, _T("&Read only"));
332 m_chkDclickcycles
= CreateCheckBoxAndAddToSizer(sizerStyle
, _T("&Double-click Cycles"));
334 sizerStyle
->AddSpacer(4);
336 m_chkBitmapbutton
= CreateCheckBoxAndAddToSizer(sizerStyle
, _T("&Bitmap button"));
337 m_chkStdbutton
= CreateCheckBoxAndAddToSizer(sizerStyle
, _T("B&lank button background"));
339 wxButton
*btn
= new wxButton(this, ODComboPage_Reset
, _T("&Reset"));
340 sizerStyle
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 3);
342 sizerLeft
->Add(sizerStyle
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
);
344 // left pane - popup adjustment box
345 box
= new wxStaticBox(this, wxID_ANY
, _T("Adjust &popup"));
347 wxSizer
*sizerPopupPos
= new wxStaticBoxSizer(box
, wxVERTICAL
);
349 sizerRow
= CreateSizerWithTextAndLabel(_T("Min. Width:"),
350 ODComboPage_PopupMinWidth
,
351 &m_textPopupMinWidth
);
352 m_textPopupMinWidth
->SetValue(wxT("-1"));
353 sizerPopupPos
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
355 sizerRow
= CreateSizerWithTextAndLabel(_T("Max. Height:"),
356 ODComboPage_PopupHeight
,
358 m_textPopupHeight
->SetValue(wxT("-1"));
359 sizerPopupPos
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
361 m_chkAlignpopupright
= CreateCheckBoxAndAddToSizer(sizerPopupPos
, _T("Align Right"));
363 sizerLeft
->Add(sizerPopupPos
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
| wxTOP
, 2);
365 // left pane - button adjustment box
366 box
= new wxStaticBox(this, wxID_ANY
, _T("Adjust &button"));
368 wxSizer
*sizerButtonPos
= new wxStaticBoxSizer(box
, wxVERTICAL
);
370 sizerRow
= CreateSizerWithTextAndLabel(_T("Width:"),
371 ODComboPage_ButtonWidth
,
373 m_textButtonWidth
->SetValue(wxT("-1"));
374 sizerButtonPos
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
376 sizerRow
= CreateSizerWithTextAndLabel(_T("VSpacing:"),
377 ODComboPage_ButtonSpacing
,
378 &m_textButtonSpacing
);
379 m_textButtonSpacing
->SetValue(wxT("0"));
380 sizerButtonPos
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
382 sizerRow
= CreateSizerWithTextAndLabel(_T("Height:"),
383 ODComboPage_ButtonHeight
,
384 &m_textButtonHeight
);
385 m_textButtonHeight
->SetValue(wxT("-1"));
386 sizerButtonPos
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
388 m_chkAlignbutleft
= CreateCheckBoxAndAddToSizer(sizerButtonPos
, _T("Align Left"));
390 sizerLeft
->Add(sizerButtonPos
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
| wxTOP
, 2);
393 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
,
394 _T("&Change combobox contents"));
395 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
397 sizerRow
= CreateSizerWithTextAndLabel(_T("Current selection"),
400 text
->SetEditable(false);
402 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
404 sizerRow
= CreateSizerWithTextAndLabel(_T("Insertion Point"),
405 ODComboPage_InsertionPointText
,
407 text
->SetEditable(false);
409 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
411 sizerRow
= CreateSizerWithTextAndButton(ODComboPage_Insert
,
412 _T("&Insert this string"),
413 ODComboPage_InsertText
,
415 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
417 sizerRow
= CreateSizerWithTextAndButton(ODComboPage_Add
,
418 _T("&Add this string"),
421 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
423 btn
= new wxButton(this, ODComboPage_AddSeveral
, _T("&Append a few strings"));
424 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
426 btn
= new wxButton(this, ODComboPage_AddMany
, _T("Append &many strings"));
427 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
429 sizerRow
= CreateSizerWithTextAndButton(ODComboPage_Change
,
430 _T("C&hange current"),
431 ODComboPage_ChangeText
,
433 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
435 sizerRow
= CreateSizerWithTextAndButton(ODComboPage_Delete
,
436 _T("&Delete this item"),
437 ODComboPage_DeleteText
,
439 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
441 btn
= new wxButton(this, ODComboPage_DeleteSel
, _T("Delete &selection"));
442 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
444 btn
= new wxButton(this, ODComboPage_Clear
, _T("&Clear"));
445 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
448 wxSizer
*sizerRight
= new wxBoxSizer(wxVERTICAL
);
449 m_combobox
= new DemoODComboBox();
450 m_combobox
->Create(this, ODComboPage_Combo
, wxEmptyString
,
451 wxDefaultPosition
, wxDefaultSize
,
454 sizerRight
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
455 sizerRight
->SetMinSize(150, 0);
456 m_sizerCombo
= sizerRight
; // save it to modify it later
458 // the 3 panes panes compose the window
459 sizerTop
->Add(sizerLeft
, 4, wxGROW
| (wxALL
& ~wxLEFT
), 10);
460 sizerTop
->Add(sizerMiddle
, 5, wxGROW
| wxALL
, 10);
461 sizerTop
->Add(sizerRight
, 4, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
463 // final initializations
469 // ----------------------------------------------------------------------------
471 // ----------------------------------------------------------------------------
473 void ODComboboxWidgetsPage::Reset()
475 m_chkSort
->SetValue(false);
476 m_chkReadonly
->SetValue(false);
477 m_chkDclickcycles
->SetValue(false);
478 m_chkDclickcycles
->Enable(false);
479 m_chkBitmapbutton
->SetValue(false);
480 m_chkStdbutton
->SetValue(false);
481 m_chkStdbutton
->Enable(false);
484 void ODComboboxWidgetsPage::CreateCombo()
486 int flags
= ms_defaultFlags
;
488 if ( m_chkSort
->GetValue() )
490 if ( m_chkReadonly
->GetValue() )
491 flags
|= wxCB_READONLY
;
492 if ( m_chkDclickcycles
->GetValue() )
493 flags
|= wxODCB_DCLICK_CYCLES
;
498 unsigned int count
= m_combobox
->GetCount();
499 for ( unsigned int n
= 0; n
< count
; n
++ )
501 items
.Add(m_combobox
->GetString(n
));
504 m_sizerCombo
->Detach( m_combobox
);
508 m_combobox
= new DemoODComboBox();
509 m_combobox
->Create(this, ODComboPage_Combo
, wxEmptyString
,
510 wxDefaultPosition
, wxDefaultSize
,
514 unsigned int count
= items
.GetCount();
515 for ( unsigned int n
= 0; n
< count
; n
++ )
517 m_combobox
->Append(items
[n
]);
520 // Update from controls that edit popup position etc.
522 wxUpdateUIEvent tempEvt
;
523 OnTextPopupWidth(tempEvt
);
524 OnTextPopupHeight(tempEvt
);
527 m_combobox
->SetPopupAnchor( m_chkAlignpopupright
->GetValue() ? wxRIGHT
: wxLEFT
);
529 if ( m_chkBitmapbutton
->GetValue() )
531 wxBitmap bmpNormal
= CreateBitmap(wxColour(0,0,255));
532 wxBitmap bmpPressed
= CreateBitmap(wxColour(0,0,128));
533 wxBitmap bmpHover
= CreateBitmap(wxColour(128,128,255));
534 m_combobox
->SetButtonBitmaps(bmpNormal
,m_chkStdbutton
->GetValue(),bmpPressed
,bmpHover
);
537 m_sizerCombo
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
538 m_sizerCombo
->Layout();
541 // ----------------------------------------------------------------------------
543 // ----------------------------------------------------------------------------
545 void ODComboboxWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
552 void ODComboboxWidgetsPage::OnButtonChange(wxCommandEvent
& WXUNUSED(event
))
554 int sel
= m_combobox
->GetSelection();
555 if ( sel
!= wxNOT_FOUND
)
558 m_combobox
->SetString(sel
, m_textChange
->GetValue());
560 wxLogMessage(_T("Not implemented in wxGTK"));
565 void ODComboboxWidgetsPage::OnButtonDelete(wxCommandEvent
& WXUNUSED(event
))
568 if ( !m_textDelete
->GetValue().ToULong(&n
) ||
569 (n
>= m_combobox
->GetCount()) )
574 m_combobox
->Delete(n
);
577 void ODComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent
& WXUNUSED(event
))
579 int sel
= m_combobox
->GetSelection();
580 if ( sel
!= wxNOT_FOUND
)
582 m_combobox
->Delete(sel
);
586 void ODComboboxWidgetsPage::OnButtonClear(wxCommandEvent
& WXUNUSED(event
))
591 void ODComboboxWidgetsPage::OnButtonInsert(wxCommandEvent
& WXUNUSED(event
))
593 static unsigned int s_item
= 0;
595 wxString s
= m_textInsert
->GetValue();
596 if ( !m_textInsert
->IsModified() )
598 // update the default string
599 m_textInsert
->SetValue(wxString::Format(_T("test item %u"), ++s_item
));
602 if (m_combobox
->GetSelection() >= 0)
603 m_combobox
->Insert(s
, m_combobox
->GetSelection());
606 void ODComboboxWidgetsPage::OnButtonAdd(wxCommandEvent
& WXUNUSED(event
))
608 static unsigned int s_item
= 0;
610 wxString s
= m_textAdd
->GetValue();
611 if ( !m_textAdd
->IsModified() )
613 // update the default string
614 m_textAdd
->SetValue(wxString::Format(_T("test item %u"), ++s_item
));
617 m_combobox
->Append(s
);
620 void ODComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent
& WXUNUSED(event
))
622 // "many" means 1000 here
623 for ( unsigned int n
= 0; n
< 1000; n
++ )
625 m_combobox
->Append(wxString::Format(_T("item #%u"), n
));
629 void ODComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent
& WXUNUSED(event
))
631 m_combobox
->Append(_T("First"));
632 m_combobox
->Append(_T("another one"));
633 m_combobox
->Append(_T("and the last (very very very very very very very very very very long) one"));
636 void ODComboboxWidgetsPage::OnTextPopupWidth(wxCommandEvent
& WXUNUSED(event
))
640 m_textPopupMinWidth
->GetValue().ToLong(&l
);
642 if (m_combobox
&& l
> 0)
644 m_combobox
->SetPopupMinWidth(l
);
648 void ODComboboxWidgetsPage::OnTextPopupHeight(wxCommandEvent
& WXUNUSED(event
))
652 m_textPopupHeight
->GetValue().ToLong(&l
);
654 if (m_combobox
&& l
> 0)
656 m_combobox
->SetPopupMaxHeight(l
);
660 void ODComboboxWidgetsPage::GetButtonPosition()
666 m_textButtonWidth
->GetValue().ToLong(&w
);
667 m_textButtonSpacing
->GetValue().ToLong(&spacing
);
668 m_textButtonHeight
->GetValue().ToLong(&h
);
669 int align
= m_chkAlignbutleft
->GetValue() ?
672 m_combobox
->SetButtonPosition(w
,h
,align
,spacing
);
675 void ODComboboxWidgetsPage::OnTextButtonAll(wxCommandEvent
& WXUNUSED(event
))
679 if ( m_chkBitmapbutton
->GetValue() )
686 void ODComboboxWidgetsPage::OnUpdateUICurText(wxUpdateUIEvent
& event
)
689 event
.SetText( wxString::Format(_T("%d"), m_combobox
->GetSelection()) );
692 void ODComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent
& event
)
695 event
.SetText( wxString::Format(_T("%ld"), m_combobox
->GetInsertionPoint()) );
698 void ODComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent
& event
)
701 event
.Enable( m_chkSort
->GetValue() || m_chkReadonly
->GetValue() ||
702 m_chkBitmapbutton
->GetValue() );
705 void ODComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent
& event
)
709 bool enable
= !(m_combobox
->GetWindowStyle() & wxCB_SORT
) &&
710 (m_combobox
->GetSelection() >= 0);
712 event
.Enable(enable
);
716 void ODComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
)
721 event
.Enable(m_textDelete
->GetValue().ToULong(&n
) &&
722 (n
< (unsigned)m_combobox
->GetCount()));
726 void ODComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent
& event
)
729 event
.Enable(m_combobox
->GetSelection() != wxNOT_FOUND
);
732 void ODComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent
& event
)
735 event
.Enable(m_combobox
->GetCount() != 0);
738 void ODComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent
& event
)
741 event
.Enable(!(m_combobox
->GetWindowStyle() & wxCB_SORT
));
744 void ODComboboxWidgetsPage::OnComboText(wxCommandEvent
& event
)
749 wxString s
= event
.GetString();
751 wxASSERT_MSG( s
== m_combobox
->GetValue(),
752 _T("event and combobox values should be the same") );
754 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
755 wxLogMessage(_T("OwnerDrawnCombobox enter pressed (now '%s')"), s
.c_str());
757 wxLogMessage(_T("OwnerDrawnCombobox text changed (now '%s')"), s
.c_str());
760 void ODComboboxWidgetsPage::OnComboBox(wxCommandEvent
& event
)
762 long sel
= event
.GetInt();
763 m_textDelete
->SetValue(wxString::Format(_T("%ld"), sel
));
765 wxLogMessage(_T("OwnerDrawnCombobox item %ld selected"), sel
);
767 wxLogMessage(_T("OwnerDrawnCombobox GetValue(): %s"), m_combobox
->GetValue().c_str() );
770 void ODComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& event
)
772 wxObject
* ctrl
= event
.GetEventObject();
774 // Double-click cycles only applies to read-only combobox
775 if ( ctrl
== (wxObject
*) m_chkReadonly
)
777 m_chkDclickcycles
->Enable( m_chkReadonly
->GetValue() );
779 else if ( ctrl
== (wxObject
*) m_chkBitmapbutton
)
781 m_chkStdbutton
->Enable( m_chkBitmapbutton
->GetValue() );
783 else if ( ctrl
== (wxObject
*) m_chkAlignbutleft
)
785 wxUpdateUIEvent tempEvt
;
786 OnTextButtonAll(tempEvt
);
792 wxBitmap
ODComboboxWidgetsPage::CreateBitmap(const wxColour
& colour
)
794 int ch
= m_combobox
->GetClientSize().y
- 1;
800 m_textButtonWidth
->GetValue().ToLong(&w
);
801 m_textButtonHeight
->GetValue().ToLong(&h
);
812 dc
.SelectObject(bmp
);
814 // Draw transparent background
815 wxColour
magic(255,0,255);
816 wxBrush
magicBrush(magic
);
817 dc
.SetBrush(magicBrush
);
818 dc
.SetPen(*wxTRANSPARENT_PEN
);
819 dc
.DrawRectangle(0,0,bmp
.GetWidth(),bmp
.GetHeight());
821 // Draw image content
822 dc
.SetBrush(wxBrush(colour
));
823 dc
.DrawCircle(h
/2,h
/2+1,(h
/2));
825 dc
.SelectObject(wxNullBitmap
);
827 // Finalize transparency with a mask
828 wxMask
*mask
= new wxMask(bmp
, magic
);
834 #endif //wxUSE_ODCOMBOBOX