#include "wx/sizer.h"
#include "wx/icon.h"
#include "wx/dir.h"
+#include "wx/msgdlg.h"
#include "wx/filename.h"
#include "wx/image.h"
#include "wx/imaglist.h"
#include "wx/bmpcbox.h"
-
+#include "itemcontainer.h"
#include "widgets.h"
#include "icons/bmpcombobox.xpm"
// Images loaded from file are reduced this width and height, if larger
-#define IMG_SIZE_TRUNC 150
+#define IMG_SIZE_TRUNC 256
// ----------------------------------------------------------------------------
BitmapComboBoxPage_Delete,
BitmapComboBoxPage_DeleteText,
BitmapComboBoxPage_DeleteSel,
- BitmapComboBoxPage_Combo
+ BitmapComboBoxPage_Combo,
+ BitmapComboBoxPage_ContainerTests
};
// 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
// helpers for creating bitmaps
wxBitmap CreateBitmap(const wxColour& colour);
- wxBitmap CreateRandomBitmap(wxString* pStr);
wxBitmap LoadBitmap(const wxString& filepath);
wxBitmap QueryBitmap(wxString* pStr);
wxWindowID id,
wxTextCtrl **ppText);
+#if wxUSE_IMAGE
+ void RescaleImage(wxImage& image, int w, int h);
+#endif
+
// the controls
// ------------
// the checkboxes for styles
wxCheckBox *m_chkSort,
- *m_chkReadonly,
- *m_chkScaleimages;
+ *m_chkReadonly;
// the combobox itself and the sizer it is in
wxBitmapComboBox *m_combobox;
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)
BitmapComboBoxWidgetsPage::BitmapComboBoxWidgetsPage(WidgetsBookCtrl *book,
wxImageList *imaglist)
- : WidgetsPage(book, imaglist, bmpcombobox_xpm)
+ : ItemContainerWidgetsPage(book, imaglist, bmpcombobox_xpm)
{
// init everything
m_chkSort =
- m_chkReadonly =
- m_chkScaleimages = (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
miscellaneous combobox operations and the pane containing the combobox
itself to the right
*/
- //wxTextCtrl *text;
wxSizer *sizerRow;
wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
wxSizer *sizerOptions = new wxStaticBoxSizer(box, wxVERTICAL);
- m_chkScaleimages = CreateCheckBoxAndAddToSizer(sizerOptions, _T("&Scale loaded images to fit"));
-
sizerRow = CreateSizerWithSmallTextAndLabel(_T("Control &height:"),
BitmapComboBoxPage_ChangeHeight,
&m_textChangeHeight);
_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);
Reset();
SetSizer(sizerTop);
-
- sizerTop->Fit(this);
}
// ----------------------------------------------------------------------------
{
m_chkSort->SetValue(false);
m_chkReadonly->SetValue(true);
- m_chkScaleimages->SetValue(true);
}
void BitmapComboBoxWidgetsPage::CreateCombo()
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);
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)));
}
}
+#if wxUSE_IMAGE
+void BitmapComboBoxWidgetsPage::RescaleImage(wxImage& image, int w, int h)
+{
+ if ( image.GetWidth() == w && image.GetHeight() == h )
+ return;
+
+ if ( w <= 0 || h <= 0 )
+ return;
+
+ static bool isFirstScale = true;
+
+ if ( isFirstScale && m_combobox->GetCount() > 0 )
+ {
+ wxMessageBox( wxT("wxBitmapComboBox normally only supports images of one size. ")
+ wxT("However, for demonstration purposes, loaded bitmaps are scaled to fit ")
+ wxT("using wxImage::Rescale."),
+ wxT("Notice"),
+ wxOK,
+ this );
+
+ isFirstScale = false;
+ }
+
+ image.Rescale(w, h);
+}
+#endif
+
void BitmapComboBoxWidgetsPage::LoadWidgetImages( wxArrayString* strings, wxImageList* images )
{
wxFileName fn;
wxASSERT(fn.FileExists());
wxImage image(fn.GetFullPath());
wxASSERT(image.Ok());
- if ( m_chkScaleimages->GetValue() && foundSize.x > 0 )
- image.Rescale(foundSize.x, foundSize.y);
+ RescaleImage(image, foundSize.x, foundSize.y);
wxBitmap bmp(image);
wxASSERT( bmp.Ok() );
#else
// Have some reasonable maximum size
if ( foundSize.x <= 0 )
{
- foundSize.x = 256;
- foundSize.y = 256;
+ foundSize.x = IMG_SIZE_TRUNC;
+ foundSize.y = IMG_SIZE_TRUNC;
}
wxImage image(filepath);
if ( h > foundSize.y )
h = foundSize.y;
- image.Rescale(w, h);
+ RescaleImage(image, w, h);
}
return wxBitmap(image);
bitmap = LoadBitmap(filepath);
}
+ wxLogDebug(wxT("%i, %i"),bitmap.GetWidth(), bitmap.GetHeight());
+
::wxSetCursor( *wxSTANDARD_CURSOR );
return bitmap;
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);
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