X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a236aa2058ccf3d36e9cafc20fa7375080c4be50..7d6a4d96961eac84d05db8bb24c64d39003f6e54:/src/generic/bmpcboxg.cpp?ds=sidebyside diff --git a/src/generic/bmpcboxg.cpp b/src/generic/bmpcboxg.cpp index a9b1eb0a3e..029d8a5463 100644 --- a/src/generic/bmpcboxg.cpp +++ b/src/generic/bmpcboxg.cpp @@ -42,23 +42,8 @@ #endif -const wxChar wxBitmapComboBoxNameStr[] = wxT("bitmapComboBox"); - - -// These macros allow wxArrayPtrVoid to be used in more convenient manner -#define GetBitmapPtr(n) ((wxBitmap*)m_bitmaps[n]) - - -#define IMAGE_SPACING_RIGHT 4 // Space left of image - -#define IMAGE_SPACING_LEFT 4 // Space right of image, left of text - -#define IMAGE_SPACING_VERTICAL 2 // Space top and bottom of image - #define IMAGE_SPACING_CTRL_VERTICAL 7 // Spacing used in control size calculation -#define EXTRA_FONT_HEIGHT 0 // Add to increase min. height of list items - // ============================================================================ // implementation @@ -74,8 +59,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmapComboBox, wxOwnerDrawnComboBox) void wxBitmapComboBox::Init() { - m_fontHeight = 0; - m_imgAreaWidth = 0; m_inResize = false; } @@ -114,7 +97,7 @@ bool wxBitmapComboBox::Create(wxWindow *parent, return false; } - PostCreate(); + UpdateInternals(); return true; } @@ -138,22 +121,14 @@ bool wxBitmapComboBox::Create(wxWindow *parent, return false; } - PostCreate(); + UpdateInternals(); return true; } -void wxBitmapComboBox::PostCreate() -{ - m_fontHeight = GetCharHeight() + EXTRA_FONT_HEIGHT; - - while ( m_bitmaps.GetCount() < GetCount() ) - m_bitmaps.Add( new wxBitmap() ); -} - wxBitmapComboBox::~wxBitmapComboBox() { - Clear(); + DoClear(); } // ---------------------------------------------------------------------------- @@ -162,20 +137,13 @@ wxBitmapComboBox::~wxBitmapComboBox() void wxBitmapComboBox::SetItemBitmap(unsigned int n, const wxBitmap& bitmap) { - wxCHECK_RET( n < GetCount(), wxT("invalid item index") ); OnAddBitmap(bitmap); - *GetBitmapPtr(n) = bitmap; + DoSetItemBitmap(n, bitmap); if ( (int)n == GetSelection() ) Refresh(); } -wxBitmap wxBitmapComboBox::GetItemBitmap(unsigned int n) const -{ - wxCHECK_MSG( n < GetCount(), wxNullBitmap, wxT("invalid item index") ); - return *GetBitmapPtr(n); -} - int wxBitmapComboBox::DoInsertItems(const wxArrayStringsAdapter & items, unsigned int pos, void **clientData, wxClientDataType type) @@ -183,9 +151,11 @@ int wxBitmapComboBox::DoInsertItems(const wxArrayStringsAdapter & items, const unsigned int numItems = items.GetCount(); const unsigned int countNew = GetCount() + numItems; + wxASSERT( numItems == 1 || !HasFlag(wxCB_SORT) ); // Sanity check + m_bitmaps.Alloc(countNew); - for ( unsigned int i = 0; i < numItems; ++i ) + for ( unsigned int i = 0; i < numItems; i++ ) { m_bitmaps.Insert(new wxBitmap(wxNullBitmap), pos + i); } @@ -195,13 +165,18 @@ int wxBitmapComboBox::DoInsertItems(const wxArrayStringsAdapter & items, if ( index == wxNOT_FOUND ) { - for ( int i = countNew - GetCount(); i > 0; --i ) - { - wxBitmap *bmp = GetBitmapPtr(pos); - m_bitmaps.RemoveAt(pos); - delete bmp; - } + for ( int i = numItems-1; i >= 0; i-- ) + BCBDoDeleteOneItem(pos + i); } + else if ( ((unsigned int)index) != pos ) + { + // Move pre-inserted empty bitmap into correct position + // (usually happens when combo box has wxCB_SORT style) + wxBitmap* bmp = static_cast(m_bitmaps[pos]); + m_bitmaps.RemoveAt(pos); + m_bitmaps.Insert(bmp, index); + } + return index; } @@ -259,83 +234,22 @@ int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap, return n; } -bool wxBitmapComboBox::OnAddBitmap(const wxBitmap& bitmap) -{ - if ( bitmap.Ok() ) - { - int width = bitmap.GetWidth(); - int height = bitmap.GetHeight(); - - if ( m_usedImgSize.x <= 0 ) - { - // - // If size not yet determined, get it from this image. - m_usedImgSize.x = width; - m_usedImgSize.y = height; - - InvalidateBestSize(); - wxSize newSz = GetBestSize(); - wxSize sz = GetSize(); - if ( newSz.y > sz.y ) - SetSize(sz.x, newSz.y); - else - DetermineIndent(); - } - - wxCHECK_MSG(width == m_usedImgSize.x && height == m_usedImgSize.y, - false, - wxT("you can only add images of same size")); - } - - return true; -} - void wxBitmapComboBox::DoClear() { wxOwnerDrawnComboBox::DoClear(); - - unsigned int i; - - for ( i=0; i 0 ) - { - indent = m_usedImgSize.x + IMAGE_SPACING_LEFT + IMAGE_SPACING_RIGHT; - m_imgAreaWidth = indent; - - indent -= 3; - } - - SetCustomPaintWidth(indent); -} - void wxBitmapComboBox::OnSize(wxSizeEvent& event) { // Prevent infinite looping @@ -353,13 +267,17 @@ wxSize wxBitmapComboBox::DoGetBestSize() const { wxSize sz = wxOwnerDrawnComboBox::DoGetBestSize(); - // Scale control to match height of highest image. - int h2 = m_usedImgSize.y + IMAGE_SPACING_CTRL_VERTICAL; + if ( HasFlag(wxCB_READONLY) ) + { + // Scale control to match height of highest image. + int h2 = m_usedImgSize.y + IMAGE_SPACING_CTRL_VERTICAL; + + if ( h2 > sz.y ) + sz.y = h2; - if ( h2 > sz.y ) - sz.y = h2; + CacheBestSize(sz); + } - CacheBestSize(sz); return sz; } @@ -370,7 +288,7 @@ wxSize wxBitmapComboBox::DoGetBestSize() const bool wxBitmapComboBox::SetFont(const wxFont& font) { bool res = wxOwnerDrawnComboBox::SetFont(font); - m_fontHeight = GetCharHeight() + EXTRA_FONT_HEIGHT; + UpdateInternals(); return res; } @@ -392,28 +310,7 @@ void wxBitmapComboBox::OnDrawBackground(wxDC& dc, return; } - // - // Just paint simple selection background under where is text - // (ie. emulate what MSW image choice does). - // - - int xPos = 0; // Starting x of selection rectangle - const int vSizeDec = 1; // Vertical size reduction of selection rectangle edges - - xPos = GetCustomPaintWidth() + 2; - - wxCoord x, y; - GetTextExtent(GetString(item), &x, &y, 0, 0); - - dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); - - wxColour selCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); - dc.SetPen(selCol); - dc.SetBrush(selCol); - dc.DrawRectangle(rect.x+xPos, - rect.y+vSizeDec, - x + 4, - rect.height-(vSizeDec*2)); + wxBitmapComboBoxBase::DrawBackground(dc, rect, item, flags); } void wxBitmapComboBox::OnDrawItem(wxDC& dc, @@ -423,7 +320,6 @@ void wxBitmapComboBox::OnDrawItem(wxDC& dc, { wxString text; int imgAreaWidth = m_imgAreaWidth; - bool drawText; if ( imgAreaWidth == 0 ) { @@ -434,40 +330,20 @@ void wxBitmapComboBox::OnDrawItem(wxDC& dc, if ( flags & wxODCB_PAINTING_CONTROL ) { text = GetValue(); - if ( HasFlag(wxCB_READONLY) ) - drawText = true; - else - drawText = false; + if ( !HasFlag(wxCB_READONLY) ) + text.clear(); } else { text = GetString(item); - drawText = true; - } - - const wxBitmap& bmp = *GetBitmapPtr(item); - if ( bmp.Ok() ) - { - wxCoord w = bmp.GetWidth(); - wxCoord h = bmp.GetHeight(); - - // Draw the image centered - dc.DrawBitmap(bmp, - rect.x + (m_usedImgSize.x-w)/2 + IMAGE_SPACING_LEFT, - rect.y + (rect.height-h)/2, - true); } - if ( drawText ) - dc.DrawText(GetString(item), - rect.x + imgAreaWidth + 1, - rect.y + (rect.height-dc.GetCharHeight())/2); + wxBitmapComboBoxBase::DrawItem(dc, rect, item, text, flags); } -wxCoord wxBitmapComboBox::OnMeasureItem(size_t WXUNUSED(item)) const +wxCoord wxBitmapComboBox::OnMeasureItem(size_t item) const { - int imgHeightArea = m_usedImgSize.y + 2; - return imgHeightArea > m_fontHeight ? imgHeightArea : m_fontHeight; + return wxBitmapComboBoxBase::MeasureItem(item); } wxCoord wxBitmapComboBox::OnMeasureItemWidth(size_t item) const