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
7 // Copyright: (c) 2006 Jaakko Salli
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 // ============================================================================
13 // ============================================================================
15 // ----------------------------------------------------------------------------
17 // ----------------------------------------------------------------------------
19 // for compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
26 #if wxUSE_BITMAPCOMBOBOX
28 // for all others, include the necessary headers
32 #include "wx/bitmap.h"
33 #include "wx/button.h"
34 #include "wx/checkbox.h"
35 #include "wx/combobox.h"
36 #include "wx/radiobox.h"
37 #include "wx/statbox.h"
38 #include "wx/textctrl.h"
39 #include "wx/filedlg.h"
42 #include "wx/stattext.h"
44 #include "wx/dcmemory.h"
48 #include "wx/msgdlg.h"
49 #include "wx/filename.h"
51 #include "wx/imaglist.h"
52 #include "wx/bmpcbox.h"
54 #include "itemcontainer.h"
57 #include "icons/bmpcombobox.xpm"
59 // Images loaded from file are reduced this width and height, if larger
60 #define IMG_SIZE_TRUNC 256
63 // ----------------------------------------------------------------------------
65 // ----------------------------------------------------------------------------
70 BitmapComboBoxPage_Reset
= wxID_HIGHEST
,
71 BitmapComboBoxPage_Insert
,
72 BitmapComboBoxPage_InsertText
,
73 BitmapComboBoxPage_ChangeHeight
,
74 BitmapComboBoxPage_LoadFromFile
,
75 BitmapComboBoxPage_SetFromFile
,
76 BitmapComboBoxPage_AddWidgetIcons
,
77 BitmapComboBoxPage_AddSeveralWithImages
,
78 BitmapComboBoxPage_AddSeveral
,
79 BitmapComboBoxPage_AddMany
,
80 BitmapComboBoxPage_Clear
,
81 BitmapComboBoxPage_Change
,
82 BitmapComboBoxPage_Delete
,
83 BitmapComboBoxPage_DeleteText
,
84 BitmapComboBoxPage_DeleteSel
,
85 BitmapComboBoxPage_Combo
,
86 BitmapComboBoxPage_ContainerTests
89 // kinds of comboboxes
97 // ----------------------------------------------------------------------------
98 // BitmapComboBoxWidgetsPage
99 // ----------------------------------------------------------------------------
101 class BitmapComboBoxWidgetsPage
: public ItemContainerWidgetsPage
104 BitmapComboBoxWidgetsPage(WidgetsBookCtrl
*book
, wxImageList
*imaglist
);
106 virtual wxControl
*GetWidget() const { return m_combobox
; }
107 virtual wxItemContainer
* GetContainer() const { return m_combobox
; }
108 virtual void RecreateWidget() { CreateCombo(); }
110 // lazy creation of the content
111 virtual void CreateContent();
115 void OnButtonReset(wxCommandEvent
& event
);
116 void OnButtonChange(wxCommandEvent
& event
);
117 void OnButtonDelete(wxCommandEvent
& event
);
118 void OnButtonDeleteSel(wxCommandEvent
& event
);
119 void OnButtonClear(wxCommandEvent
& event
);
120 void OnButtonInsert(wxCommandEvent
&event
);
121 void OnTextChangeHeight(wxCommandEvent
& event
);
122 void OnButtonLoadFromFile(wxCommandEvent
& event
);
123 void OnButtonSetFromFile(wxCommandEvent
& event
);
124 void OnButtonAddSeveral(wxCommandEvent
& event
);
125 void OnButtonAddSeveralWithImages(wxCommandEvent
& event
);
126 void OnButtonAddWidgetIcons(wxCommandEvent
& event
);
127 void OnButtonAddMany(wxCommandEvent
& event
);
129 void OnComboBox(wxCommandEvent
& event
);
130 void OnDropDown(wxCommandEvent
& event
);
131 void OnCloseUp(wxCommandEvent
& event
);
132 void OnComboText(wxCommandEvent
& event
);
134 void OnCheckOrRadioBox(wxCommandEvent
& event
);
136 void OnTextPopupWidth(wxCommandEvent
& event
);
137 void OnTextPopupHeight(wxCommandEvent
& event
);
138 void OnTextButtonAll(wxCommandEvent
& event
);
140 void OnUpdateUIInsert(wxUpdateUIEvent
& event
);
141 void OnUpdateUIClearButton(wxUpdateUIEvent
& event
);
142 void OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
);
143 void OnUpdateUIItemManipulator(wxUpdateUIEvent
& event
);
144 void OnUpdateUIResetButton(wxUpdateUIEvent
& event
);
146 // reset the bmpcombobox parameters
149 // (re)create the bmpcombobox
152 // helpers for creating bitmaps
153 wxBitmap
CreateBitmap(const wxColour
& colour
);
154 wxBitmap
LoadBitmap(const wxString
& filepath
);
155 wxBitmap
QueryBitmap(wxString
* pStr
);
157 void LoadWidgetImages( wxArrayString
* strings
, wxImageList
* images
);
159 wxSizer
*CreateSizerWithSmallTextAndLabel(const wxString
& label
,
161 wxTextCtrl
**ppText
);
164 void RescaleImage(wxImage
& image
, int w
, int h
);
170 // the sel mode radiobox
171 wxRadioBox
*m_radioKind
;
173 // the checkboxes for styles
174 wxCheckBox
*m_chkSort
,
177 // the combobox itself and the sizer it is in
178 wxBitmapComboBox
*m_combobox
;
179 wxSizer
*m_sizerCombo
;
181 // the text entries for "Add/change string" and "Delete" buttons
182 wxTextCtrl
*m_textInsert
,
188 DECLARE_EVENT_TABLE()
189 DECLARE_WIDGETS_PAGE(BitmapComboBoxWidgetsPage
)
192 // ----------------------------------------------------------------------------
194 // ----------------------------------------------------------------------------
196 BEGIN_EVENT_TABLE(BitmapComboBoxWidgetsPage
, WidgetsPage
)
197 EVT_BUTTON(BitmapComboBoxPage_Reset
, BitmapComboBoxWidgetsPage::OnButtonReset
)
198 EVT_BUTTON(BitmapComboBoxPage_Change
, BitmapComboBoxWidgetsPage::OnButtonChange
)
199 EVT_BUTTON(BitmapComboBoxPage_Delete
, BitmapComboBoxWidgetsPage::OnButtonDelete
)
200 EVT_BUTTON(BitmapComboBoxPage_DeleteSel
, BitmapComboBoxWidgetsPage::OnButtonDeleteSel
)
201 EVT_BUTTON(BitmapComboBoxPage_Clear
, BitmapComboBoxWidgetsPage::OnButtonClear
)
202 EVT_BUTTON(BitmapComboBoxPage_Insert
, BitmapComboBoxWidgetsPage::OnButtonInsert
)
203 EVT_BUTTON(BitmapComboBoxPage_AddSeveral
, BitmapComboBoxWidgetsPage::OnButtonAddSeveral
)
204 EVT_BUTTON(BitmapComboBoxPage_AddSeveralWithImages
, BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages
)
205 EVT_BUTTON(BitmapComboBoxPage_AddWidgetIcons
, BitmapComboBoxWidgetsPage::OnButtonAddWidgetIcons
)
206 EVT_BUTTON(BitmapComboBoxPage_AddMany
, BitmapComboBoxWidgetsPage::OnButtonAddMany
)
207 EVT_BUTTON(BitmapComboBoxPage_LoadFromFile
, BitmapComboBoxWidgetsPage::OnButtonLoadFromFile
)
208 EVT_BUTTON(BitmapComboBoxPage_SetFromFile
, BitmapComboBoxWidgetsPage::OnButtonSetFromFile
)
209 EVT_BUTTON(BitmapComboBoxPage_ContainerTests
, ItemContainerWidgetsPage::OnButtonTestItemContainer
)
211 EVT_TEXT_ENTER(BitmapComboBoxPage_InsertText
, BitmapComboBoxWidgetsPage::OnButtonInsert
)
212 EVT_TEXT(BitmapComboBoxPage_ChangeHeight
, BitmapComboBoxWidgetsPage::OnTextChangeHeight
)
213 EVT_TEXT_ENTER(BitmapComboBoxPage_DeleteText
, BitmapComboBoxWidgetsPage::OnButtonDelete
)
215 EVT_UPDATE_UI(BitmapComboBoxPage_Reset
, BitmapComboBoxWidgetsPage::OnUpdateUIResetButton
)
216 EVT_UPDATE_UI(BitmapComboBoxPage_Insert
, BitmapComboBoxWidgetsPage::OnUpdateUIInsert
)
217 EVT_UPDATE_UI(BitmapComboBoxPage_LoadFromFile
, BitmapComboBoxWidgetsPage::OnUpdateUIInsert
)
218 EVT_UPDATE_UI(BitmapComboBoxPage_Clear
, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton
)
219 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteText
, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton
)
220 EVT_UPDATE_UI(BitmapComboBoxPage_Delete
, BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton
)
221 EVT_UPDATE_UI(BitmapComboBoxPage_Change
, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator
)
222 EVT_UPDATE_UI(BitmapComboBoxPage_SetFromFile
, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator
)
223 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteSel
, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator
)
225 EVT_COMBOBOX_DROPDOWN(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnDropDown
)
226 EVT_COMBOBOX_CLOSEUP(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnCloseUp
)
227 EVT_COMBOBOX(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboBox
)
228 EVT_TEXT(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboText
)
229 EVT_TEXT_ENTER(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboText
)
231 EVT_CHECKBOX(wxID_ANY
, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox
)
232 EVT_RADIOBOX(wxID_ANY
, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox
)
235 // ============================================================================
237 // ============================================================================
239 #if defined(__WXMSW__) || defined(__WXGTK__)
240 #define NATIVE_OR_GENERIC_CTRLS NATIVE_CTRLS
242 #define NATIVE_OR_GENERIC_CTRLS GENERIC_CTRLS
245 IMPLEMENT_WIDGETS_PAGE(BitmapComboBoxWidgetsPage
, wxT("BitmapCombobox"),
246 NATIVE_OR_GENERIC_CTRLS
| WITH_ITEMS_CTRLS
| COMBO_CTRLS
250 BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl
*book
,
251 wxImageList
*imaglist
)
252 : ItemContainerWidgetsPage(book
, imaglist
, bmpcombobox_xpm
)
256 m_chkReadonly
= NULL
;
267 // create a sizer containing a label and a small text ctrl
268 wxSizer
*BitmapComboBoxWidgetsPage::CreateSizerWithSmallTextAndLabel(const wxString
& label
,
272 wxControl
* control
= new wxStaticText(this, wxID_ANY
, label
);
273 wxSizer
*sizerRow
= new wxBoxSizer(wxHORIZONTAL
);
274 wxTextCtrl
*text
= new wxTextCtrl(this, id
, wxEmptyString
,
275 wxDefaultPosition
, wxSize(50,wxDefaultCoord
), wxTE_PROCESS_ENTER
);
277 sizerRow
->Add(control
, 0, wxRIGHT
| wxALIGN_CENTRE_VERTICAL
, 5);
278 sizerRow
->Add(text
, 1, wxFIXED_MINSIZE
| wxLEFT
| wxALIGN_CENTRE_VERTICAL
, 5);
286 void BitmapComboBoxWidgetsPage::CreateContent()
289 What we create here is a frame having 3 panes: style pane is the
290 leftmost one, in the middle the pane with buttons allowing to perform
291 miscellaneous combobox operations and the pane containing the combobox
296 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
298 wxSizer
*sizerLeft
= new wxBoxSizer(wxVERTICAL
);
300 // left pane - style box
301 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, wxT("&Set style"));
304 // should be in sync with ComboKind_XXX values
305 static const wxString kinds
[] =
312 m_radioKind
= new wxRadioBox(this, wxID_ANY
, wxT("Combobox &kind:"),
313 wxDefaultPosition
, wxDefaultSize
,
314 WXSIZEOF(kinds
), kinds
,
315 1, wxRA_SPECIFY_COLS
);
317 wxSizer
*sizerStyle
= new wxStaticBoxSizer(box
, wxVERTICAL
);
319 m_chkSort
= CreateCheckBoxAndAddToSizer(sizerStyle
, wxT("&Sort items"));
320 m_chkReadonly
= CreateCheckBoxAndAddToSizer(sizerStyle
, wxT("&Read only"));
322 wxButton
*btn
= new wxButton(this, BitmapComboBoxPage_Reset
, wxT("&Reset"));
323 sizerStyle
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 3);
325 sizerLeft
->Add(sizerStyle
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
);
326 sizerLeft
->Add(m_radioKind
, 0, wxGROW
| wxALL
, 5);
328 // left pane - other options box
329 box
= new wxStaticBox(this, wxID_ANY
, wxT("Demo options"));
331 wxSizer
*sizerOptions
= new wxStaticBoxSizer(box
, wxVERTICAL
);
333 sizerRow
= CreateSizerWithSmallTextAndLabel(wxT("Control &height:"),
334 BitmapComboBoxPage_ChangeHeight
,
335 &m_textChangeHeight
);
336 m_textChangeHeight
->SetSize(20, wxDefaultCoord
);
337 sizerOptions
->Add(sizerRow
, 0, wxALL
| wxFIXED_MINSIZE
/*| wxGROW*/, 5);
339 sizerLeft
->Add(sizerOptions
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
| wxTOP
, 2);
342 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
,
343 wxT("&Change wxBitmapComboBox contents"));
344 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
346 btn
= new wxButton(this, BitmapComboBoxPage_ContainerTests
, wxT("Run &tests"));
347 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
350 btn
= new wxButton(this, BitmapComboBoxPage_AddWidgetIcons
, wxT("Add &widget icons"));
351 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
353 btn
= new wxButton(this, BitmapComboBoxPage_LoadFromFile
, wxT("Insert image from &file"));
354 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
356 btn
= new wxButton(this, BitmapComboBoxPage_SetFromFile
, wxT("&Set image from file"));
357 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
360 btn
= new wxButton(this, BitmapComboBoxPage_AddSeveralWithImages
, wxT("A&ppend a few strings with images"));
361 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
363 btn
= new wxButton(this, BitmapComboBoxPage_AddSeveral
, wxT("Append a &few strings"));
364 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
366 btn
= new wxButton(this, BitmapComboBoxPage_AddMany
, wxT("Append &many strings"));
367 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
369 sizerRow
= CreateSizerWithTextAndButton(BitmapComboBoxPage_Delete
,
370 wxT("&Delete this item"),
371 BitmapComboBoxPage_DeleteText
,
373 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
375 btn
= new wxButton(this, BitmapComboBoxPage_DeleteSel
, wxT("Delete &selection"));
376 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
378 btn
= new wxButton(this, BitmapComboBoxPage_Clear
, wxT("&Clear"));
379 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
382 wxInitAllImageHandlers();
386 wxSizer
*sizerRight
= new wxBoxSizer(wxVERTICAL
);
387 m_combobox
= new wxBitmapComboBox();
388 m_combobox
->Create(this, BitmapComboBoxPage_Combo
, wxEmptyString
,
389 wxDefaultPosition
, wxDefaultSize
,
393 #if defined(wxGENERIC_BITMAPCOMBOBOX)
394 // This will sure make the list look nicer when larger images are used.
395 m_combobox
->SetPopupMaxHeight(600);
398 sizerRight
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
399 sizerRight
->SetMinSize(150, 0);
400 m_sizerCombo
= sizerRight
; // save it to modify it later
402 // the 3 panes panes compose the window
403 sizerTop
->Add(sizerLeft
, 0, wxGROW
| (wxALL
& ~wxLEFT
), 10);
404 sizerTop
->Add(sizerMiddle
, 5, wxGROW
| wxALL
, 10);
405 sizerTop
->Add(sizerRight
, 4, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
407 // final initializations
413 // ----------------------------------------------------------------------------
415 // ----------------------------------------------------------------------------
417 void BitmapComboBoxWidgetsPage::Reset()
419 m_chkSort
->SetValue(false);
420 m_chkReadonly
->SetValue(true);
423 void BitmapComboBoxWidgetsPage::CreateCombo()
425 int flags
= ms_defaultFlags
;
427 if ( m_chkSort
->GetValue() )
429 if ( m_chkReadonly
->GetValue() )
430 flags
|= wxCB_READONLY
;
432 switch ( m_radioKind
->GetSelection() )
435 wxFAIL_MSG( wxT("unknown combo kind") );
438 case ComboKind_Default
:
441 case ComboKind_Simple
:
442 flags
|= wxCB_SIMPLE
;
445 case ComboKind_DropDown
:
446 flags
= wxCB_DROPDOWN
;
451 wxArrayPtrVoid bitmaps
;
454 unsigned int count
= m_combobox
->GetCount();
455 for ( unsigned int n
= 0; n
< count
; n
++ )
457 items
.Add(m_combobox
->GetString(n
));
458 wxBitmap bmp
= m_combobox
->GetItemBitmap(n
);
459 bitmaps
.Add(new wxBitmap(bmp
));
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 in order 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
.IsOk());
715 RescaleImage(image
, foundSize
.x
, foundSize
.y
);
717 wxASSERT( bmp
.IsOk() );
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_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
.empty() )
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