]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/bmpcbox.cpp
Test using wxString::ToCDouble() in wxAny.
[wxWidgets.git] / src / msw / bmpcbox.cpp
index 03383eeb6ca03f22852bdcb726ff1b0df1dc8629..e81db2d2ddd871d9708d1096cbf924d92de1205f 100644 (file)
@@ -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<wxClientData*> objectClientData;
+    wxVector<void*> 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<wxBitmap*>(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 )