X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c905c0d60f4bd407cc4cbfd809d5cf8a51a61523..b702a83386524814eefced93e26e4551e857e41b:/src/generic/bmpcboxg.cpp diff --git a/src/generic/bmpcboxg.cpp b/src/generic/bmpcboxg.cpp index 6aec2b629e..bf88843844 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,19 +121,11 @@ 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(); @@ -162,100 +137,42 @@ 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::Insert(const wxString& item, const wxBitmap& bitmap, - unsigned int pos, void *clientData) +int wxBitmapComboBox::DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, wxClientDataType type) { - int n = DoInsertWithImage(item, bitmap, pos); - if ( n != wxNOT_FOUND ) - SetClientData(n, clientData); + const unsigned int numItems = items.GetCount(); + const unsigned int countNew = GetCount() + numItems; - return n; -} - -int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap, - unsigned int pos, wxClientData *clientData) -{ - int n = DoInsertWithImage(item, bitmap, pos); - if ( n != wxNOT_FOUND ) - SetClientObject(n, clientData); + wxASSERT( numItems == 1 || !HasFlag(wxCB_SORT) ); // Sanity check - return n; -} + m_bitmaps.Alloc(countNew); -bool wxBitmapComboBox::OnAddBitmap(const wxBitmap& bitmap) -{ - if ( bitmap.Ok() ) + for ( unsigned int i = 0; i < numItems; i++ ) { - 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")); + m_bitmaps.Insert(new wxBitmap(wxNullBitmap), pos + i); } - return true; -} - -bool wxBitmapComboBox::DoInsertBitmap(const wxBitmap& bitmap, unsigned int pos) -{ - if ( !OnAddBitmap(bitmap) ) - return false; - - // NB: We must try to set the image before DoInsert or - // DoAppend because OnMeasureItem might be called - // before it returns. - m_bitmaps.Insert( new wxBitmap(bitmap), pos); + const int index = wxOwnerDrawnComboBox::DoInsertItems(items, pos, + clientData, type); - return true; -} - -int wxBitmapComboBox::DoAppendWithImage(const wxString& item, const wxBitmap& image) -{ - unsigned int pos = m_bitmaps.size(); - - if ( !DoInsertBitmap(image, pos) ) - return wxNOT_FOUND; - - int index = wxOwnerDrawnComboBox::DoAppend(item); - - if ( index < 0 ) - index = m_bitmaps.size(); - - // Need to re-check the index incase DoAppend sorted - if ( (unsigned int) index != pos ) + if ( index == wxNOT_FOUND ) + { + for ( int i = numItems-1; i >= 0; i-- ) + BCBDoDeleteOneItem(pos + i); + } + else if ( ((unsigned int)index) != pos ) { - wxBitmap* bmp = GetBitmapPtr(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); } @@ -263,74 +180,76 @@ int wxBitmapComboBox::DoAppendWithImage(const wxString& item, const wxBitmap& im return index; } -int wxBitmapComboBox::DoInsertWithImage(const wxString& item, - const wxBitmap& image, - unsigned int pos) +int wxBitmapComboBox::Append(const wxString& item, const wxBitmap& bitmap) { - wxCHECK_MSG( IsValidInsert(pos), wxNOT_FOUND, wxT("invalid item index") ); - - if ( !DoInsertBitmap(image, pos) ) - return wxNOT_FOUND; - - return wxOwnerDrawnComboBox::DoInsert(item, pos); + const int n = wxOwnerDrawnComboBox::Append(item); + if(n != wxNOT_FOUND) + SetItemBitmap(n, bitmap); + return n; } -int wxBitmapComboBox::DoAppend(const wxString& item) +int wxBitmapComboBox::Append(const wxString& item, const wxBitmap& bitmap, + void *clientData) { - return DoAppendWithImage(item, wxNullBitmap); + const int n = wxOwnerDrawnComboBox::Append(item, clientData); + if(n != wxNOT_FOUND) + SetItemBitmap(n, bitmap); + return n; } -int wxBitmapComboBox::DoInsert(const wxString& item, unsigned int pos) +int wxBitmapComboBox::Append(const wxString& item, const wxBitmap& bitmap, + wxClientData *clientData) { - return DoInsertWithImage(item, wxNullBitmap, pos); + const int n = wxOwnerDrawnComboBox::Append(item, clientData); + if(n != wxNOT_FOUND) + SetItemBitmap(n, bitmap); + return n; } -void wxBitmapComboBox::Clear() +int wxBitmapComboBox::Insert(const wxString& item, + const wxBitmap& bitmap, + unsigned int pos) { - wxOwnerDrawnComboBox::Clear(); - - 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 @@ -348,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; } @@ -365,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; } @@ -387,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, @@ -418,7 +320,6 @@ void wxBitmapComboBox::OnDrawItem(wxDC& dc, { wxString text; int imgAreaWidth = m_imgAreaWidth; - bool drawText; if ( imgAreaWidth == 0 ) { @@ -429,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