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/filename.h"
51 #include "wx/imaglist.h"
52 #include "wx/bmpcbox.h"
57 #include "icons/bmpcombobox.xpm"
59 // Images loaded from file are reduced this width and height, if larger
60 #define IMG_SIZE_TRUNC 150
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
89 // ----------------------------------------------------------------------------
90 // BitmapComboBoxWidgetsPage
91 // ----------------------------------------------------------------------------
93 class BitmapComboBoxWidgetsPage
: public WidgetsPage
96 BitmapComboBoxWidgetsPage(WidgetsBookCtrl
*book
, wxImageList
*imaglist
);
98 virtual wxControl
*GetWidget() const { return m_combobox
; }
99 virtual void RecreateWidget() { CreateCombo(); }
101 // lazy creation of the content
102 virtual void CreateContent();
106 void OnButtonReset(wxCommandEvent
& event
);
107 void OnButtonChange(wxCommandEvent
& event
);
108 void OnButtonDelete(wxCommandEvent
& event
);
109 void OnButtonDeleteSel(wxCommandEvent
& event
);
110 void OnButtonClear(wxCommandEvent
& event
);
111 void OnButtonInsert(wxCommandEvent
&event
);
112 void OnTextChangeHeight(wxCommandEvent
& event
);
113 void OnButtonLoadFromFile(wxCommandEvent
& event
);
114 void OnButtonSetFromFile(wxCommandEvent
& event
);
115 void OnButtonAddSeveral(wxCommandEvent
& event
);
116 void OnButtonAddSeveralWithImages(wxCommandEvent
& event
);
117 void OnButtonAddWidgetIcons(wxCommandEvent
& event
);
118 void OnButtonAddMany(wxCommandEvent
& event
);
120 void OnComboBox(wxCommandEvent
& event
);
121 void OnComboText(wxCommandEvent
& event
);
123 void OnCheckOrRadioBox(wxCommandEvent
& event
);
125 void OnTextPopupWidth(wxCommandEvent
& event
);
126 void OnTextPopupHeight(wxCommandEvent
& event
);
127 void OnTextButtonAll(wxCommandEvent
& event
);
129 void OnUpdateUIInsert(wxUpdateUIEvent
& event
);
130 void OnUpdateUIAddSeveral(wxUpdateUIEvent
& event
);
131 void OnUpdateUIAddSeveralWithImages(wxUpdateUIEvent
& event
);
132 void OnUpdateUIClearButton(wxUpdateUIEvent
& event
);
133 void OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
);
134 void OnUpdateUIDeleteSelButton(wxUpdateUIEvent
& event
);
135 void OnUpdateUIResetButton(wxUpdateUIEvent
& event
);
137 // reset the bmpcombobox parameters
140 // (re)create the bmpcombobox
143 // helpers for creating bitmaps
144 wxBitmap
CreateBitmap(const wxColour
& colour
);
145 wxBitmap
CreateRandomBitmap(wxString
* pStr
);
146 wxBitmap
LoadBitmap(const wxString
& filepath
);
147 wxBitmap
QueryBitmap(wxString
* pStr
);
149 void LoadWidgetImages( wxArrayString
* strings
, wxImageList
* images
);
151 wxSizer
*CreateSizerWithSmallTextAndLabel(const wxString
& label
,
153 wxTextCtrl
**ppText
);
158 // the checkboxes for styles
159 wxCheckBox
*m_chkSort
,
163 // the combobox itself and the sizer it is in
164 wxBitmapComboBox
*m_combobox
;
165 wxSizer
*m_sizerCombo
;
167 // the text entries for "Add/change string" and "Delete" buttons
168 wxTextCtrl
*m_textInsert
,
174 DECLARE_EVENT_TABLE()
175 DECLARE_WIDGETS_PAGE(BitmapComboBoxWidgetsPage
)
178 // ----------------------------------------------------------------------------
180 // ----------------------------------------------------------------------------
182 BEGIN_EVENT_TABLE(BitmapComboBoxWidgetsPage
, WidgetsPage
)
183 EVT_BUTTON(BitmapComboBoxPage_Reset
, BitmapComboBoxWidgetsPage::OnButtonReset
)
184 EVT_BUTTON(BitmapComboBoxPage_Change
, BitmapComboBoxWidgetsPage::OnButtonChange
)
185 EVT_BUTTON(BitmapComboBoxPage_Delete
, BitmapComboBoxWidgetsPage::OnButtonDelete
)
186 EVT_BUTTON(BitmapComboBoxPage_DeleteSel
, BitmapComboBoxWidgetsPage::OnButtonDeleteSel
)
187 EVT_BUTTON(BitmapComboBoxPage_Clear
, BitmapComboBoxWidgetsPage::OnButtonClear
)
188 EVT_BUTTON(BitmapComboBoxPage_Insert
, BitmapComboBoxWidgetsPage::OnButtonInsert
)
189 EVT_BUTTON(BitmapComboBoxPage_AddSeveral
, BitmapComboBoxWidgetsPage::OnButtonAddSeveral
)
190 EVT_BUTTON(BitmapComboBoxPage_AddSeveralWithImages
, BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages
)
191 EVT_BUTTON(BitmapComboBoxPage_AddWidgetIcons
, BitmapComboBoxWidgetsPage::OnButtonAddWidgetIcons
)
192 EVT_BUTTON(BitmapComboBoxPage_AddMany
, BitmapComboBoxWidgetsPage::OnButtonAddMany
)
193 EVT_BUTTON(BitmapComboBoxPage_LoadFromFile
, BitmapComboBoxWidgetsPage::OnButtonLoadFromFile
)
194 EVT_BUTTON(BitmapComboBoxPage_SetFromFile
, BitmapComboBoxWidgetsPage::OnButtonSetFromFile
)
196 EVT_TEXT_ENTER(BitmapComboBoxPage_InsertText
, BitmapComboBoxWidgetsPage::OnButtonInsert
)
197 EVT_TEXT(BitmapComboBoxPage_ChangeHeight
, BitmapComboBoxWidgetsPage::OnTextChangeHeight
)
198 EVT_TEXT_ENTER(BitmapComboBoxPage_DeleteText
, BitmapComboBoxWidgetsPage::OnButtonDelete
)
200 EVT_UPDATE_UI(BitmapComboBoxPage_Reset
, BitmapComboBoxWidgetsPage::OnUpdateUIResetButton
)
201 EVT_UPDATE_UI(BitmapComboBoxPage_Insert
, BitmapComboBoxWidgetsPage::OnUpdateUIInsert
)
202 EVT_UPDATE_UI(BitmapComboBoxPage_LoadFromFile
, BitmapComboBoxWidgetsPage::OnUpdateUIInsert
)
203 EVT_UPDATE_UI(BitmapComboBoxPage_AddSeveral
, BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveral
)
204 EVT_UPDATE_UI(BitmapComboBoxPage_AddSeveralWithImages
, BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveralWithImages
)
205 EVT_UPDATE_UI(BitmapComboBoxPage_Clear
, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton
)
206 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteText
, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton
)
207 EVT_UPDATE_UI(BitmapComboBoxPage_Delete
, BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton
)
208 EVT_UPDATE_UI(BitmapComboBoxPage_Change
, BitmapComboBoxWidgetsPage::OnUpdateUIDeleteSelButton
)
209 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteSel
, BitmapComboBoxWidgetsPage::OnUpdateUIDeleteSelButton
)
211 EVT_COMBOBOX(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboBox
)
212 EVT_TEXT(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboText
)
213 EVT_TEXT_ENTER(BitmapComboBoxPage_Combo
, BitmapComboBoxWidgetsPage::OnComboText
)
215 EVT_CHECKBOX(wxID_ANY
, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox
)
216 EVT_RADIOBOX(wxID_ANY
, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox
)
219 // ============================================================================
221 // ============================================================================
225 IMPLEMENT_WIDGETS_PAGE(BitmapComboBoxWidgetsPage
, _T("BitmapCombobox"),
226 GENERIC_CTRLS
| WITH_ITEMS_CTRLS
| COMBO_CTRLS
230 BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl
*book
,
231 wxImageList
*imaglist
)
232 : WidgetsPage(book
, imaglist
, bmpcombobox_xpm
)
237 m_chkScaleimages
= (wxCheckBox
*)NULL
;
239 m_combobox
= (wxBitmapComboBox
*)NULL
;
240 m_sizerCombo
= (wxSizer
*)NULL
;
243 // create a sizer containing a label and a small text ctrl
244 wxSizer
*BitmapComboBoxWidgetsPage::CreateSizerWithSmallTextAndLabel(const wxString
& label
,
248 wxControl
* control
= new wxStaticText(this, wxID_ANY
, label
);
249 wxSizer
*sizerRow
= new wxBoxSizer(wxHORIZONTAL
);
250 wxTextCtrl
*text
= new wxTextCtrl(this, id
, wxEmptyString
,
251 wxDefaultPosition
, wxSize(50,-1), wxTE_PROCESS_ENTER
);
253 sizerRow
->Add(control
, 0, wxRIGHT
| wxALIGN_CENTRE_VERTICAL
, 5);
254 sizerRow
->Add(text
, 1, wxFIXED_MINSIZE
| wxLEFT
| wxALIGN_CENTRE_VERTICAL
, 5);
262 void BitmapComboBoxWidgetsPage::CreateContent()
265 What we create here is a frame having 3 panes: style pane is the
266 leftmost one, in the middle the pane with buttons allowing to perform
267 miscellaneous combobox operations and the pane containing the combobox
273 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
275 wxSizer
*sizerLeft
= new wxBoxSizer(wxVERTICAL
);
277 // left pane - style box
278 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, _T("&Set style"));
280 wxSizer
*sizerStyle
= new wxStaticBoxSizer(box
, wxVERTICAL
);
282 m_chkSort
= CreateCheckBoxAndAddToSizer(sizerStyle
, _T("&Sort items"));
283 m_chkReadonly
= CreateCheckBoxAndAddToSizer(sizerStyle
, _T("&Read only"));
285 wxButton
*btn
= new wxButton(this, BitmapComboBoxPage_Reset
, _T("&Reset"));
286 sizerStyle
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 3);
288 sizerLeft
->Add(sizerStyle
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
);
290 // left pane - other options box
291 box
= new wxStaticBox(this, wxID_ANY
, _T("Demo options"));
293 wxSizer
*sizerOptions
= new wxStaticBoxSizer(box
, wxVERTICAL
);
295 m_chkScaleimages
= CreateCheckBoxAndAddToSizer(sizerOptions
, _T("&Scale loaded images to fit"));
297 sizerRow
= CreateSizerWithSmallTextAndLabel(_T("Control &height:"),
298 BitmapComboBoxPage_ChangeHeight
,
299 &m_textChangeHeight
);
300 m_textChangeHeight
->SetSize(20, -1);
301 sizerOptions
->Add(sizerRow
, 0, wxALL
| wxFIXED_MINSIZE
/*| wxGROW*/, 5);
303 sizerLeft
->Add(sizerOptions
, 0, wxGROW
| wxALIGN_CENTRE_HORIZONTAL
| wxTOP
, 2);
306 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
,
307 _T("&Change wxBitmapComboBox contents"));
308 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
311 btn
= new wxButton(this, BitmapComboBoxPage_AddWidgetIcons
, _T("Add &widget icons"));
312 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
314 btn
= new wxButton(this, BitmapComboBoxPage_LoadFromFile
, _T("Insert image from &file"));
315 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
317 btn
= new wxButton(this, BitmapComboBoxPage_SetFromFile
, _T("&Set image from file"));
318 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
321 btn
= new wxButton(this, BitmapComboBoxPage_AddSeveralWithImages
, _T("A&ppend a few strings with images"));
322 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
324 btn
= new wxButton(this, BitmapComboBoxPage_AddSeveral
, _T("Append a &few strings"));
325 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
327 btn
= new wxButton(this, BitmapComboBoxPage_AddMany
, _T("Append &many strings"));
328 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
330 sizerRow
= CreateSizerWithTextAndButton(BitmapComboBoxPage_Delete
,
331 _T("&Delete this item"),
332 BitmapComboBoxPage_DeleteText
,
334 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
336 btn
= new wxButton(this, BitmapComboBoxPage_DeleteSel
, _T("Delete &selection"));
337 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
339 btn
= new wxButton(this, BitmapComboBoxPage_Clear
, _T("&Clear"));
340 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
343 wxInitAllImageHandlers();
347 wxSizer
*sizerRight
= new wxBoxSizer(wxVERTICAL
);
348 m_combobox
= new wxBitmapComboBox();
349 m_combobox
->Create(this, BitmapComboBoxPage_Combo
, wxEmptyString
,
350 wxDefaultPosition
, wxDefaultSize
,
354 #if defined(wxGENERIC_BITMAPCOMBOBOX)
355 // This will sure make the list look nicer when larger images are used.
356 m_combobox
->SetPopupMaxHeight(600);
359 sizerRight
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
360 sizerRight
->SetMinSize(150, 0);
361 m_sizerCombo
= sizerRight
; // save it to modify it later
363 // the 3 panes panes compose the window
364 sizerTop
->Add(sizerLeft
, 0, wxGROW
| (wxALL
& ~wxLEFT
), 10);
365 sizerTop
->Add(sizerMiddle
, 5, wxGROW
| wxALL
, 10);
366 sizerTop
->Add(sizerRight
, 4, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
368 // final initializations
376 // ----------------------------------------------------------------------------
378 // ----------------------------------------------------------------------------
380 void BitmapComboBoxWidgetsPage::Reset()
382 m_chkSort
->SetValue(false);
383 m_chkReadonly
->SetValue(true);
384 m_chkScaleimages
->SetValue(true);
387 void BitmapComboBoxWidgetsPage::CreateCombo()
389 int flags
= ms_defaultFlags
;
391 if ( m_chkSort
->GetValue() )
393 if ( m_chkReadonly
->GetValue() )
394 flags
|= wxCB_READONLY
;
397 wxArrayPtrVoid bitmaps
;
400 unsigned int count
= m_combobox
->GetCount();
401 for ( unsigned int n
= 0; n
< count
; n
++ )
403 items
.Add(m_combobox
->GetString(n
));
404 bitmaps
.Add(new wxBitmap(m_combobox
->GetItemBitmap(n
)));
407 m_sizerCombo
->Detach( m_combobox
);
411 m_combobox
= new wxBitmapComboBox();
412 m_combobox
->Create(this, BitmapComboBoxPage_Combo
, wxEmptyString
,
413 wxDefaultPosition
, wxDefaultSize
,
417 #if defined(wxGENERIC_BITMAPCOMBOBOX)
418 // This will sure make the list look nicer when larger images are used.
419 m_combobox
->SetPopupMaxHeight(600);
422 unsigned int count
= items
.GetCount();
423 for ( unsigned int n
= 0; n
< count
; n
++ )
425 wxBitmap
* bmp
= (wxBitmap
*) bitmaps
[n
];
426 m_combobox
->Append(items
[n
], *bmp
);
430 m_sizerCombo
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
431 m_sizerCombo
->Layout();
433 // Allow changing height inorder to demonstrate flexible
434 // size of image "thumbnail" painted in the control itself.
436 m_textChangeHeight
->GetValue().ToLong(&h
);
438 m_combobox
->SetSize(-1, h
);
441 // ----------------------------------------------------------------------------
443 // ----------------------------------------------------------------------------
445 void BitmapComboBoxWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
452 void BitmapComboBoxWidgetsPage::OnButtonChange(wxCommandEvent
& WXUNUSED(event
))
454 int sel
= m_combobox
->GetSelection();
455 if ( sel
!= wxNOT_FOUND
)
458 m_combobox
->SetString(sel
, m_textChange
->GetValue());
460 wxLogMessage(_T("Not implemented in wxGTK"));
465 void BitmapComboBoxWidgetsPage::OnButtonDelete(wxCommandEvent
& WXUNUSED(event
))
468 if ( !m_textDelete
->GetValue().ToULong(&n
) ||
469 (n
>= m_combobox
->GetCount()) )
474 m_combobox
->Delete(n
);
477 void BitmapComboBoxWidgetsPage::OnButtonDeleteSel(wxCommandEvent
& WXUNUSED(event
))
479 int sel
= m_combobox
->GetSelection();
480 if ( sel
!= wxNOT_FOUND
)
482 m_combobox
->Delete(sel
);
486 void BitmapComboBoxWidgetsPage::OnButtonClear(wxCommandEvent
& WXUNUSED(event
))
491 void BitmapComboBoxWidgetsPage::OnButtonInsert(wxCommandEvent
& WXUNUSED(event
))
493 static unsigned int s_item
= 0;
495 wxString s
= m_textInsert
->GetValue();
496 if ( !m_textInsert
->IsModified() )
498 // update the default string
499 m_textInsert
->SetValue(wxString::Format(_T("test item %u"), ++s_item
));
502 if (m_combobox
->GetSelection() >= 0)
503 m_combobox
->Insert(s
, wxNullBitmap
, m_combobox
->GetSelection());
506 void BitmapComboBoxWidgetsPage::OnTextChangeHeight(wxCommandEvent
& WXUNUSED(event
))
509 m_textChangeHeight
->GetValue().ToLong(&h
);
512 m_combobox
->SetSize(-1, h
);
515 void BitmapComboBoxWidgetsPage::OnButtonLoadFromFile(wxCommandEvent
& WXUNUSED(event
))
518 m_combobox
->Insert(s
, QueryBitmap(&s
), m_combobox
->GetSelection());
521 void BitmapComboBoxWidgetsPage::OnButtonSetFromFile(wxCommandEvent
& WXUNUSED(event
))
523 m_combobox
->SetItemBitmap(m_combobox
->GetSelection(), QueryBitmap(NULL
));
526 void BitmapComboBoxWidgetsPage::OnButtonAddMany(wxCommandEvent
& WXUNUSED(event
))
528 // "many" means 1000 here
529 for ( unsigned int n
= 0; n
< 1000; n
++ )
531 m_combobox
->Append(wxString::Format(_T("item #%u"), n
));
535 void BitmapComboBoxWidgetsPage::OnButtonAddSeveral(wxCommandEvent
& WXUNUSED(event
))
537 m_combobox
->Append(_T("First"));
538 m_combobox
->Append(_T("another one"));
539 m_combobox
->Append(_T("and the last (very very very very very very very very very very long) one"));
542 void BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages(wxCommandEvent
& WXUNUSED(event
))
546 for ( i
=0; i
<4; i
++ )
549 wxBitmap bmp
= CreateRandomBitmap(&s
);
550 m_combobox
->Append(s
, bmp
);
554 void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString
* strings
, wxImageList
* images
)
558 fn
.AppendDir(wxT("icons"));
560 wxSetCursor(*wxHOURGLASS_CURSOR
);
562 if ( !wxDir::Exists(fn
.GetFullPath()) ||
563 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
567 fn
.AppendDir(wxT("icons"));
568 if ( !wxDir::Exists(fn
.GetFullPath()) ||
569 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
571 // Try ../../../samples/widgets/icons
576 fn
.AppendDir(wxT("samples"));
577 fn
.AppendDir(wxT("widgets"));
578 fn
.AppendDir(wxT("icons"));
579 if ( !wxDir::Exists(fn
.GetFullPath()) ||
580 !wxDir::GetAllFiles(fn
.GetFullPath(),strings
,wxT("*.xpm")) )
582 wxLogWarning(wxT("Could not load widget icons."));
583 wxSetCursor(*wxSTANDARD_CURSOR
);
591 // Get size of existing images in list
592 wxSize foundSize
= m_combobox
->GetBitmapSize();
594 for ( i
=0; i
<strings
->size(); i
++ )
596 fn
.SetFullName((*strings
)[i
]);
597 wxString name
=fn
.GetName();
599 // Handle few exceptions
600 if ( name
== wxT("bmpbtn") )
602 strings
->RemoveAt(i
);
608 wxASSERT(fn
.FileExists());
609 wxImage
image(fn
.GetFullPath());
610 wxASSERT(image
.Ok());
611 if ( m_chkScaleimages
->GetValue() && foundSize
.x
> 0 )
612 image
.Rescale(foundSize
.x
, foundSize
.y
);
614 wxASSERT( bmp
.Ok() );
616 wxBitmap
bmp(wxNullBitmap
);
619 (*strings
)[i
] = name
;
623 wxSetCursor(*wxSTANDARD_CURSOR
);
626 void BitmapComboBoxWidgetsPage::OnButtonAddWidgetIcons(wxCommandEvent
& WXUNUSED(event
))
628 wxArrayString strings
;
631 //if ( m_chkScaleimages->GetValue() )
634 wxImageList
images(sz
, sz
);
636 LoadWidgetImages(&strings
, &images
);
640 for ( i
=0; i
<strings
.size(); i
++ )
642 m_combobox
->Append(strings
[i
], images
.GetBitmap(i
));
646 void BitmapComboBoxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent
& event
)
649 event
.Enable( m_chkSort
->GetValue() || m_chkReadonly
->GetValue() );
652 void BitmapComboBoxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent
& event
)
656 bool enable
= !(m_combobox
->GetWindowStyle() & wxCB_SORT
);
658 event
.Enable(enable
);
662 void BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
)
667 event
.Enable(m_textDelete
->GetValue().ToULong(&n
) &&
668 (n
< (unsigned)m_combobox
->GetCount()));
672 void BitmapComboBoxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent
& event
)
675 event
.Enable(m_combobox
->GetSelection() != wxNOT_FOUND
);
678 void BitmapComboBoxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent
& event
)
681 event
.Enable(m_combobox
->GetCount() != 0);
684 void BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent
& event
)
687 event
.Enable(!(m_combobox
->GetWindowStyle() & wxCB_SORT
));
690 void BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveralWithImages(wxUpdateUIEvent
& event
)
693 event
.Enable(!(m_combobox
->GetWindowStyle() & wxCB_SORT
));
696 void BitmapComboBoxWidgetsPage::OnComboText(wxCommandEvent
& event
)
701 wxString s
= event
.GetString();
703 wxASSERT_MSG( s
== m_combobox
->GetValue(),
704 _T("event and combobox values should be the same") );
706 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
707 wxLogMessage(_T("BitmapCombobox enter pressed (now '%s')"), s
.c_str());
709 wxLogMessage(_T("BitmapCombobox text changed (now '%s')"), s
.c_str());
712 void BitmapComboBoxWidgetsPage::OnComboBox(wxCommandEvent
& event
)
714 long sel
= event
.GetInt();
715 m_textDelete
->SetValue(wxString::Format(_T("%ld"), sel
));
717 wxLogMessage(_T("BitmapCombobox item %ld selected"), sel
);
719 wxLogMessage(_T("BitmapCombobox GetValue(): %s"), m_combobox
->GetValue().c_str() );
722 void BitmapComboBoxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
728 wxBitmap
BitmapComboBoxWidgetsPage::LoadBitmap(const wxString
& filepath
)
730 // Get size of existing images in list
731 wxSize foundSize
= m_combobox
->GetBitmapSize();
733 wxImage
image(filepath
);
736 // Rescale very large images
737 int ow
= image
.GetWidth();
738 int oh
= image
.GetHeight();
740 if ( foundSize
.x
> 0 &&
741 (ow
!= foundSize
.x
|| oh
!= foundSize
.y
) )
744 if ( w
> foundSize
.x
)
747 if ( h
> foundSize
.y
)
753 return wxBitmap(image
);
759 wxBitmap
BitmapComboBoxWidgetsPage::LoadBitmap(const wxString
& WXUNUSED(filepath
))
765 wxBitmap
BitmapComboBoxWidgetsPage::QueryBitmap(wxString
* pStr
)
767 wxString filepath
= wxFileSelector(wxT("Choose image file"),
772 wxFD_OPEN
| wxFD_FILE_MUST_EXIST
,
777 ::wxSetCursor( *wxHOURGLASS_CURSOR
);
779 if ( filepath
.length() )
783 *pStr
= wxFileName(filepath
).GetName();
786 bitmap
= LoadBitmap(filepath
);
789 ::wxSetCursor( *wxSTANDARD_CURSOR
);
794 wxBitmap
BitmapComboBoxWidgetsPage::CreateBitmap(const wxColour
& colour
)
796 int ch
= m_combobox
->GetBitmapSize().y
;
811 dc
.SelectObject(bmp
);
813 // Draw transparent background
814 wxColour
magic(255,0,255);
815 wxBrush
magicBrush(magic
);
816 dc
.SetBrush(magicBrush
);
817 dc
.SetPen(*wxTRANSPARENT_PEN
);
818 dc
.DrawRectangle(0,0,bmp
.GetWidth(),bmp
.GetHeight());
820 // Draw image content
821 dc
.SetBrush(wxBrush(colour
));
822 dc
.DrawCircle(h
/2,h
/2+1,(h
/2));
824 dc
.SelectObject(wxNullBitmap
);
826 // Finalize transparency with a mask
827 wxMask
*mask
= new wxMask(bmp
, magic
);
833 wxBitmap
BitmapComboBoxWidgetsPage::CreateRandomBitmap( wxString
* pStr
)
836 const wxChar
* str
= wxT("");
841 str
= wxT("Red Circle");
842 bmp
= CreateBitmap( *wxRED
);
846 str
= wxT("Green Circle");
847 bmp
= CreateBitmap( *wxGREEN
);
851 str
= wxT("Blue Circle");
852 bmp
= CreateBitmap( *wxBLUE
);
856 str
= wxT("Black Circle");
857 bmp
= CreateBitmap( *wxBLACK
);
861 str
= wxT("Cyan Circle");
862 bmp
= CreateBitmap( *wxCYAN
);
866 str
= wxT("Light Grey Circle");
867 bmp
= CreateBitmap( *wxLIGHT_GREY
);
876 #endif //wxUSE_BITMAPCOMBOBOX