]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/bmpcboxg.cpp
Fixed a rare wxAuiFloatingFrame dtor crash on MSW using a registration mechanism...
[wxWidgets.git] / src / generic / bmpcboxg.cpp
index 3432680bd667e0013fb64884b320dca686c9777d..a9b1eb0a3ec0212c8c27ee7ccaa14c7428ad2dd9 100644 (file)
@@ -146,6 +146,9 @@ bool wxBitmapComboBox::Create(wxWindow *parent,
 void wxBitmapComboBox::PostCreate()
 {
     m_fontHeight = GetCharHeight() + EXTRA_FONT_HEIGHT;
 void wxBitmapComboBox::PostCreate()
 {
     m_fontHeight = GetCharHeight() + EXTRA_FONT_HEIGHT;
+
+    while ( m_bitmaps.GetCount() < GetCount() )
+        m_bitmaps.Add( new wxBitmap() );
 }
 
 wxBitmapComboBox::~wxBitmapComboBox()
 }
 
 wxBitmapComboBox::~wxBitmapComboBox()
@@ -159,7 +162,7 @@ wxBitmapComboBox::~wxBitmapComboBox()
 
 void wxBitmapComboBox::SetItemBitmap(unsigned int n, const wxBitmap& bitmap)
 {
 
 void wxBitmapComboBox::SetItemBitmap(unsigned int n, const wxBitmap& bitmap)
 {
-    wxCHECK_RET( n < m_bitmaps.size(), wxT("invalid item index") );
+    wxCHECK_RET( n < GetCount(), wxT("invalid item index") );
     OnAddBitmap(bitmap);
     *GetBitmapPtr(n) = bitmap;
 
     OnAddBitmap(bitmap);
     *GetBitmapPtr(n) = bitmap;
 
@@ -169,27 +172,90 @@ void wxBitmapComboBox::SetItemBitmap(unsigned int n, const wxBitmap& bitmap)
 
 wxBitmap wxBitmapComboBox::GetItemBitmap(unsigned int n) const
 {
 
 wxBitmap wxBitmapComboBox::GetItemBitmap(unsigned int n) const
 {
-    wxCHECK_MSG( n < m_bitmaps.size(), wxNullBitmap, wxT("invalid item index") );
+    wxCHECK_MSG( n < GetCount(), wxNullBitmap, wxT("invalid item index") );
     return *GetBitmapPtr(n);
 }
 
     return *GetBitmapPtr(n);
 }
 
+int wxBitmapComboBox::DoInsertItems(const wxArrayStringsAdapter & items,
+                                    unsigned int pos,
+                                    void **clientData, wxClientDataType type)
+{
+    const unsigned int numItems = items.GetCount();
+    const unsigned int countNew = GetCount() + numItems;
+
+    m_bitmaps.Alloc(countNew);
+
+    for ( unsigned int i = 0; i < numItems; ++i )
+    {
+        m_bitmaps.Insert(new wxBitmap(wxNullBitmap), pos + i);
+    }
+
+    const int index = wxOwnerDrawnComboBox::DoInsertItems(items, pos,
+                                                          clientData, type);
+
+    if ( index == wxNOT_FOUND )
+    {
+        for ( int i = countNew - GetCount(); i > 0; --i )
+        {
+            wxBitmap *bmp = GetBitmapPtr(pos);
+            m_bitmaps.RemoveAt(pos);
+            delete bmp;
+        }
+    }
+    return index;
+}
+
+int wxBitmapComboBox::Append(const wxString& item, const wxBitmap& bitmap)
+{
+    const int n = wxOwnerDrawnComboBox::Append(item);
+    if(n != wxNOT_FOUND)
+        SetItemBitmap(n, bitmap);
+    return n;
+}
+
+int wxBitmapComboBox::Append(const wxString& item, const wxBitmap& bitmap,
+                             void *clientData)
+{
+    const int n = wxOwnerDrawnComboBox::Append(item, clientData);
+    if(n != wxNOT_FOUND)
+        SetItemBitmap(n, bitmap);
+    return n;
+}
+
+int wxBitmapComboBox::Append(const wxString& item, const wxBitmap& bitmap,
+                             wxClientData *clientData)
+{
+    const int n = wxOwnerDrawnComboBox::Append(item, clientData);
+    if(n != wxNOT_FOUND)
+        SetItemBitmap(n, bitmap);
+    return n;
+}
+
+int wxBitmapComboBox::Insert(const wxString& item,
+                             const wxBitmap& bitmap,
+                             unsigned int pos)
+{
+    const int n = wxOwnerDrawnComboBox::Insert(item, pos);
+    if(n != wxNOT_FOUND)
+        SetItemBitmap(n, bitmap);
+    return n;
+}
+
 int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap,
                              unsigned int pos, void *clientData)
 {
 int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap,
                              unsigned int pos, void *clientData)
 {
-    int n = DoInsertWithImage(item, bitmap, pos);
-    if ( n != wxNOT_FOUND )
-        SetClientData(n, clientData);
-
+    const int n = wxOwnerDrawnComboBox::Insert(item, pos, clientData);
+    if(n != wxNOT_FOUND)
+        SetItemBitmap(n, bitmap);
     return n;
 }
 
 int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap,
                              unsigned int pos, wxClientData *clientData)
 {
     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);
-
+    const int n = wxOwnerDrawnComboBox::Insert(item, pos, clientData);
+    if(n != wxNOT_FOUND)
+        SetItemBitmap(n, bitmap);
     return n;
 }
 
     return n;
 }
 
