]> git.saurik.com Git - wxWidgets.git/blame - samples/widgets/bmpcombobox.cpp
added XRC handler for wxFileCtrl (closes #10785)
[wxWidgets.git] / samples / widgets / bmpcombobox.cpp
CommitLineData
95a46303
RR
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
9654efd3 7// Id: $Id$
95a46303
RR
8// Copyright: (c) 2006 Jaakko Salli
9// License: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// for compilers that support precompilation, includes "wx/wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27#if wxUSE_BITMAPCOMBOBOX
28
29// for all others, include the necessary headers
30#ifndef WX_PRECOMP
31 #include "wx/log.h"
32
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"
41#endif
42
43#include "wx/stattext.h"
44#include "wx/dc.h"
45#include "wx/dcmemory.h"
46#include "wx/sizer.h"
47#include "wx/icon.h"
48#include "wx/dir.h"
dc5a8485 49#include "wx/msgdlg.h"
95a46303
RR
50#include "wx/filename.h"
51#include "wx/image.h"
52#include "wx/imaglist.h"
53#include "wx/bmpcbox.h"
54
a236aa20 55#include "itemcontainer.h"
95a46303
RR
56#include "widgets.h"
57
b2b98dfd 58#include "icons/bmpcombobox.xpm"
95a46303
RR
59
60// Images loaded from file are reduced this width and height, if larger
dc5a8485 61#define IMG_SIZE_TRUNC 256
95a46303
RR
62
63
64// ----------------------------------------------------------------------------
65// constants
66// ----------------------------------------------------------------------------
67
68// control ids
69enum
70{
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,
a236aa20
VZ
86 BitmapComboBoxPage_Combo,
87 BitmapComboBoxPage_ContainerTests
95a46303
RR
88};
89
67abc783
VZ
90// kinds of comboboxes
91enum
92{
93 ComboKind_Default,
94 ComboKind_Simple,
95 ComboKind_DropDown
96};
95a46303
RR
97
98// ----------------------------------------------------------------------------
99// BitmapComboBoxWidgetsPage
100// ----------------------------------------------------------------------------
101
a236aa20 102class BitmapComboBoxWidgetsPage : public ItemContainerWidgetsPage
95a46303
RR
103{
104public:
105 BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
106
107 virtual wxControl *GetWidget() const { return m_combobox; }
a236aa20 108 virtual wxItemContainer* GetContainer() const { return m_combobox; }
95a46303
RR
109 virtual void RecreateWidget() { CreateCombo(); }
110
111 // lazy creation of the content
112 virtual void CreateContent();
113
114protected:
115 // event handlers
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);
129
130 void OnComboBox(wxCommandEvent& event);
131 void OnComboText(wxCommandEvent& event);
132
133 void OnCheckOrRadioBox(wxCommandEvent& event);
134
135 void OnTextPopupWidth(wxCommandEvent& event);
136 void OnTextPopupHeight(wxCommandEvent& event);
137 void OnTextButtonAll(wxCommandEvent& event);
138
139 void OnUpdateUIInsert(wxUpdateUIEvent& event);
140 void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
141 void OnUpdateUIAddSeveralWithImages(wxUpdateUIEvent& event);
142 void OnUpdateUIClearButton(wxUpdateUIEvent& event);
143 void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
9654efd3 144 void OnUpdateUIItemManipulator(wxUpdateUIEvent& event);
95a46303
RR
145 void OnUpdateUIResetButton(wxUpdateUIEvent& event);
146
147 // reset the bmpcombobox parameters
148 void Reset();
149
150 // (re)create the bmpcombobox
151 void CreateCombo();
152
153 // helpers for creating bitmaps
154 wxBitmap CreateBitmap(const wxColour& colour);
95a46303
RR
155 wxBitmap LoadBitmap(const wxString& filepath);
156 wxBitmap QueryBitmap(wxString* pStr);
157
158 void LoadWidgetImages( wxArrayString* strings, wxImageList* images );
159
160 wxSizer *CreateSizerWithSmallTextAndLabel(const wxString& label,
161 wxWindowID id,
162 wxTextCtrl **ppText);
163
dc5a8485
WS
164#if wxUSE_IMAGE
165 void RescaleImage(wxImage& image, int w, int h);
166#endif
167
95a46303
RR
168 // the controls
169 // ------------
170
67abc783
VZ
171 // the sel mode radiobox
172 wxRadioBox *m_radioKind;
173
95a46303
RR
174 // the checkboxes for styles
175 wxCheckBox *m_chkSort,
dc5a8485 176 *m_chkReadonly;
95a46303
RR
177
178 // the combobox itself and the sizer it is in
179 wxBitmapComboBox *m_combobox;
180 wxSizer *m_sizerCombo;
181
182 // the text entries for "Add/change string" and "Delete" buttons
183 wxTextCtrl *m_textInsert,
184 *m_textChangeHeight,
185 *m_textChange,
186 *m_textDelete;
187
188private:
189 DECLARE_EVENT_TABLE()
190 DECLARE_WIDGETS_PAGE(BitmapComboBoxWidgetsPage)
191};
192
193// ----------------------------------------------------------------------------
194// event tables
195// ----------------------------------------------------------------------------
196
197BEGIN_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)
a236aa20 210 EVT_BUTTON(BitmapComboBoxPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
95a46303
RR
211
212 EVT_TEXT_ENTER(BitmapComboBoxPage_InsertText, BitmapComboBoxWidgetsPage::OnButtonInsert)
213 EVT_TEXT(BitmapComboBoxPage_ChangeHeight, BitmapComboBoxWidgetsPage::OnTextChangeHeight)
214 EVT_TEXT_ENTER(BitmapComboBoxPage_DeleteText, BitmapComboBoxWidgetsPage::OnButtonDelete)
215
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_AddSeveral, BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveral)
220 EVT_UPDATE_UI(BitmapComboBoxPage_AddSeveralWithImages, BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveralWithImages)
221 EVT_UPDATE_UI(BitmapComboBoxPage_Clear, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton)
222 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteText, BitmapComboBoxWidgetsPage::OnUpdateUIClearButton)
223 EVT_UPDATE_UI(BitmapComboBoxPage_Delete, BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton)
9654efd3
WS
224 EVT_UPDATE_UI(BitmapComboBoxPage_Change, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator)
225 EVT_UPDATE_UI(BitmapComboBoxPage_SetFromFile, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator)
226 EVT_UPDATE_UI(BitmapComboBoxPage_DeleteSel, BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator)
95a46303
RR
227
228 EVT_COMBOBOX(BitmapComboBoxPage_Combo, BitmapComboBoxWidgetsPage::OnComboBox)
229 EVT_TEXT(BitmapComboBoxPage_Combo, BitmapComboBoxWidgetsPage::OnComboText)
230 EVT_TEXT_ENTER(BitmapComboBoxPage_Combo, BitmapComboBoxWidgetsPage::OnComboText)
231
232 EVT_CHECKBOX(wxID_ANY, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox)
233 EVT_RADIOBOX(wxID_ANY, BitmapComboBoxWidgetsPage::OnCheckOrRadioBox)
234END_EVENT_TABLE()
235
236// ============================================================================
237// implementation
238// ============================================================================
239
67abc783
VZ
240#if defined(__WXMSW__) || defined(__WXGTK__)
241 #define NATIVE_OR_GENERIC_CTRLS NATIVE_CTRLS
242#else
243 #define NATIVE_OR_GENERIC_CTRLS GENERIC_CTRLS
244#endif
95a46303
RR
245
246IMPLEMENT_WIDGETS_PAGE(BitmapComboBoxWidgetsPage, _T("BitmapCombobox"),
67abc783 247 NATIVE_OR_GENERIC_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS
95a46303
RR
248 );
249
250
251BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book,
252 wxImageList *imaglist)
a236aa20 253 : ItemContainerWidgetsPage(book, imaglist, bmpcombobox_xpm)
95a46303
RR
254{
255 // init everything
256 m_chkSort =
73545b12 257 m_chkReadonly = NULL;
95a46303 258
73545b12
VZ
259 m_combobox = NULL;
260 m_sizerCombo = NULL;
261
262 m_textInsert =
263 m_textChangeHeight =
264 m_textChange =
265 m_textDelete = NULL;
95a46303
RR
266}
267
268// create a sizer containing a label and a small text ctrl
269wxSizer *BitmapComboBoxWidgetsPage::CreateSizerWithSmallTextAndLabel(const wxString& label,
270 wxWindowID id,
271 wxTextCtrl **ppText)
272{
273 wxControl* control = new wxStaticText(this, wxID_ANY, label);
274 wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL);
275 wxTextCtrl *text = new wxTextCtrl(this, id, wxEmptyString,
008a2655 276 wxDefaultPosition, wxSize(50,wxDefaultCoord), wxTE_PROCESS_ENTER);
95a46303
RR
277
278 sizerRow->Add(control, 0, wxRIGHT | wxALIGN_CENTRE_VERTICAL, 5);
279 sizerRow->Add(text, 1, wxFIXED_MINSIZE | wxLEFT | wxALIGN_CENTRE_VERTICAL, 5);
280
281 if ( ppText )
282 *ppText = text;
283
284 return sizerRow;
285}
286
287void BitmapComboBoxWidgetsPage::CreateContent()
288{
289 /*
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
293 itself to the right
294 */
95a46303
RR
295 wxSizer *sizerRow;
296
297 wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
298
299 wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
300
301 // left pane - style box
302 wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style"));
303
67abc783
VZ
304
305 // should be in sync with ComboKind_XXX values
306 static const wxString kinds[] =
307 {
308 _T("default"),
309 _T("simple"),
310 _T("drop down"),
311 };
312
313 m_radioKind = new wxRadioBox(this, wxID_ANY, _T("Combobox &kind:"),
314 wxDefaultPosition, wxDefaultSize,
315 WXSIZEOF(kinds), kinds,
316 1, wxRA_SPECIFY_COLS);
317
95a46303
RR
318 wxSizer *sizerStyle = new wxStaticBoxSizer(box, wxVERTICAL);
319
320 m_chkSort = CreateCheckBoxAndAddToSizer(sizerStyle, _T("&Sort items"));
321 m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerStyle, _T("&Read only"));
322
323 wxButton *btn = new wxButton(this, BitmapComboBoxPage_Reset, _T("&Reset"));
324 sizerStyle->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 3);
325
326 sizerLeft->Add(sizerStyle, 0, wxGROW | wxALIGN_CENTRE_HORIZONTAL);
67abc783 327 sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5);
95a46303
RR
328
329 // left pane - other options box
330 box = new wxStaticBox(this, wxID_ANY, _T("Demo options"));
331
332 wxSizer *sizerOptions = new wxStaticBoxSizer(box, wxVERTICAL);
333
95a46303
RR
334 sizerRow = CreateSizerWithSmallTextAndLabel(_T("Control &height:"),
335 BitmapComboBoxPage_ChangeHeight,
336 &m_textChangeHeight);
008a2655 337 m_textChangeHeight->SetSize(20, wxDefaultCoord);
95a46303
RR
338 sizerOptions->Add(sizerRow, 0, wxALL | wxFIXED_MINSIZE /*| wxGROW*/, 5);
339
340 sizerLeft->Add(sizerOptions, 0, wxGROW | wxALIGN_CENTRE_HORIZONTAL | wxTOP, 2);
341
342 // middle pane
343 wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,
344 _T("&Change wxBitmapComboBox contents"));
345 wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
346
a236aa20
VZ
347 btn = new wxButton(this, BitmapComboBoxPage_ContainerTests, _T("Run &tests"));
348 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
349
95a46303
RR
350#if wxUSE_IMAGE
351 btn = new wxButton(this, BitmapComboBoxPage_AddWidgetIcons, _T("Add &widget icons"));
352 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
353
354 btn = new wxButton(this, BitmapComboBoxPage_LoadFromFile, _T("Insert image from &file"));
355 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
356
357 btn = new wxButton(this, BitmapComboBoxPage_SetFromFile, _T("&Set image from file"));
358 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
359#endif
360
361 btn = new wxButton(this, BitmapComboBoxPage_AddSeveralWithImages, _T("A&ppend a few strings with images"));
362 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
363
364 btn = new wxButton(this, BitmapComboBoxPage_AddSeveral, _T("Append a &few strings"));
365 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
366
367 btn = new wxButton(this, BitmapComboBoxPage_AddMany, _T("Append &many strings"));
368 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
369
370 sizerRow = CreateSizerWithTextAndButton(BitmapComboBoxPage_Delete,
371 _T("&Delete this item"),
372 BitmapComboBoxPage_DeleteText,
373 &m_textDelete);
374 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
375
376 btn = new wxButton(this, BitmapComboBoxPage_DeleteSel, _T("Delete &selection"));
377 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
378
379 btn = new wxButton(this, BitmapComboBoxPage_Clear, _T("&Clear"));
380 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
381
382#if wxUSE_IMAGE
383 wxInitAllImageHandlers();
384#endif
385
386 // right pane
387 wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
388 m_combobox = new wxBitmapComboBox();
389 m_combobox->Create(this, BitmapComboBoxPage_Combo, wxEmptyString,
390 wxDefaultPosition, wxDefaultSize,
391 0, NULL,
392 wxCB_READONLY);
393
394#if defined(wxGENERIC_BITMAPCOMBOBOX)
395 // This will sure make the list look nicer when larger images are used.
396 m_combobox->SetPopupMaxHeight(600);
397#endif
398
399 sizerRight->Add(m_combobox, 0, wxGROW | wxALL, 5);
400 sizerRight->SetMinSize(150, 0);
401 m_sizerCombo = sizerRight; // save it to modify it later
402
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);
407
408 // final initializations
409 Reset();
410
411 SetSizer(sizerTop);
95a46303
RR
412}
413
414// ----------------------------------------------------------------------------
415// operations
416// ----------------------------------------------------------------------------
417
418void BitmapComboBoxWidgetsPage::Reset()
419{
420 m_chkSort->SetValue(false);
421 m_chkReadonly->SetValue(true);
95a46303
RR
422}
423
424void BitmapComboBoxWidgetsPage::CreateCombo()
425{
426 int flags = ms_defaultFlags;
427
428 if ( m_chkSort->GetValue() )
429 flags |= wxCB_SORT;
430 if ( m_chkReadonly->GetValue() )
431 flags |= wxCB_READONLY;
432
67abc783
VZ
433 switch ( m_radioKind->GetSelection() )
434 {
435 default:
436 wxFAIL_MSG( _T("unknown combo kind") );
437 // fall through
438
439 case ComboKind_Default:
440 break;
441
442 case ComboKind_Simple:
443 flags |= wxCB_SIMPLE;
444 break;
445
446 case ComboKind_DropDown:
447 flags = wxCB_DROPDOWN;
448 break;
449 }
450
95a46303
RR
451 wxArrayString items;
452 wxArrayPtrVoid bitmaps;
453 if ( m_combobox )
454 {
455 unsigned int count = m_combobox->GetCount();
456 for ( unsigned int n = 0; n < count; n++ )
457 {
458 items.Add(m_combobox->GetString(n));
459 bitmaps.Add(new wxBitmap(m_combobox->GetItemBitmap(n)));
460 }
461
462 m_sizerCombo->Detach( m_combobox );
463 delete m_combobox;
464 }
465
466 m_combobox = new wxBitmapComboBox();
467 m_combobox->Create(this, BitmapComboBoxPage_Combo, wxEmptyString,
468 wxDefaultPosition, wxDefaultSize,
469 0, NULL,
470 flags);
471
472#if defined(wxGENERIC_BITMAPCOMBOBOX)
473 // This will sure make the list look nicer when larger images are used.
474 m_combobox->SetPopupMaxHeight(600);
475#endif
476
477 unsigned int count = items.GetCount();
478 for ( unsigned int n = 0; n < count; n++ )
479 {
480 wxBitmap* bmp = (wxBitmap*) bitmaps[n];
481 m_combobox->Append(items[n], *bmp);
482 delete bmp;
483 }
484
485 m_sizerCombo->Add(m_combobox, 0, wxGROW | wxALL, 5);
486 m_sizerCombo->Layout();
487
488 // Allow changing height inorder to demonstrate flexible
489 // size of image "thumbnail" painted in the control itself.
490 long h = 0;
491 m_textChangeHeight->GetValue().ToLong(&h);
492 if ( h >= 5 )
008a2655 493 m_combobox->SetSize(wxDefaultCoord, h);
95a46303
RR
494}
495
496// ----------------------------------------------------------------------------
497// event handlers
498// ----------------------------------------------------------------------------
499
500void BitmapComboBoxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
501{
502 Reset();
503
504 CreateCombo();
505}
506
507void BitmapComboBoxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
508{
509 int sel = m_combobox->GetSelection();
510 if ( sel != wxNOT_FOUND )
511 {
512#ifndef __WXGTK__
513 m_combobox->SetString(sel, m_textChange->GetValue());
514#else
515 wxLogMessage(_T("Not implemented in wxGTK"));
516#endif
517 }
518}
519
520void BitmapComboBoxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
521{
522 unsigned long n;
523 if ( !m_textDelete->GetValue().ToULong(&n) ||
524 (n >= m_combobox->GetCount()) )
525 {
526 return;
527 }
528
529 m_combobox->Delete(n);
530}
531
532void BitmapComboBoxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
533{
534 int sel = m_combobox->GetSelection();
535 if ( sel != wxNOT_FOUND )
536 {
537 m_combobox->Delete(sel);
538 }
539}
540
541void BitmapComboBoxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
542{
543 m_combobox->Clear();
544}
545
546void BitmapComboBoxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
547{
548 static unsigned int s_item = 0;
549
550 wxString s = m_textInsert->GetValue();
551 if ( !m_textInsert->IsModified() )
552 {
553 // update the default string
554 m_textInsert->SetValue(wxString::Format(_T("test item %u"), ++s_item));
555 }
556
008a2655
WS
557 int sel = m_combobox->GetSelection();
558 if ( sel == wxNOT_FOUND )
559 sel = m_combobox->GetCount();
560
561 m_combobox->Insert(s, wxNullBitmap, m_combobox->GetSelection());
95a46303
RR
562}
563
564void BitmapComboBoxWidgetsPage::OnTextChangeHeight(wxCommandEvent& WXUNUSED(event))
565{
566 long h = 0;
73545b12
VZ
567 if ( m_textChangeHeight )
568 m_textChangeHeight->GetValue().ToLong(&h);
95a46303
RR
569 if ( h < 5 )
570 return;
008a2655 571 m_combobox->SetSize(wxDefaultCoord, h);
95a46303
RR
572}
573
574void BitmapComboBoxWidgetsPage::OnButtonLoadFromFile(wxCommandEvent& WXUNUSED(event))
575{
576 wxString s;
008a2655
WS
577 int sel = m_combobox->GetSelection();
578 if ( sel == wxNOT_FOUND )
579 sel = m_combobox->GetCount();
580
1bf04545
FM
581 wxBitmap bmp = QueryBitmap(&s);
582 if (bmp.IsOk())
583 m_combobox->Insert(s, bmp, sel);
95a46303
RR
584}
585
586void BitmapComboBoxWidgetsPage::OnButtonSetFromFile(wxCommandEvent& WXUNUSED(event))
587{
1bf04545
FM
588 wxBitmap bmp = QueryBitmap(NULL);
589 if (bmp.IsOk())
590 m_combobox->SetItemBitmap(m_combobox->GetSelection(), bmp);
95a46303
RR
591}
592
593void BitmapComboBoxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
594{
595 // "many" means 1000 here
596 for ( unsigned int n = 0; n < 1000; n++ )
597 {
598 m_combobox->Append(wxString::Format(_T("item #%u"), n));
599 }
600}
601
602void BitmapComboBoxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
603{
604 m_combobox->Append(_T("First"));
605 m_combobox->Append(_T("another one"));
606 m_combobox->Append(_T("and the last (very very very very very very very very very very long) one"));
607}
608
609void BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages(wxCommandEvent& WXUNUSED(event))
610{
c8d380be
VZ
611 static const struct TestEntry
612 {
613 const char *text;
614 unsigned long rgb;
615 } s_entries[] =
616 {
617 { "Red circle", 0x0000ff },
618 { "Blue circle", 0xff0000 },
619 { "Green circle", 0x00ff00 },
620 { "Black circle", 0x000000 },
621 };
95a46303 622
6214812c 623 for ( unsigned i = 0; i < WXSIZEOF(s_entries); i++ )
95a46303 624 {
c8d380be
VZ
625 const TestEntry& e = s_entries[i];
626 m_combobox->Append(e.text, CreateBitmap(wxColour(e.rgb)));
95a46303
RR
627 }
628}
629
dc5a8485
WS
630#if wxUSE_IMAGE
631void BitmapComboBoxWidgetsPage::RescaleImage(wxImage& image, int w, int h)
632{
633 if ( image.GetWidth() == w && image.GetHeight() == h )
634 return;
635
636 if ( w <= 0 || h <= 0 )
637 return;
638
639 static bool isFirstScale = true;
640
641 if ( isFirstScale && m_combobox->GetCount() > 0 )
642 {
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."),
646 wxT("Notice"),
647 wxOK,
648 this );
649
650 isFirstScale = false;
651 }
652
653 image.Rescale(w, h);
654}
655#endif
656
95a46303
RR
657void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString* strings, wxImageList* images )
658{
659 wxFileName fn;
660 fn.AssignCwd();
661 fn.AppendDir(wxT("icons"));
008a2655 662
95a46303
RR
663 wxSetCursor(*wxHOURGLASS_CURSOR);
664
665 if ( !wxDir::Exists(fn.GetFullPath()) ||
666 !wxDir::GetAllFiles(fn.GetFullPath(),strings,wxT("*.xpm")) )
667 {
1bf04545 668 // Try ../../samples/widgets/icons
95a46303
RR
669 fn.RemoveLastDir();
670 fn.RemoveLastDir();
671 fn.AppendDir(wxT("icons"));
672 if ( !wxDir::Exists(fn.GetFullPath()) ||
673 !wxDir::GetAllFiles(fn.GetFullPath(),strings,wxT("*.xpm")) )
674 {
675 // Try ../../../samples/widgets/icons
676 fn.AssignCwd();
677 fn.RemoveLastDir();
678 fn.RemoveLastDir();
679 fn.RemoveLastDir();
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")) )
685 {
686 wxLogWarning(wxT("Could not load widget icons."));
687 wxSetCursor(*wxSTANDARD_CURSOR);
688 return;
689 }
690 }
691 }
692
693 unsigned int i;
694
695 // Get size of existing images in list
696 wxSize foundSize = m_combobox->GetBitmapSize();
697
698 for ( i=0; i<strings->size(); i++ )
699 {
700 fn.SetFullName((*strings)[i]);
1bf04545 701 wxString name = fn.GetName();
95a46303
RR
702
703 // Handle few exceptions
704 if ( name == wxT("bmpbtn") )
705 {
706 strings->RemoveAt(i);
707 i--;
708 }
709 else
710 {
711#if wxUSE_IMAGE
712 wxASSERT(fn.FileExists());
713 wxImage image(fn.GetFullPath());
714 wxASSERT(image.Ok());
dc5a8485 715 RescaleImage(image, foundSize.x, foundSize.y);
95a46303
RR
716 wxBitmap bmp(image);
717 wxASSERT( bmp.Ok() );
718#else
719 wxBitmap bmp(wxNullBitmap);
720#endif
721 images->Add(bmp);
722 (*strings)[i] = name;
1bf04545
FM
723
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();
95a46303
RR
728 }
729 }
730
731 wxSetCursor(*wxSTANDARD_CURSOR);
732}
733
734void BitmapComboBoxWidgetsPage::OnButtonAddWidgetIcons(wxCommandEvent& WXUNUSED(event))
735{
736 wxArrayString strings;
737
008a2655
WS
738 wxSize sz = m_combobox->GetBitmapSize();
739 if ( sz.x <= 0 )
740 {
741 sz.x = 32;
742 sz.y = 32;
743 }
95a46303 744
008a2655 745 wxImageList images(sz.x, sz.y);
95a46303
RR
746
747 LoadWidgetImages(&strings, &images);
748
749 unsigned int i;
750
751 for ( i=0; i<strings.size(); i++ )
752 {
753 m_combobox->Append(strings[i], images.GetBitmap(i));
754 }
755}
756
757void BitmapComboBoxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
758{
759 if (m_combobox)
760 event.Enable( m_chkSort->GetValue() || m_chkReadonly->GetValue() );
761}
762
763void BitmapComboBoxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent& event)
764{
765 if (m_combobox)
766 {
767 bool enable = !(m_combobox->GetWindowStyle() & wxCB_SORT);
768
769 event.Enable(enable);
770 }
771}
772
773void BitmapComboBoxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
774{
775 if (m_combobox)
776 {
777 unsigned long n;
778 event.Enable(m_textDelete->GetValue().ToULong(&n) &&
779 (n < (unsigned)m_combobox->GetCount()));
780 }
781}
782
9654efd3 783void BitmapComboBoxWidgetsPage::OnUpdateUIItemManipulator(wxUpdateUIEvent& event)
95a46303
RR
784{
785 if (m_combobox)
786 event.Enable(m_combobox->GetSelection() != wxNOT_FOUND);
787}
788
789void BitmapComboBoxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
790{
791 if (m_combobox)
792 event.Enable(m_combobox->GetCount() != 0);
793}
794
795void BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
796{
797 if (m_combobox)
798 event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
799}
800
801void BitmapComboBoxWidgetsPage::OnUpdateUIAddSeveralWithImages(wxUpdateUIEvent& event)
802{
803 if (m_combobox)
804 event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
805}
806
807void BitmapComboBoxWidgetsPage::OnComboText(wxCommandEvent& event)
808{
809 if (!m_combobox)
810 return;
811
812 wxString s = event.GetString();
813
814 wxASSERT_MSG( s == m_combobox->GetValue(),
815 _T("event and combobox values should be the same") );
816
817 if (event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER)
818 wxLogMessage(_T("BitmapCombobox enter pressed (now '%s')"), s.c_str());
819 else
820 wxLogMessage(_T("BitmapCombobox text changed (now '%s')"), s.c_str());
821}
822
823void BitmapComboBoxWidgetsPage::OnComboBox(wxCommandEvent& event)
824{
825 long sel = event.GetInt();
826 m_textDelete->SetValue(wxString::Format(_T("%ld"), sel));
827
828 wxLogMessage(_T("BitmapCombobox item %ld selected"), sel);
829
830 wxLogMessage(_T("BitmapCombobox GetValue(): %s"), m_combobox->GetValue().c_str() );
831}
832
833void BitmapComboBoxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
834{
835 CreateCombo();
836}
837
838#if wxUSE_IMAGE
839wxBitmap BitmapComboBoxWidgetsPage::LoadBitmap(const wxString& filepath)
840{
841 // Get size of existing images in list
842 wxSize foundSize = m_combobox->GetBitmapSize();
843
008a2655
WS
844 // Have some reasonable maximum size
845 if ( foundSize.x <= 0 )
846 {
dc5a8485
WS
847 foundSize.x = IMG_SIZE_TRUNC;
848 foundSize.y = IMG_SIZE_TRUNC;
008a2655
WS
849 }
850
95a46303
RR
851 wxImage image(filepath);
852 if ( image.Ok() )
853 {
854 // Rescale very large images
855 int ow = image.GetWidth();
856 int oh = image.GetHeight();
857
858 if ( foundSize.x > 0 &&
859 (ow != foundSize.x || oh != foundSize.y) )
860 {
861 int w = ow;
862 if ( w > foundSize.x )
863 w = foundSize.x;
864 int h = oh;
865 if ( h > foundSize.y )
866 h = foundSize.y;
867
dc5a8485 868 RescaleImage(image, w, h);
95a46303
RR
869 }
870
871 return wxBitmap(image);
872 }
873
874 return wxNullBitmap;
875}
876#else
877wxBitmap BitmapComboBoxWidgetsPage::LoadBitmap(const wxString& WXUNUSED(filepath))
878{
879 return wxNullBitmap;
880}
881#endif
882
883wxBitmap BitmapComboBoxWidgetsPage::QueryBitmap(wxString* pStr)
884{
885 wxString filepath = wxFileSelector(wxT("Choose image file"),
008a2655
WS
886 wxEmptyString,
887 wxEmptyString,
888 wxEmptyString,
95a46303 889 wxT("*.*"),
528e5cf8 890 wxFD_OPEN | wxFD_FILE_MUST_EXIST,
95a46303
RR
891 this);
892
893 wxBitmap bitmap;
894
895 ::wxSetCursor( *wxHOURGLASS_CURSOR );
896
897 if ( filepath.length() )
898 {
899 if ( pStr )
900 {
901 *pStr = wxFileName(filepath).GetName();
902 }
903
904 bitmap = LoadBitmap(filepath);
905 }
906
1bf04545
FM
907 if (bitmap.IsOk())
908 wxLogDebug(wxT("%i, %i"),bitmap.GetWidth(), bitmap.GetHeight());
dc5a8485 909
95a46303
RR
910 ::wxSetCursor( *wxSTANDARD_CURSOR );
911
912 return bitmap;
913}
914
915wxBitmap BitmapComboBoxWidgetsPage::CreateBitmap(const wxColour& colour)
916{
b133e7e2
VZ
917 const int w = 10,
918 h = 10;
95a46303
RR
919
920 wxMemoryDC dc;
b133e7e2 921 wxBitmap bmp(w, h);
95a46303
RR
922 dc.SelectObject(bmp);
923
924 // Draw transparent background
b133e7e2 925 wxColour magic(255, 0, 255);
95a46303
RR
926 wxBrush magicBrush(magic);
927 dc.SetBrush(magicBrush);
928 dc.SetPen(*wxTRANSPARENT_PEN);
b133e7e2 929 dc.DrawRectangle(0, 0, w, h);
95a46303
RR
930
931 // Draw image content
932 dc.SetBrush(wxBrush(colour));
b133e7e2 933 dc.DrawCircle(h/2, h/2+1, h/2);
95a46303
RR
934
935 dc.SelectObject(wxNullBitmap);
936
937 // Finalize transparency with a mask
938 wxMask *mask = new wxMask(bmp, magic);
939 bmp.SetMask(mask);
940
941 return bmp;
942}
943
c8d380be 944#endif // wxUSE_BITMAPCOMBOBOX