+ // set the local selection variable manually
+ if ((n >= 0) && ((unsigned int)n < GetCount()))
+ {
+ // a valid selection has been made
+ m_selection_hack = n;
+ }
+ else if ((n == wxNOT_FOUND) || (GetCount() == 0))
+ {
+ // invalidates the selection if there are no items
+ // or if it is specifically set to wxNOT_FOUND
+ m_selection_hack = wxNOT_FOUND;
+ }
+ else
+ {
+ // this selects the first item by default if the selection is out of bounds
+ m_selection_hack = 0;
+ }
+}
+
+void wxChoice::DoApplyWidgetStyle(GtkRcStyle *style)
+{
+ GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) );
+
+ gtk_widget_modify_style( m_widget, style );
+ gtk_widget_modify_style( GTK_WIDGET( menu_shell ), style );
+
+ GList *child = menu_shell->children;
+ while (child)
+ {
+ gtk_widget_modify_style( GTK_WIDGET( child->data ), style );
+
+ GtkBin *bin = GTK_BIN( child->data );
+ GtkWidget *label = (GtkWidget *) NULL;
+ if (bin->child)
+ label = bin->child;
+ if (!label)
+ label = GTK_BIN(m_widget)->child;
+
+ gtk_widget_modify_style( label, style );
+
+ child = child->next;
+ }
+}
+
+int wxChoice::GtkAddHelper(GtkWidget *menu, unsigned int pos, const wxString& item)
+{
+ wxCHECK_MSG(pos<=m_clientList.GetCount(), -1, wxT("invalid index"));
+
+ GtkWidget *menu_item = gtk_menu_item_new_with_label( wxGTK_CONV( item ) );
+
+ unsigned int index;
+ if ( m_strings )
+ {
+ // sorted control, need to insert at the correct index
+ index = m_strings->Add(item);
+
+ gtk_menu_shell_insert( GTK_MENU_SHELL(menu), menu_item, index );
+
+ if ( index )
+ {
+ m_clientList.Insert( m_clientList.Item(index - 1),
+ (wxObject*) NULL );
+ }
+ else
+ {
+ m_clientList.Insert( (wxObject*) NULL );
+ }
+ }
+ else
+ {
+ // don't call wxChoice::GetCount() from here because it doesn't work
+ // if we're called from ctor (and GtkMenuShell is still NULL)
+
+ // normal control, just append
+ if (pos == m_clientList.GetCount())
+ {
+ gtk_menu_shell_append( GTK_MENU_SHELL(menu), menu_item );
+ m_clientList.Append( (wxObject*) NULL );
+ index = m_clientList.GetCount() - 1;
+ }
+ else
+ {
+ gtk_menu_shell_insert( GTK_MENU_SHELL(menu), menu_item, pos );
+ m_clientList.Insert( pos, (wxObject*) NULL );
+ index = pos;
+ }
+ }
+
+ if (GTK_WIDGET_REALIZED(m_widget))
+ {
+ gtk_widget_realize( menu_item );
+ gtk_widget_realize( GTK_BIN(menu_item)->child );
+
+ ApplyWidgetStyle();
+ }
+
+ // The best size of a wxChoice should probably
+ // be changed everytime the control has been
+ // changed, but at least after adding an item
+ // it has to change. Adapted from Matt Ownby.
+ InvalidateBestSize();
+
+ g_signal_connect_after (menu_item, "activate",
+ G_CALLBACK (gtk_choice_clicked_callback),
+ this);
+
+ gtk_widget_show( menu_item );
+
+ // return the index of the item in the control
+ return index;