]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix assert when adding items with bitmaps wxBitmapComboBox.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 29 Apr 2013 23:13:24 +0000 (23:13 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 29 Apr 2013 23:13:24 +0000 (23:13 +0000)
The change of r73567 resulted in an assert when adding items with bitmaps to
wxBitmapComboBox without object client data. Fix the code added by this commit
to work for all kinds of client data, including wxClientData_None.

See #14892.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73880 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/bmpcbox.cpp

index ea7c92576212856b755726712ed204b603eafcab..bdd42ed970804faf1e8323adea01b1feb9e217d4 100644 (file)
@@ -133,13 +133,30 @@ void wxBitmapComboBox::RecreateControl()
     wxPoint pos = GetPosition();
     wxSize size = GetSize();
     size.y = GetBestSize().y;
-    wxArrayString strings = GetStrings();
-
-    // Save the client data pointers before clearing the control.
-    wxVector<wxClientData*> clientData;
-    clientData.reserve(strings.size());
-    for ( size_t n = 0; n < strings.size(); ++n )
-        clientData.push_back(GetClientObject(n));
+    const wxArrayString strings = GetStrings();
+    const unsigned numItems = strings.size();
+
+    // 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 ( unsigned n = 0; n < numItems; ++n )
+                objectClientData.push_back(GetClientObject(n));
+            break;
+
+        case wxClientData_Void:
+            voidClientData.reserve(numItems);
+            for ( unsigned n = 0; n < numItems; ++n )
+                voidClientData.push_back(GetClientData(n));
+            break;
+    }
 
     wxComboBox::DoClear();
 
@@ -151,9 +168,14 @@ void wxBitmapComboBox::RecreateControl()
         return;
 
     // initialize the controls contents
-    for ( unsigned int i = 0; i < strings.size(); i++ )
+    for ( unsigned int i = 0; i < numItems; i++ )
     {
-        wxComboBox::Append(strings[i], clientData[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