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 // Licence: wxWindows licence
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 wxBitmap bmp
= m_combobox
->GetItemBitmap(n
);
460 bitmaps
.Add(new wxBitmap(bmp
));
463 m_sizerCombo
->Detach( m_combobox
);
467 m_combobox
= new wxBitmapComboBox();
468 m_combobox
->Create(this, BitmapComboBoxPage_Combo
, wxEmptyString
,
469 wxDefaultPosition
, wxDefaultSize
,
473 #if defined(wxGENERIC_BITMAPCOMBOBOX)
474 // This will sure make the list look nicer when larger images are used.
475 m_combobox
->SetPopupMaxHeight(600);
478 unsigned int count
= items
.GetCount();
479 for ( unsigned int n
= 0; n
< count
; n
++ )
481 wxBitmap
* bmp
= (wxBitmap
*) bitmaps
[n
];
482 m_combobox
->Append(items
[n
], *bmp
);
486 m_sizerCombo
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
487 m_sizerCombo
->Layout();
489 // Allow changing height in order to demonstrate flexible
490 // size of image "thumbnail" painted in the control itself.
492 m_textChangeHeight
->GetValue().ToLong(&h
);
494 m_combobox
->SetSize(wxDefaultCoord
, h
);
497 // ----------------------------------------------------------------------------
499 // ----------------------------------------------------------------------------
501 void BitmapComboBoxWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
508 void BitmapComboBoxWidgetsPage::OnButtonChange(wxCommandEvent
& WXUNUSED(event
))
510 int sel
= m_combobox
->GetSelection();
511 if ( sel
!= wxNOT_FOUND
)
514 m_combobox
->SetString(sel
, m_textChange
->GetValue());
516 wxLogMessage(wxT("Not implemented in wxGTK"));
521 void BitmapComboBoxWidgetsPage::OnButtonDelete(wxCommandEvent
& WXUNUSED(event
))
524 if ( !m_textDelete
->GetValue().ToULong(&n
) ||
525 (n
>= m_combobox
->GetCount()) )
530 m_combobox
->Delete(n
);
533 void BitmapComboBoxWidgetsPage::OnButtonDeleteSel(wxCommandEvent
& WXUNUSED(event
))
535 int sel
= m_combobox
->GetSelection();
536 if ( sel
!= wxNOT_FOUND
)
538 m_combobox
->Delete(sel
);
542 void BitmapComboBoxWidgetsPage::OnButtonClear(wxCommandEvent
& WXUNUSED(event
))
547 void BitmapComboBoxWidgetsPage::OnButtonInsert(wxCommandEvent
& WXUNUSED(event
))
549 static unsigned int s_item
= 0;
551 wxString s
= m_textInsert
->GetValue();
552 if ( !m_textInsert
->IsModified() )
554 // update the default string
555 m_textInsert
->SetValue(wxString::Format(wxT("test item %u"), ++s_item
));
558 int sel
= m_combobox
->GetSelection();
559 if ( sel
== wxNOT_FOUND
)
560 sel
= m_combobox
->GetCount();
562 m_combobox
->Insert(s
, wxNullBitmap
, m_combobox
->GetSelection());
565 void BitmapComboBoxWidgetsPage::OnTextChangeHeight(wxCommandEvent
& WXUNUSED(event
))
568 if ( m_textChangeHeight
)
569 m_textChangeHeight
->GetValue().ToLong(&h
);
572 m_combobox
->SetSize(wxDefaultCoord
, h
);
575 void BitmapComboBoxWidgetsPage::OnButtonLoadFromFile(wxCommandEvent
& WXUNUSED(event
))
578 int sel
= m_combobox
->GetSelection();
579 if ( sel
== wxNOT_FOUND
)
580 sel
= m_combobox
->GetCount();
582 wxBitmap bmp
= QueryBitmap(&s
);
584 m_combobox
->Insert(s
, bmp
, sel
);
587 void BitmapComboBoxWidgetsPage::OnButtonSetFromFile(wxCommandEvent
& WXUNUSED(event
))
589 wxBitmap bmp
= QueryBitmap(NULL
);
591 m_combobox
->SetItemBitmap(m_combobox
->GetSelection(), bmp
);
594 void BitmapComboBoxWidgetsPage::OnButtonAddMany(wxCommandEvent
& WXUNUSED(event
))
596 // "many" means 1000 here
597 for ( unsigned int n
= 0; n
< 1000; n
++ )
599 m_combobox
->Append(wxString::Format(wxT("item #%u"), n
));
603 void BitmapComboBoxWidgetsPage::OnButtonAddSeveral(wxCommandEvent
& WXUNUSED(event
))
605 m_combobox
->Append(wxT("First"));
606 m_combobox
->Append(wxT("another one"));
607 m_combobox
->Append(wxT("and the last (very very very very very very very very very very long) one"));
610 void BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages(wxCommandEvent
& WXUNUSED(event
))
612 static const struct TestEntry
618 { "Red circle", 0x0000ff },
619 { "Blue circle", 0xff0000 },
620 { "Green circle", 0x00ff00 },
621 { "Black circle", 0x000000 },
624 for ( unsigned i
= 0; i
< WXSIZEOF(s_entries
); i
++ )
626 const TestEntry
& e
= s_entries
[i
];
627 m_combobox
->Append(e
.text
, CreateBitmap(wxColour(e
.rgb
)));
632 void BitmapComboBoxWidgetsPage::RescaleImage(wxImage
& image
, int w
, int h
)
634 if ( image
.GetWidth() == w
&& image
.GetHeight() == h
)
637 if ( w
<= 0 || h
<= 0 )
640 static bool isFirstScale
= true;
642 if ( isFirstScale
&& m_combobox
->GetCount() > 0 )
644 wxMessageBox( wxT("wxBitmapComboBox normally only supports images of one size. ")
645 wxT("However, for demonstration purposes, loaded bitmaps are scaled to fit ")
646 wxT("using wxImage::Rescale."),
651 isFirstScale
= false;
658 void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString
* strings
, wxImageList
* images
)
662 fn
.AppendDir(wxT("icons"));
664 wxSetCursor(*wxHOURGLASS_CURSOR
);
666 if ( !wxDir::Exists(fn
.GetFullPath()) ||
667 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
669 // Try ../../samples/widgets/icons
672 fn
.AppendDir(wxT("icons"));
673 if ( !wxDir::Exists(fn
.GetFullPath()) ||
674 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
676 // Try ../../../samples/widgets/icons
681 fn
.AppendDir(wxT("samples"));
682 fn
.AppendDir(wxT("widgets"));
683 fn
.AppendDir(wxT("icons"));
684 if ( !wxDir::Exists(fn
.GetFullPath()) ||
685 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
687 wxLogWarning(wxT("Could not load widget icons."));
688 wxSetCursor(*wxSTANDARD_CURSOR
);
696 // Get size of existing images in list
697 wxSize foundSize
= m_combobox
->GetBitmapSize();
699 for ( i
=0; i
<strings
->size(); i
++ )
701 fn
.SetFullName((*strings
)[i
]);
702 wxString name
= fn
.GetName();
704 // Handle few exceptions
705 if ( name
== wxT("bmpbtn") )
707 strings
->RemoveAt(i
);
713 wxASSERT(fn
.FileExists());
714 wxImage
image(fn
.GetFullPath());
715 wxASSERT(image
.IsOk());
716 RescaleImage(image
, foundSize
.x
, foundSize
.y
);
718 wxASSERT( bmp
.IsOk() );
720 wxBitmap
bmp(wxNullBitmap
);
723 (*strings
)[i
] = name
;
725 // if the combobox is empty, use as bitmap size of the image list
726 // the size of the first valid image loaded
727 if (foundSize
== wxDefaultSize
)
728 foundSize
= bmp
.GetSize();
732 wxSetCursor(*wxSTANDARD_CURSOR
);
735 void BitmapComboBoxWidgetsPage::OnButtonAddWidgetIcons(wxCommandEvent
& WXUNUSED(event
))
737 wxArrayString strings
;
739 wxSize sz
= m_combobox
->GetBitmapSize();
746 wxImageList
images(sz
.x
, sz
.y
);
748 LoadWidgetImages(&strings
, &images
);
752 for ( i
=0; i
<strings
.size(); i
++ )
754 m_combobox
->Append(strings
[i
], images
.GetBitmap(i
));
758 void BitmapComboBoxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent
& event
)
761 event
.Enable( m_chkSort
->GetValue() || m_chkReadonly
->GetValue() );
764 void BitmapComboBoxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent
& event
)
768 bool enable
= !(m_combobox
->GetWindowStyle() & wxCB_SORT
);
770 event
.Enable(enable
);
774 void BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
)
779 event
.Enable(m_textDelete
->GetValue().ToULong(&n
) &&
780 (n
< (unsigned)m_combobox
->GetCount()));
784 void BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator(wxUpdateUIEvent
& event
)
787 event
.Enable(m_combobox
->GetSelection() != wxNOT_FOUND
);
790 void BitmapComboBoxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent
& event
)
793 event
.Enable(m_combobox
->GetCount() != 0);
796 void BitmapComboBoxWidgetsPage::OnComboText(wxCommandEvent
& event
)
801 wxString s
= event
.GetString();
803 wxASSERT_MSG( s
== m_combobox
->GetValue(),
804 wxT("event and combobox values should be the same") );
806 if (event
.GetEventType() == wxEVT_TEXT_ENTER
)
808 wxLogMessage(wxT("BitmapCombobox enter pressed (now '%s')"), s
.c_str());
812 wxLogMessage(wxT("BitmapCombobox text changed (now '%s')"), s
.c_str());
816 void BitmapComboBoxWidgetsPage::OnComboBox(wxCommandEvent
& event
)
818 long sel
= event
.GetInt();
819 m_textDelete
->SetValue(wxString::Format(wxT("%ld"), sel
));
821 wxLogMessage(wxT("BitmapCombobox item %ld selected"), sel
);
823 wxLogMessage(wxT("BitmapCombobox GetValue(): %s"), m_combobox
->GetValue().c_str() );
826 void BitmapComboBoxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
832 wxBitmap
BitmapComboBoxWidgetsPage::LoadBitmap(const wxString
& filepath
)
834 // Get size of existing images in list
835 wxSize foundSize
= m_combobox
->GetBitmapSize();
837 // Have some reasonable maximum size
838 if ( foundSize
.x
<= 0 )
840 foundSize
.x
= IMG_SIZE_TRUNC
;
841 foundSize
.y
= IMG_SIZE_TRUNC
;
844 wxImage
image(filepath
);
847 // Rescale very large images
848 int ow
= image
.GetWidth();
849 int oh
= image
.GetHeight();
851 if ( foundSize
.x
> 0 &&
852 (ow
!= foundSize
.x
|| oh
!= foundSize
.y
) )
855 if ( w
> foundSize
.x
)
858 if ( h
> foundSize
.y
)
861 RescaleImage(image
, w
, h
);
864 return wxBitmap(image
);
870 wxBitmap
BitmapComboBoxWidgetsPage::LoadBitmap(const wxString
& WXUNUSED(filepath
))
876 wxBitmap
BitmapComboBoxWidgetsPage::QueryBitmap(wxString
* pStr
)
878 wxString filepath
= wxLoadFileSelector(wxT("image"),
885 ::wxSetCursor( *wxHOURGLASS_CURSOR
);
887 if ( !filepath
.empty() )
891 *pStr
= wxFileName(filepath
).GetName();
894 bitmap
= LoadBitmap(filepath
);
899 wxLogDebug(wxT("%i, %i"),bitmap
.GetWidth(), bitmap
.GetHeight());
902 ::wxSetCursor( *wxSTANDARD_CURSOR
);
907 wxBitmap
BitmapComboBoxWidgetsPage::CreateBitmap(const wxColour
& colour
)
914 dc
.SelectObject(bmp
);
916 // Draw transparent background
917 wxColour
magic(255, 0, 255);
918 wxBrush
magicBrush(magic
);
919 dc
.SetBrush(magicBrush
);
920 dc
.SetPen(*wxTRANSPARENT_PEN
);
921 dc
.DrawRectangle(0, 0, w
, h
);
923 // Draw image content
924 dc
.SetBrush(wxBrush(colour
));
925 dc
.DrawCircle(h
/2, h
/2+1, h
/2);
927 dc
.SelectObject(wxNullBitmap
);
929 // Finalize transparency with a mask
930 wxMask
*mask
= new wxMask(bmp
, magic
);
936 void BitmapComboBoxWidgetsPage::OnDropDown(wxCommandEvent
& WXUNUSED(event
))
938 wxLogMessage(wxT("Combobox dropped down"));
941 void BitmapComboBoxWidgetsPage::OnCloseUp(wxCommandEvent
& WXUNUSED(event
))
943 wxLogMessage(wxT("Combobox closed up"));
946 #endif // wxUSE_BITMAPCOMBOBOX