@@ -224,67 +290,9 @@ bool wxBitmapComboBox::OnAddBitmap(const wxBitmap& bitmap)
     return true;
 }
 
     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);
-
-    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 )
-    {
-        wxBitmap* bmp = GetBitmapPtr(pos);
-        m_bitmaps.RemoveAt(pos);
-        m_bitmaps.Insert(bmp, index);
-    }
-
-    return index;
-}
-
-int wxBitmapComboBox::DoInsertWithImage(const wxString& item,
-                                        const wxBitmap& image,
-                                        unsigned int pos)
-{
-    wxCHECK_MSG( IsValidInsert(pos), wxNOT_FOUND, wxT("invalid item index") );
-
-    if ( !DoInsertBitmap(image, pos) )
-        return wxNOT_FOUND;
-
-    return wxOwnerDrawnComboBox::DoInsert(item, pos);
-}
-
-int wxBitmapComboBox::DoAppend(const wxString& item)
-{
-    return DoAppendWithImage(item, wxNullBitmap);
-}
-
-int wxBitmapComboBox::DoInsert(const wxString& item, unsigned int pos)
-{
-    return DoInsertWithImage(item, wxNullBitmap, pos);
-}
-
-void wxBitmapComboBox::Clear()
+void wxBitmapComboBox::DoClear()
 {
 {
-    wxOwnerDrawnComboBox::Clear();
+    wxOwnerDrawnComboBox::DoClear();
 
     unsigned int i;
 
 
     unsigned int i;
 
@@ -299,9 +307,9 @@ void wxBitmapComboBox::Clear()
     DetermineIndent();
 }
 
     DetermineIndent();
 }
 
-void wxBitmapComboBox::Delete(unsigned int n)
+void wxBitmapComboBox::DoDeleteOneItem(unsigned int n)
 {
 {
-    wxOwnerDrawnComboBox::Delete(n);
+    wxOwnerDrawnComboBox::DoDeleteOneItem(n);
     delete GetBitmapPtr(n);
     m_bitmaps.RemoveAt(n);
 }
     delete GetBitmapPtr(n);
     m_bitmaps.RemoveAt(n);
 }
@@ -377,7 +385,8 @@ void wxBitmapComboBox::OnDrawBackground(wxDC& dc,
 {
     if ( GetCustomPaintWidth() == 0 ||
          !(flags & wxODCB_PAINTING_SELECTED) ||
 {
     if ( GetCustomPaintWidth() == 0 ||
          !(flags & wxODCB_PAINTING_SELECTED) ||
-         item < 0 )
+         item < 0 ||
+         ( (flags & wxODCB_PAINTING_CONTROL) && (GetInternalFlags() & wxCC_FULL_BUTTON)) )
     {
         wxOwnerDrawnComboBox::OnDrawBackground(dc, rect, item, flags);
         return;
     {
         wxOwnerDrawnComboBox::OnDrawBackground(dc, rect, item, flags);
         return;