X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f696015cf1e474315b63823d697a5fa0462055b7..43c42c18d36c703a88b1b7b697bac27fe5608eca:/src/msw/bmpcbox.cpp diff --git a/src/msw/bmpcbox.cpp b/src/msw/bmpcbox.cpp index 03383eeb6c..e81db2d2dd 100644 --- a/src/msw/bmpcbox.cpp +++ b/src/msw/bmpcbox.cpp @@ -1,9 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/msw/bmpcboxg.cpp +// Name: src/msw/bmpcbox.cpp // Purpose: wxBitmapComboBox // Author: Jaakko Salli // Created: 2008-04-06 -// RCS-ID: $Id:$ +// RCS-ID: $Id$ // Copyright: (c) 2008 Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,6 +31,7 @@ #endif #include "wx/settings.h" +#include "wx/vector.h" #include "wx/msw/dcclient.h" #include "wx/msw/private.h" @@ -131,7 +132,32 @@ void wxBitmapComboBox::RecreateControl() wxString value = GetValue(); wxPoint pos = GetPosition(); wxSize size = GetSize(); - wxArrayString strings = GetStrings(); + size.y = GetBestSize().y; + const wxArrayString strings = GetStrings(); + const unsigned numItems = strings.size(); + unsigned i; + + // Save the client data pointers before clearing the control, if any. + const wxClientDataType clientDataType = GetClientDataType(); + wxVector objectClientData; + wxVector voidClientData; + switch ( clientDataType ) + { + case wxClientData_None: + break; + + case wxClientData_Object: + objectClientData.reserve(numItems); + for ( i = 0; i < numItems; ++i ) + objectClientData.push_back(GetClientObject(i)); + break; + + case wxClientData_Void: + voidClientData.reserve(numItems); + for ( i = 0; i < numItems; ++i ) + voidClientData.push_back(GetClientData(i)); + break; + } wxComboBox::DoClear(); @@ -139,13 +165,18 @@ void wxBitmapComboBox::RecreateControl() DissociateHandle(); ::DestroyWindow(hwnd); - if ( !MSWCreateControl(wxT("COMBOBOX"), value, pos, size) ) + if ( !MSWCreateControl(wxT("COMBOBOX"), wxEmptyString, pos, size) ) return; // initialize the controls contents - for ( unsigned int i = 0; i < strings.size(); i++ ) + for ( i = 0; i < numItems; i++ ) { wxComboBox::Append(strings[i]); + + if ( !objectClientData.empty() ) + SetClientObject(i, objectClientData[i]); + else if ( !voidClientData.empty() ) + SetClientData(i, objectClientData[i]); } // and make sure it has the same attributes as before @@ -176,6 +207,12 @@ void wxBitmapComboBox::RecreateControl() { SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); } + + ::SendMessage(GetHwnd(), CB_SETITEMHEIGHT, 0, MeasureItem(0)); + + // Revert the old string value + if ( !HasFlag(wxCB_READONLY) ) + ChangeValue(value); } wxBitmapComboBox::~wxBitmapComboBox() @@ -183,6 +220,20 @@ wxBitmapComboBox::~wxBitmapComboBox() Clear(); } +wxSize wxBitmapComboBox::DoGetBestSize() const +{ + wxSize best = wxComboBox::DoGetBestSize(); + wxSize bitmapSize = GetBitmapSize(); + + wxCoord useHeightBitmap = EDIT_HEIGHT_FROM_CHAR_HEIGHT(bitmapSize.y); + if ( best.y < useHeightBitmap ) + { + best.y = useHeightBitmap; + CacheBestSize(best); + } + return best; +} + // ---------------------------------------------------------------------------- // Item manipulation // ---------------------------------------------------------------------------- @@ -236,6 +287,16 @@ int wxBitmapComboBox::Insert(const wxString& item, return n; } +int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, void *clientData) +{ + OnAddBitmap(bitmap); + const int n = wxComboBox::Insert(item, pos, clientData); + if ( n != wxNOT_FOUND ) + DoSetItemBitmap(n, bitmap); + return n; +} + int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap, unsigned int pos, wxClientData *clientData) { @@ -253,6 +314,8 @@ 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++ ) @@ -268,6 +331,14 @@ int wxBitmapComboBox::DoInsertItems(const wxArrayStringsAdapter & items, 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; } @@ -284,7 +355,7 @@ bool wxBitmapComboBox::OnAddBitmap(const wxBitmap& bitmap) return true; } - + return false; } @@ -341,7 +412,7 @@ bool wxBitmapComboBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) if ( pos == -1 ) return FALSE; - int flags = 0; + int flags = 0; if ( lpDrawItem->itemState & ODS_COMBOBOXEDIT ) flags |= wxODCB_PAINTING_CONTROL; if ( lpDrawItem->itemState & ODS_SELECTED )