1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
3 // Name: bmpcombobox.cpp
4 // Purpose: Part of the widgets sample showing wxBitmapComboBox
5 // Author: Jaakko Salli
6 // Created: Sep-01-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"
27 #if wxUSE_BITMAPCOMBOBOX
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"
40 #include "wx/filedlg.h"
43 #include "wx/stattext.h"
45 #include "wx/dcmemory.h"
49 #include "wx/msgdlg.h"
50 #include "wx/filename.h"
52 #include "wx/imaglist.h"
53 #include "wx/bmpcbox.h"
55 #include "itemcontainer.h"
58 #include "icons/bmpcombobox.xpm"
60 // Images loaded from file are reduced this width and height, if larger
61 #define IMG_SIZE_TRUNC 256
64 // ----------------------------------------------------------------------------
66 // ----------------------------------------------------------------------------
71 BitmapComboBoxPage_Reset
= wxID_HIGHEST
,
72 BitmapComboBoxPage_Insert
,
73 BitmapComboBoxPage_InsertText
,
74 BitmapComboBoxPage_ChangeHeight
,
75 BitmapComboBoxPage_LoadFromFile
,
76 BitmapComboBoxPage_SetFromFile
,
77 BitmapComboBoxPage_AddWidgetIcons
,
78 BitmapComboBoxPage_AddSeveralWithImages
,
79 BitmapComboBoxPage_AddSeveral
,
80 BitmapComboBoxPage_AddMany
,
81 BitmapComboBoxPage_Clear
,
82 BitmapComboBoxPage_Change
,
83 BitmapComboBoxPage_Delete
,
84 BitmapComboBoxPage_DeleteText
,
85 BitmapComboBoxPage_DeleteSel
,
86 BitmapComboBoxPage_Combo
,
87 BitmapComboBoxPage_ContainerTests
90 // kinds of comboboxes
98 // ----------------------------------------------------------------------------
99 // BitmapComboBoxWidgetsPage
100 // ----------------------------------------------------------------------------
102 class BitmapComboBoxWidgetsPage
: public ItemContainerWidgetsPage
105 BitmapComboBoxWidgetsPage(WidgetsBookCtrl
*book
, wxImageList
*imaglist
);
107 virtual wxControl
*GetWidget() const { return m_combobox
; }
108 virtual wxItemContainer
* GetContainer() const { return m_combobox
; }
109 virtual void RecreateWidget() { CreateCombo(); }
111 // lazy creation of the content
112 virtual void CreateContent();
116 void OnButtonReset(wxCommandEvent
& event
);
117 void OnButtonChange(wxCommandEvent
& event
);
118 void OnButtonDelete(wxCommandEvent
& event
);
119 void OnButtonDeleteSel(wxCommandEvent
& event
);
120 void OnButtonClear(wxCommandEvent
& event
);
121 void OnButtonInsert(wxCommandEvent
&event
);
122 void OnTextChangeHeight(wxCommandEvent
& event
);
123 void OnButtonLoadFromFile(wxCommandEvent
& event
);
124 void OnButtonSetFromFile(wxCommandEvent
& event
);
125 void OnButtonAddSeveral(wxCommandEvent
& event
);
126 void OnButtonAddSeveralWithImages(wxCommandEvent
& event
);
127 void OnButtonAddWidgetIcons(wxCommandEvent
& event
);
128 void OnButtonAddMany(wxCommandEvent
& event
);
130 void OnComboBox(wxCommandEvent
& event
);
131 void OnDropDown(wxCommandEvent
& event
);
132 void OnCloseUp(wxCommandEvent
& event
);
133 void OnComboText(wxCommandEvent
& event
);
135 void OnCheckOrRadioBox(wxCommandEvent
& event
);
137 void OnTextPopupWidth(wxCommandEvent
& event
);
138 void OnTextPopupHeight(wxCommandEvent
& event
);
139 void OnTextButtonAll(wxCommandEvent
& event
);
141 void OnUpdateUIInsert(wxUpdateUIEvent
& event
);
142 void OnUpdateUIClearButton(wxUpdateUIEvent
& event
);
143 void OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
);
144 void OnUpdateUIItemManipulator(wxUpdateUIEvent
& event
);
145 void OnUpdateUIResetButton(wxUpdateUIEvent
& event
);
147 // reset the bmpcombobox parameters
150 // (re)create the bmpcombobox
153 // helpers for creating bitmaps
154 wxBitmap
CreateBitmap(const wxColour
& colour
);
155 wxBitmap
LoadBitmap(const wxString
& filepath
);
156 wxBitmap
QueryBitmap(wxString
* pStr
);
158 void LoadWidgetImages( wxArrayString
* strings
, wxImageList
* images
);
160 wxSizer
*CreateSizerWithSmallTextAndLabel(const wxString
& label
,
162 wxTextCtrl
**ppText
);
165 void RescaleImage(wxImage
& image
, int w
, int h
);
171 // the sel mode radiobox
172 wxRadioBox
*m_radioKind
;
174 // the checkboxes for styles
175 wxCheckBox
*m_chkSort
,
178 // the combobox itself and the sizer it is in
179 wxBitmapComboBox
*m_combobox
;
180 wxSizer
*m_sizerCombo
;
182 // the text entries for "Add/change string" and "Delete" buttons
183 wxTextCtrl
*m_textInsert
,
189 DECLARE_EVENT_TABLE()
190 DECLARE_WIDGETS_PAGE(BitmapComboBoxWidgetsPage
)
193 // ----------------------------------------------------------------------------
195 // ----------------------------------------------------------------------------
197 BEGIN_EVENT_TABLE(BitmapComboBoxWidgetsPage
, WidgetsPage
)
198 EVT_BUTTON(BitmapComboBoxPage_Reset
, BitmapComboBoxWidgetsPage::OnButtonReset
)
199 EVT_BUTTON(BitmapComboBoxPage_Change
, BitmapComboBoxWidgetsPage::OnButtonChange
)
200 EVT_BUTTON(BitmapComboBoxPage_Delete
, BitmapComboBoxWidgetsPage::OnButtonDelete
)
201 EVT_BUTTON(BitmapComboBoxPage_DeleteSel
, BitmapComboBoxWidgetsPage::OnButtonDeleteSel
)
202 EVT_BUTTON(BitmapComboBoxPage_Clear
, BitmapComboBoxWidgetsPage::OnButtonClear
)
203 EVT_BUTTON(BitmapComboBoxPage_Insert
, BitmapComboBoxWidgetsPage::OnButtonInsert
)
204 EVT_BUTTON(BitmapComboBoxPage_AddSeveral
, BitmapComboBoxWidgetsPage::OnButtonAddSeveral
)
205 EVT_BUTTON(BitmapComboBoxPage_AddSeveralWithImages
, BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages
)
206 EVT_BUTTON(BitmapComboBoxPage_AddWidgetIcons
, BitmapComboBoxWidgetsPage::OnButtonAddWidgetIcons
)
207 EVT_BUTTON(BitmapComboBoxPage_AddMany
, BitmapComboBoxWidgetsPage::OnButtonAddMany
)
208 EVT_BUTTON(BitmapComboBoxPage_LoadFromFile
, BitmapComboBoxWidgetsPage::OnButtonLoadFromFile
)
209 EVT_BUTTON(BitmapComboBoxPage_SetFromFile
, BitmapComboBoxWidgetsPage::OnButtonSetFromFile
)
210 EVT_BUTTON(BitmapComboBoxPage_ContainerTests
, ItemContainerWidgetsPage::OnButtonTestItemContainer
)
212 EVT_TEXT_ENTER(BitmapComboBoxPage_InsertText
, BitmapComboBoxWidgetsPage::OnButtonInsert
)
213 EVT_TEXT(BitmapComboBoxPage_ChangeHeight
, BitmapComboBoxWidgetsPage::OnTextChangeHeight
)
214 EVT_TEXT_ENTER(BitmapComboBoxPage_DeleteText
, BitmapComboBoxWidgetsPage::OnButtonDelete
)
216 EVT_UPDATE_UI(BitmapComboBoxPage_Reset
, BitmapComboBoxWidgetsPage::OnUpdateUIResetButton
)
217 EVT_UPDATE_UI(BitmapComboBoxPage_Insert
, BitmapComboBoxWidgetsPage::OnUpdateUIInsert
)
218 EVT_UPDATE_UI(BitmapComboBoxPage_LoadFromFile
, BitmapComboBoxWidgetsPage::OnUpdateUIInsert
)
219 EVT_UPDATE_UI(BitmapComboBoxPage_Clear
, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton
)
220 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteText
, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton
)
221 EVT_UPDATE_UI(BitmapComboBoxPage_Delete
, BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton
)
222 EVT_UPDATE_UI(BitmapComboBoxPage_Change
, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator
)
223 EVT_UPDATE_UI(BitmapComboBoxPage_SetFromFile
, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator
)
224 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteSel
, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator
)
226 EVT_COMBOBOX_DROPDOWN(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnDropDown
)
227 EVT_COMBOBOX_CLOSEUP(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnCloseUp
)
228 EVT_COMBOBOX(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboBox
)
229 EVT_TEXT(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboText
)
230 EVT_TEXT_ENTER(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboText
)
232 EVT_CHECKBOX(wxID_ANY
, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox
)
233 EVT_RADIOBOX(wxID_ANY
, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox
)
236 // ============================================================================
238 // ============================================================================
240 #if defined(__WXMSW__) || defined(__WXGTK__)
241 #define NATIVE_OR_GENERIC_CTRLS NATIVE_CTRLS
243 #define NATIVE_OR_GENERIC_CTRLS GENERIC_CTRLS
246 IMPLEMENT_WIDGETS_PAGE(BitmapComboBoxWidgetsPage
, wxT("BitmapCombobox"),
247 NATIVE_OR_GENERIC_CTRLS
| WITH_ITEMS_CTRLS
| COMBO_CTRLS
251 BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl
*book
,
252 wxImageList
*imaglist
)
253 : ItemContainerWidgetsPage(book
, imaglist
, bmpcombobox_xpm
)
257 m_chkReadonly
= NULL
;
268 // create a sizer containing a label and a small text ctrl
269 wxSizer
*BitmapComboBoxWidgetsPage::CreateSizerWithSmallTextAndLabel(const wxString
& label
,
273 wxControl
* control
= new wxStaticText(this, wxID_ANY
, label
);
274 wxSizer
*sizerRow
= new wxBoxSizer(wxHORIZONTAL
);
275 wxTextCtrl
*text
= new wxTextCtrl(this, id
, wxEmptyString
,
276 wxDefaultPosition
, wxSize(50,wxDefaultCoord
), wxTE_PROCESS_ENTER
);
278 sizerRow
->Add(control
, 0, wxRIGHT
| wxALIGN_CENTRE_VERTICAL
, 5);
279 sizerRow
->Add(text
, 1, wxFIXED_MINSIZE
| wxLEFT
| wxALIGN_CENTRE_VERTICAL
, 5);
287 void BitmapComboBoxWidgetsPage::CreateContent()
290 What we create here is a frame having 3 panes: style pane is the
291 leftmost one, in the middle the pane with buttons allowing to perform
292 miscellaneous combobox operations and the pane containing the combobox
297 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
299 wxSizer
*sizerLeft
= new wxBoxSizer(wxVERTICAL
);
301 // left pane - style box
302 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, wxT("&Set style"));
305 // should be in sync with ComboKind_XXX values
306 static const wxString kinds
[] =
313 m_radioKind
= new wxRadioBox(this, wxID_ANY
, wxT("Combobox &kind:"),
314 wxDefaultPosition
, wxDefaultSize
,
315 WXSIZEOF(kinds
), kinds
,
316 1, wxRA_SPECIFY_COLS
);
318 wxSizer
*sizerStyle
= new wxStaticBoxSizer(box
, wxVERTICAL
);
320 m_chkSort
= CreateCheckBoxAndAddToSizer(sizerStyle
, wxT("&Sort items"));
321 m_chkReadonly
= CreateCheckBoxAndAddToSizer(sizerStyle
, wxT("&Read only"));
323 wxButton
*btn
= new wxButton(this, BitmapComboBoxPage_Reset
, wxT("&Reset"));
324 sizerStyle
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 3);
326 sizerLeft
->Add(sizerStyle
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
);
327 sizerLeft
->Add(m_radioKind
, 0, wxGROW
| wxALL
, 5);
329 // left pane - other options box
330 box
= new wxStaticBox(this, wxID_ANY
, wxT("Demo options"));
332 wxSizer
*sizerOptions
= new wxStaticBoxSizer(box
, wxVERTICAL
);
334 sizerRow
= CreateSizerWithSmallTextAndLabel(wxT("Control &height:"),
335 BitmapComboBoxPage_ChangeHeight
,
336 &m_textChangeHeight
);
337 m_textChangeHeight
->SetSize(20, wxDefaultCoord
);
338 sizerOptions
->Add(sizerRow
, 0, wxALL
| wxFIXED_MINSIZE
/*| wxGROW*/, 5);
340 sizerLeft
->Add(sizerOptions
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
| wxTOP
, 2);
343 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
,
344 wxT("&Change wxBitmapComboBox contents"));
345 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
347 btn
= new wxButton(this, BitmapComboBoxPage_ContainerTests
, wxT("Run &tests"));
348 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
351 btn
= new wxButton(this, BitmapComboBoxPage_AddWidgetIcons
, wxT("Add &widget icons"));
352 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
354 btn
= new wxButton(this, BitmapComboBoxPage_LoadFromFile
, wxT("Insert image from &file"));
355 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
357 btn
= new wxButton(this, BitmapComboBoxPage_SetFromFile
, wxT("&Set image from file"));
358 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
361 btn
= new wxButton(this, BitmapComboBoxPage_AddSeveralWithImages
, wxT("A&ppend a few strings with images"));
362 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
364 btn
= new wxButton(this, BitmapComboBoxPage_AddSeveral
, wxT("Append a &few strings"));
365 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
367 btn
= new wxButton(this, BitmapComboBoxPage_AddMany
, wxT("Append &many strings"));
368 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
370 sizerRow
= CreateSizerWithTextAndButton(BitmapComboBoxPage_Delete
,
371 wxT("&Delete this item"),
372 BitmapComboBoxPage_DeleteText
,
374 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
376 btn
= new wxButton(this, BitmapComboBoxPage_DeleteSel
, wxT("Delete &selection"));
377 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
379 btn
= new wxButton(this, BitmapComboBoxPage_Clear
, wxT("&Clear"));
380 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
383 wxInitAllImageHandlers();
387 wxSizer
*sizerRight
= new wxBoxSizer(wxVERTICAL
);
388 m_combobox
= new wxBitmapComboBox();
389 m_combobox
->Create(this, BitmapComboBoxPage_Combo
, wxEmptyString
,
390 wxDefaultPosition
, wxDefaultSize
,
394 #if defined(wxGENERIC_BITMAPCOMBOBOX)
395 // This will sure make the list look nicer when larger images are used.
396 m_combobox
->SetPopupMaxHeight(600);
399 sizerRight
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
400 sizerRight
->SetMinSize(150, 0);
401 m_sizerCombo
= sizerRight
; // save it to modify it later
403 // the 3 panes panes compose the window
404 sizerTop
->Add(sizerLeft
, 0, wxGROW
| (wxALL
& ~wxLEFT
), 10);
405 sizerTop
->Add(sizerMiddle
, 5, wxGROW
| wxALL
, 10);
406 sizerTop
->Add(sizerRight
, 4, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
408 // final initializations
414 // ----------------------------------------------------------------------------
416 // ----------------------------------------------------------------------------
418 void BitmapComboBoxWidgetsPage::Reset()
420 m_chkSort
->SetValue(false);
421 m_chkReadonly
->SetValue(true);
424 void BitmapComboBoxWidgetsPage::CreateCombo()
426 int flags
= ms_defaultFlags
;
428 if ( m_chkSort
->GetValue() )
430 if ( m_chkReadonly
->GetValue() )
431 flags
|= wxCB_READONLY
;
433 switch ( m_radioKind
->GetSelection() )
436 wxFAIL_MSG( wxT("unknown combo kind") );
439 case ComboKind_Default
:
442 case ComboKind_Simple
:
443 flags
|= wxCB_SIMPLE
;
446 case ComboKind_DropDown
:
447 flags
= wxCB_DROPDOWN
;
452 wxArrayPtrVoid bitmaps
;
455 unsigned int count
= m_combobox
->GetCount();
456 for ( unsigned int n
= 0; n
< count
; n
++ )
458 items
.Add(m_combobox
->GetString(n
));
459 bitmaps
.Add(new wxBitmap(m_combobox
->GetItemBitmap(n
)));
462 m_sizerCombo
->Detach( m_combobox
);
466 m_combobox
= new wxBitmapComboBox();
467 m_combobox
->Create(this, BitmapComboBoxPage_Combo
, wxEmptyString
,
468 wxDefaultPosition
, wxDefaultSize
,
472 #if defined(wxGENERIC_BITMAPCOMBOBOX)
473 // This will sure make the list look nicer when larger images are used.
474 m_combobox
->SetPopupMaxHeight(600);
477 unsigned int count
= items
.GetCount();
478 for ( unsigned int n
= 0; n
< count
; n
++ )
480 wxBitmap
* bmp
= (wxBitmap
*) bitmaps
[n
];
481 m_combobox
->Append(items
[n
], *bmp
);
485 m_sizerCombo
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
486 m_sizerCombo
->Layout();
488 // Allow changing height inorder to demonstrate flexible
489 // size of image "thumbnail" painted in the control itself.
491 m_textChangeHeight
->GetValue().ToLong(&h
);
493 m_combobox
->SetSize(wxDefaultCoord
, h
);
496 // ----------------------------------------------------------------------------
498 // ----------------------------------------------------------------------------
500 void BitmapComboBoxWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
507 void BitmapComboBoxWidgetsPage::OnButtonChange(wxCommandEvent
& WXUNUSED(event
))
509 int sel
= m_combobox
->GetSelection();
510 if ( sel
!= wxNOT_FOUND
)
513 m_combobox
->SetString(sel
, m_textChange
->GetValue());
515 wxLogMessage(wxT("Not implemented in wxGTK"));
520 void BitmapComboBoxWidgetsPage::OnButtonDelete(wxCommandEvent
& WXUNUSED(event
))
523 if ( !m_textDelete
->GetValue().ToULong(&n
) ||
524 (n
>= m_combobox
->GetCount()) )
529 m_combobox
->Delete(n
);
532 void BitmapComboBoxWidgetsPage::OnButtonDeleteSel(wxCommandEvent
& WXUNUSED(event
))
534 int sel
= m_combobox
->GetSelection();
535 if ( sel
!= wxNOT_FOUND
)
537 m_combobox
->Delete(sel
);
541 void BitmapComboBoxWidgetsPage::OnButtonClear(wxCommandEvent
& WXUNUSED(event
))
546 void BitmapComboBoxWidgetsPage::OnButtonInsert(wxCommandEvent
& WXUNUSED(event
))
548 static unsigned int s_item
= 0;
550 wxString s
= m_textInsert
->GetValue();
551 if ( !m_textInsert
->IsModified() )
553 // update the default string
554 m_textInsert
->SetValue(wxString::Format(wxT("test item %u"), ++s_item
));
557 int sel
= m_combobox
->GetSelection();
558 if ( sel
== wxNOT_FOUND
)
559 sel
= m_combobox
->GetCount();
561 m_combobox
->Insert(s
, wxNullBitmap
, m_combobox
->GetSelection());
564 void BitmapComboBoxWidgetsPage::OnTextChangeHeight(wxCommandEvent
& WXUNUSED(event
))
567 if ( m_textChangeHeight
)
568 m_textChangeHeight
->GetValue().ToLong(&h
);
571 m_combobox
->SetSize(wxDefaultCoord
, h
);
574 void BitmapComboBoxWidgetsPage::OnButtonLoadFromFile(wxCommandEvent
& WXUNUSED(event
))
577 int sel
= m_combobox
->GetSelection();
578 if ( sel
== wxNOT_FOUND
)
579 sel
= m_combobox
->GetCount();
581 wxBitmap bmp
= QueryBitmap(&s
);
583 m_combobox
->Insert(s
, bmp
, sel
);
586 void BitmapComboBoxWidgetsPage::OnButtonSetFromFile(wxCommandEvent
& WXUNUSED(event
))
588 wxBitmap bmp
= QueryBitmap(NULL
);
590 m_combobox
->SetItemBitmap(m_combobox
->GetSelection(), bmp
);
593 void BitmapComboBoxWidgetsPage::OnButtonAddMany(wxCommandEvent
& WXUNUSED(event
))
595 // "many" means 1000 here
596 for ( unsigned int n
= 0; n
< 1000; n
++ )
598 m_combobox
->Append(wxString::Format(wxT("item #%u"), n
));
602 void BitmapComboBoxWidgetsPage::OnButtonAddSeveral(wxCommandEvent
& WXUNUSED(event
))
604 m_combobox
->Append(wxT("First"));
605 m_combobox
->Append(wxT("another one"));
606 m_combobox
->Append(wxT("and the last (very very very very very very very very very very long) one"));
609 void BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages(wxCommandEvent
& WXUNUSED(event
))
611 static const struct TestEntry
617 { "Red circle", 0x0000ff },
618 { "Blue circle", 0xff0000 },
619 { "Green circle", 0x00ff00 },
620 { "Black circle", 0x000000 },
623 for ( unsigned i
= 0; i
< WXSIZEOF(s_entries
); i
++ )
625 const TestEntry
& e
= s_entries
[i
];
626 m_combobox
->Append(e
.text
, CreateBitmap(wxColour(e
.rgb
)));
631 void BitmapComboBoxWidgetsPage::RescaleImage(wxImage
& image
, int w
, int h
)
633 if ( image
.GetWidth() == w
&& image
.GetHeight() == h
)
636 if ( w
<= 0 || h
<= 0 )
639 static bool isFirstScale
= true;
641 if ( isFirstScale
&& m_combobox
->GetCount() > 0 )
643 wxMessageBox( wxT("wxBitmapComboBox normally only supports images of one size. ")
644 wxT("However, for demonstration purposes, loaded bitmaps are scaled to fit ")
645 wxT("using wxImage::Rescale."),
650 isFirstScale
= false;
657 void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString
* strings
, wxImageList
* images
)
661 fn
.AppendDir(wxT("icons"));
663 wxSetCursor(*wxHOURGLASS_CURSOR
);
665 if ( !wxDir::Exists(fn
.GetFullPath()) ||
666 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
668 // Try ../../samples/widgets/icons
671 fn
.AppendDir(wxT("icons"));
672 if ( !wxDir::Exists(fn
.GetFullPath()) ||
673 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
675 // Try ../../../samples/widgets/icons
680 fn
.AppendDir(wxT("samples"));
681 fn
.AppendDir(wxT("widgets"));
682 fn
.AppendDir(wxT("icons"));
683 if ( !wxDir::Exists(fn
.GetFullPath()) ||
684 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
686 wxLogWarning(wxT("Could not load widget icons."));
687 wxSetCursor(*wxSTANDARD_CURSOR
);
695 // Get size of existing images in list
696 wxSize foundSize
= m_combobox
->GetBitmapSize();
698 for ( i
=0; i
<strings
->size(); i
++ )
700 fn
.SetFullName((*strings
)[i
]);
701 wxString name
= fn
.GetName();
703 // Handle few exceptions
704 if ( name
== wxT("bmpbtn") )
706 strings
->RemoveAt(i
);
712 wxASSERT(fn
.FileExists());
713 wxImage
image(fn
.GetFullPath());
714 wxASSERT(image
.Ok());
715 RescaleImage(image
, foundSize
.x
, foundSize
.y
);
717 wxASSERT( bmp
.Ok() );
719 wxBitmap
bmp(wxNullBitmap
);
722 (*strings
)[i
] = name
;
724 // if the combobox is empty, use as bitmap size of the image list
725 // the size of the first valid image loaded
726 if (foundSize
== wxDefaultSize
)
727 foundSize
= bmp
.GetSize();
731 wxSetCursor(*wxSTANDARD_CURSOR
);
734 void BitmapComboBoxWidgetsPage::OnButtonAddWidgetIcons(wxCommandEvent
& WXUNUSED(event
))
736 wxArrayString strings
;
738 wxSize sz
= m_combobox
->GetBitmapSize();
745 wxImageList
images(sz
.x
, sz
.y
);
747 LoadWidgetImages(&strings
, &images
);
751 for ( i
=0; i
<strings
.size(); i
++ )
753 m_combobox
->Append(strings
[i
], images
.GetBitmap(i
));
757 void BitmapComboBoxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent
& event
)
760 event
.Enable( m_chkSort
->GetValue() || m_chkReadonly
->GetValue() );
763 void BitmapComboBoxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent
& event
)
767 bool enable
= !(m_combobox
->GetWindowStyle() & wxCB_SORT
);
769 event
.Enable(enable
);
773 void BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
)
778 event
.Enable(m_textDelete
->GetValue().ToULong(&n
) &&
779 (n
< (unsigned)m_combobox
->GetCount()));
783 void BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator(wxUpdateUIEvent
& event
)
786 event
.Enable(m_combobox
->GetSelection() != wxNOT_FOUND
);
789 void BitmapComboBoxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent
& event
)
792 event
.Enable(m_combobox
->GetCount() != 0);
795 void BitmapComboBoxWidgetsPage::OnComboText(wxCommandEvent
& event
)
800 wxString s
= event
.GetString();
802 wxASSERT_MSG( s
== m_combobox
->GetValue(),
803 wxT("event and combobox values should be the same") );
805 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
807 wxLogMessage(wxT("BitmapCombobox enter pressed (now '%s')"), s
.c_str());
811 wxLogMessage(wxT("BitmapCombobox text changed (now '%s')"), s
.c_str());
815 void BitmapComboBoxWidgetsPage::OnComboBox(wxCommandEvent
& event
)
817 long sel
= event
.GetInt();
818 m_textDelete
->SetValue(wxString::Format(wxT("%ld"), sel
));
820 wxLogMessage(wxT("BitmapCombobox item %ld selected"), sel
);
822 wxLogMessage(wxT("BitmapCombobox GetValue(): %s"), m_combobox
->GetValue().c_str() );
825 void BitmapComboBoxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
831 wxBitmap
BitmapComboBoxWidgetsPage::LoadBitmap(const wxString
& filepath
)
833 // Get size of existing images in list
834 wxSize foundSize
= m_combobox
->GetBitmapSize();
836 // Have some reasonable maximum size
837 if ( foundSize
.x
<= 0 )
839 foundSize
.x
= IMG_SIZE_TRUNC
;
840 foundSize
.y
= IMG_SIZE_TRUNC
;
843 wxImage
image(filepath
);
846 // Rescale very large images
847 int ow
= image
.GetWidth();
848 int oh
= image
.GetHeight();
850 if ( foundSize
.x
> 0 &&
851 (ow
!= foundSize
.x
|| oh
!= foundSize
.y
) )
854 if ( w
> foundSize
.x
)
857 if ( h
> foundSize
.y
)
860 RescaleImage(image
, w
, h
);
863 return wxBitmap(image
);
869 wxBitmap
BitmapComboBoxWidgetsPage::LoadBitmap(const wxString
& WXUNUSED(filepath
))
875 wxBitmap
BitmapComboBoxWidgetsPage::QueryBitmap(wxString
* pStr
)
877 wxString filepath
= wxLoadFileSelector(wxT("image"),
884 ::wxSetCursor( *wxHOURGLASS_CURSOR
);
886 if ( filepath
.length() )
890 *pStr
= wxFileName(filepath
).GetName();
893 bitmap
= LoadBitmap(filepath
);
898 wxLogDebug(wxT("%i, %i"),bitmap
.GetWidth(), bitmap
.GetHeight());
901 ::wxSetCursor( *wxSTANDARD_CURSOR
);
906 wxBitmap
BitmapComboBoxWidgetsPage::CreateBitmap(const wxColour
& colour
)
913 dc
.SelectObject(bmp
);
915 // Draw transparent background
916 wxColour
magic(255, 0, 255);
917 wxBrush
magicBrush(magic
);
918 dc
.SetBrush(magicBrush
);
919 dc
.SetPen(*wxTRANSPARENT_PEN
);
920 dc
.DrawRectangle(0, 0, w
, h
);
922 // Draw image content
923 dc
.SetBrush(wxBrush(colour
));
924 dc
.DrawCircle(h
/2, h
/2+1, h
/2);
926 dc
.SelectObject(wxNullBitmap
);
928 // Finalize transparency with a mask
929 wxMask
*mask
= new wxMask(bmp
, magic
);
935 void BitmapComboBoxWidgetsPage::OnDropDown(wxCommandEvent
& WXUNUSED(event
))
937 wxLogMessage(wxT("Combobox dropped down"));
940 void BitmapComboBoxWidgetsPage::OnCloseUp(wxCommandEvent
& WXUNUSED(event
))
942 wxLogMessage(wxT("Combobox closed up"));
945 #endif // wxUSE_BITMAPCOMBOBOX