]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/choice.cpp
add support for custom controls in file dialog in wxGTK and generic versions; also...
[wxWidgets.git] / src / gtk / choice.cpp
index fbe064f3e0d249d37b02cef7c4eb4391d9014d45..af2b1092fdbcdd91a5331ab62d2c7ac6f8892af4 100644 (file)
@@ -62,7 +62,7 @@ static void gtk_choice_clicked_callback( GtkWidget *WXUNUSED(widget), wxChoice *
     else if ( choice->HasClientUntypedData() )
         event.SetClientData( choice->GetClientData(n) );
 
-    choice->GetEventHandler()->ProcessEvent(event);
+    choice->HandleWindowEvent(event);
 }
 }
 
@@ -110,8 +110,8 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
         m_strings = new wxSortedArrayString;
     }
 
-    // begin with no selection
-    m_selection_hack = wxNOT_FOUND;
+    // If we have items, GTK will choose the first item by default
+    m_selection_hack = n > 0 ? 0 : wxNOT_FOUND;
 
     GtkWidget *menu = gtk_menu_new();
 
@@ -163,6 +163,12 @@ int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items,
         m_selection_hack += count;
     }
 
+    // We must set the selection so that it can be read back even if 
+    // the user has not modified it since GTK+ will then select the
+    // first item so well return 0.
+    if ((count > 0) && (m_selection_hack==wxNOT_FOUND))
+        m_selection_hack = 0;
+
     return pos - 1;
 }
 
@@ -216,8 +222,8 @@ void wxChoice::DoDeleteOneItem(unsigned int n)
 
     wxArrayString items;
     wxArrayPtrVoid itemsData;
-    items.Alloc(count);
-    itemsData.Alloc(count);
+    items.Alloc(count - 1);
+    itemsData.Alloc(count - 1);
     for ( unsigned i = 0; i < count; i++ )
     {
         if ( i != n )
@@ -229,11 +235,15 @@ void wxChoice::DoDeleteOneItem(unsigned int n)
 
     wxChoice::DoClear();
 
-    void ** const data = &itemsData[0];
-    if ( HasClientObjectData() )
-        Append(items, wx_reinterpret_cast(wxClientData **, data));
-    else
-        Append(items, data);
+    if ( count > 1 )
+    {
+        void ** const data = &itemsData[0];
+        if ( HasClientObjectData() )
+            Append(items, wx_reinterpret_cast(wxClientData **, data));
+        else
+            Append(items, data);
+    }
+    //else: the control is now empty, nothing to append
 }
 
 int wxChoice::FindString( const wxString &string, bool bCase ) const