X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/be16b85933283014930eb4973ab65706f75c94d8..ce468dc28b8a4b8ee651afc7bcebc4232e622049:/samples/widgets/bmpcombobox.cpp diff --git a/samples/widgets/bmpcombobox.cpp b/samples/widgets/bmpcombobox.cpp index 5cd72b3e28..61ef1dac46 100644 --- a/samples/widgets/bmpcombobox.cpp +++ b/samples/widgets/bmpcombobox.cpp @@ -52,6 +52,7 @@ #include "wx/imaglist.h" #include "wx/bmpcbox.h" +#include "itemcontainer.h" #include "widgets.h" #include "icons/bmpcombobox.xpm" @@ -82,20 +83,29 @@ enum BitmapComboBoxPage_Delete, BitmapComboBoxPage_DeleteText, BitmapComboBoxPage_DeleteSel, - BitmapComboBoxPage_Combo + BitmapComboBoxPage_Combo, + BitmapComboBoxPage_ContainerTests }; +// kinds of comboboxes +enum +{ + ComboKind_Default, + ComboKind_Simple, + ComboKind_DropDown +}; // ---------------------------------------------------------------------------- // BitmapComboBoxWidgetsPage // ---------------------------------------------------------------------------- -class BitmapComboBoxWidgetsPage : public WidgetsPage +class BitmapComboBoxWidgetsPage : public ItemContainerWidgetsPage { public: BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist); virtual wxControl *GetWidget() const { return m_combobox; } + virtual wxItemContainer* GetContainer() const { return m_combobox; } virtual void RecreateWidget() { CreateCombo(); } // lazy creation of the content @@ -142,7 +152,6 @@ protected: // helpers for creating bitmaps wxBitmap CreateBitmap(const wxColour& colour); - wxBitmap CreateRandomBitmap(wxString* pStr); wxBitmap LoadBitmap(const wxString& filepath); wxBitmap QueryBitmap(wxString* pStr); @@ -159,6 +168,9 @@ protected: // the controls // ------------ + // the sel mode radiobox + wxRadioBox *m_radioKind; + // the checkboxes for styles wxCheckBox *m_chkSort, *m_chkReadonly; @@ -195,6 +207,7 @@ BEGIN_EVENT_TABLE(BitmapComboBoxWidgetsPage, WidgetsPage) EVT_BUTTON(BitmapComboBoxPage_AddMany, BitmapComboBoxWidgetsPage::OnButtonAddMany) EVT_BUTTON(BitmapComboBoxPage_LoadFromFile, BitmapComboBoxWidgetsPage::OnButtonLoadFromFile) EVT_BUTTON(BitmapComboBoxPage_SetFromFile, BitmapComboBoxWidgetsPage::OnButtonSetFromFile) + EVT_BUTTON(BitmapComboBoxPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer) EVT_TEXT_ENTER(BitmapComboBoxPage_InsertText, BitmapComboBoxWidgetsPage::OnButtonInsert) EVT_TEXT(BitmapComboBoxPage_ChangeHeight, BitmapComboBoxWidgetsPage::OnTextChangeHeight) @@ -224,23 +237,32 @@ END_EVENT_TABLE() // implementation // ============================================================================ - +#if defined(__WXMSW__) || defined(__WXGTK__) + #define NATIVE_OR_GENERIC_CTRLS NATIVE_CTRLS +#else + #define NATIVE_OR_GENERIC_CTRLS GENERIC_CTRLS +#endif IMPLEMENT_WIDGETS_PAGE(BitmapComboBoxWidgetsPage, _T("BitmapCombobox"), - GENERIC_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS + NATIVE_OR_GENERIC_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS ); BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist) - : WidgetsPage(book, imaglist, bmpcombobox_xpm) + : ItemContainerWidgetsPage(book, imaglist, bmpcombobox_xpm) { // init everything m_chkSort = - m_chkReadonly = (wxCheckBox *)NULL; + m_chkReadonly = NULL; + + m_combobox = NULL; + m_sizerCombo = NULL; - m_combobox = (wxBitmapComboBox *)NULL; - m_sizerCombo = (wxSizer *)NULL; + m_textInsert = + m_textChangeHeight = + m_textChange = + m_textDelete = NULL; } // create a sizer containing a label and a small text ctrl @@ -270,7 +292,6 @@ void BitmapComboBoxWidgetsPage::CreateContent() miscellaneous combobox operations and the pane containing the combobox itself to the right */ - //wxTextCtrl *text; wxSizer *sizerRow; wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); @@ -280,6 +301,20 @@ void BitmapComboBoxWidgetsPage::CreateContent() // left pane - style box wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style")); + + // should be in sync with ComboKind_XXX values + static const wxString kinds[] = + { + _T("default"), + _T("simple"), + _T("drop down"), + }; + + m_radioKind = new wxRadioBox(this, wxID_ANY, _T("Combobox &kind:"), + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(kinds), kinds, + 1, wxRA_SPECIFY_COLS); + wxSizer *sizerStyle = new wxStaticBoxSizer(box, wxVERTICAL); m_chkSort = CreateCheckBoxAndAddToSizer(sizerStyle, _T("&Sort items")); @@ -289,6 +324,7 @@ void BitmapComboBoxWidgetsPage::CreateContent() sizerStyle->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 3); sizerLeft->Add(sizerStyle, 0, wxGROW | wxALIGN_CENTRE_HORIZONTAL); + sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5); // left pane - other options box box = new wxStaticBox(this, wxID_ANY, _T("Demo options")); @@ -308,6 +344,9 @@ void BitmapComboBoxWidgetsPage::CreateContent() _T("&Change wxBitmapComboBox contents")); wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL); + btn = new wxButton(this, BitmapComboBoxPage_ContainerTests, _T("Run &tests")); + sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); + #if wxUSE_IMAGE btn = new wxButton(this, BitmapComboBoxPage_AddWidgetIcons, _T("Add &widget icons")); sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); @@ -391,6 +430,24 @@ void BitmapComboBoxWidgetsPage::CreateCombo() if ( m_chkReadonly->GetValue() ) flags |= wxCB_READONLY; + switch ( m_radioKind->GetSelection() ) + { + default: + wxFAIL_MSG( _T("unknown combo kind") ); + // fall through + + case ComboKind_Default: + break; + + case ComboKind_Simple: + flags |= wxCB_SIMPLE; + break; + + case ComboKind_DropDown: + flags = wxCB_DROPDOWN; + break; + } + wxArrayString items; wxArrayPtrVoid bitmaps; if ( m_combobox ) @@ -507,7 +564,8 @@ void BitmapComboBoxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event)) void BitmapComboBoxWidgetsPage::OnTextChangeHeight(wxCommandEvent& WXUNUSED(event)) { long h = 0; - m_textChangeHeight->GetValue().ToLong(&h); + if ( m_textChangeHeight ) + m_textChangeHeight->GetValue().ToLong(&h); if ( h < 5 ) return; m_combobox->SetSize(wxDefaultCoord, h); @@ -520,12 +578,16 @@ void BitmapComboBoxWidgetsPage::OnButtonLoadFromFile(wxCommandEvent& WXUNUSED(ev if ( sel == wxNOT_FOUND ) sel = m_combobox->GetCount(); - m_combobox->Insert(s, QueryBitmap(&s), sel); + wxBitmap bmp = QueryBitmap(&s); + if (bmp.IsOk()) + m_combobox->Insert(s, bmp, sel); } void BitmapComboBoxWidgetsPage::OnButtonSetFromFile(wxCommandEvent& WXUNUSED(event)) { - m_combobox->SetItemBitmap(m_combobox->GetSelection(), QueryBitmap(NULL)); + wxBitmap bmp = QueryBitmap(NULL); + if (bmp.IsOk()) + m_combobox->SetItemBitmap(m_combobox->GetSelection(), bmp); } void BitmapComboBoxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event)) @@ -546,13 +608,22 @@ void BitmapComboBoxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(even void BitmapComboBoxWidgetsPage::OnButtonAddSeveralWithImages(wxCommandEvent& WXUNUSED(event)) { - int i; + static const struct TestEntry + { + const char *text; + unsigned long rgb; + } s_entries[] = + { + { "Red circle", 0x0000ff }, + { "Blue circle", 0xff0000 }, + { "Green circle", 0x00ff00 }, + { "Black circle", 0x000000 }, + }; - for ( i=0; i<4; i++ ) + for ( unsigned i = 0; i < WXSIZEOF(s_entries); i++ ) { - wxString s; - wxBitmap bmp = CreateRandomBitmap(&s); - m_combobox->Append(s, bmp); + const TestEntry& e = s_entries[i]; + m_combobox->Append(e.text, CreateBitmap(wxColour(e.rgb))); } } @@ -594,6 +665,7 @@ void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString* strings, wxImag if ( !wxDir::Exists(fn.GetFullPath()) || !wxDir::GetAllFiles(fn.GetFullPath(),strings,wxT("*.xpm")) ) { + // Try ../../samples/widgets/icons fn.RemoveLastDir(); fn.RemoveLastDir(); fn.AppendDir(wxT("icons")); @@ -626,7 +698,7 @@ void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString* strings, wxImag for ( i=0; isize(); i++ ) { fn.SetFullName((*strings)[i]); - wxString name =fn.GetName(); + wxString name = fn.GetName(); // Handle few exceptions if ( name == wxT("bmpbtn") ) @@ -648,6 +720,11 @@ void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString* strings, wxImag #endif images->Add(bmp); (*strings)[i] = name; + + // if the combobox is empty, use as bitmap size of the image list + // the size of the first valid image loaded + if (foundSize == wxDefaultSize) + foundSize = bmp.GetSize(); } } @@ -827,7 +904,8 @@ wxBitmap BitmapComboBoxWidgetsPage::QueryBitmap(wxString* pStr) bitmap = LoadBitmap(filepath); } - wxLogDebug(wxT("%i, %i"),bitmap.GetWidth(), bitmap.GetHeight()); + if (bitmap.IsOk()) + wxLogDebug(wxT("%i, %i"),bitmap.GetWidth(), bitmap.GetHeight()); ::wxSetCursor( *wxSTANDARD_CURSOR ); @@ -836,33 +914,23 @@ wxBitmap BitmapComboBoxWidgetsPage::QueryBitmap(wxString* pStr) wxBitmap BitmapComboBoxWidgetsPage::CreateBitmap(const wxColour& colour) { - int ch = m_combobox->GetBitmapSize().y; - int h0 = ch - 5; - - long w = ch; - long h = ch; - - if ( w <= 0 ) - w = h0 - 1; - if ( h <= 0 ) - h = h0; - if ( h > ch ) - h = ch; + const int w = 10, + h = 10; wxMemoryDC dc; - wxBitmap bmp(w,h); + wxBitmap bmp(w, h); dc.SelectObject(bmp); // Draw transparent background - wxColour magic(255,0,255); + wxColour magic(255, 0, 255); wxBrush magicBrush(magic); dc.SetBrush(magicBrush); dc.SetPen(*wxTRANSPARENT_PEN); - dc.DrawRectangle(0,0,bmp.GetWidth(),bmp.GetHeight()); + dc.DrawRectangle(0, 0, w, h); // Draw image content dc.SetBrush(wxBrush(colour)); - dc.DrawCircle(h/2,h/2+1,(h/2)); + dc.DrawCircle(h/2, h/2+1, h/2); dc.SelectObject(wxNullBitmap); @@ -873,47 +941,4 @@ wxBitmap BitmapComboBoxWidgetsPage::CreateBitmap(const wxColour& colour) return bmp; } -wxBitmap BitmapComboBoxWidgetsPage::CreateRandomBitmap( wxString* pStr ) -{ - int i = rand() % 6; - const wxChar* str = wxT(""); - wxBitmap bmp; - - if ( i == 0 ) - { - str = wxT("Red Circle"); - bmp = CreateBitmap( *wxRED ); - } - else if ( i == 1 ) - { - str = wxT("Green Circle"); - bmp = CreateBitmap( *wxGREEN ); - } - else if ( i == 2 ) - { - str = wxT("Blue Circle"); - bmp = CreateBitmap( *wxBLUE ); - } - else if ( i == 3 ) - { - str = wxT("Black Circle"); - bmp = CreateBitmap( *wxBLACK ); - } - else if ( i == 4 ) - { - str = wxT("Cyan Circle"); - bmp = CreateBitmap( *wxCYAN ); - } - else if ( i == 5 ) - { - str = wxT("Light Grey Circle"); - bmp = CreateBitmap( *wxLIGHT_GREY ); - } - - if ( pStr ) - *pStr = str; - - return bmp; -} - -#endif //wxUSE_BITMAPCOMBOBOX +#endif // wxUSE_BITMAPCOMBOBOX