X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/debe6624c1e9d4bf3243381153d1e173c849bcd8..3b8b23873a175edc3065f67a1865b7808dd6f80d:/src/gtk1/combobox.cpp diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 5d080a400a..6f0acae137 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -13,20 +13,58 @@ #endif #include "wx/combobox.h" +#include + +//----------------------------------------------------------------------------- +// data +//----------------------------------------------------------------------------- + +extern bool g_blockEventsOnDrag; //----------------------------------------------------------------------------- // wxComboBox //----------------------------------------------------------------------------- -void gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) +//----------------------------------------------------------------------------- +// clicked + +static void gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { + if (!combo->HasVMT()) return; + if (g_blockEventsOnDrag) return; + + if (combo->m_alreadySent) + { + combo->m_alreadySent = FALSE; + return; + } + + combo->m_alreadySent = TRUE; + wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, combo->GetId()); event.SetInt( combo->GetSelection() ); wxString tmp( combo->GetStringSelection() ); event.SetString( WXSTRINGCAST(tmp) ); event.SetEventObject(combo); - combo->ProcessEvent(event); + combo->GetEventHandler()->ProcessEvent(event); +}; + +//----------------------------------------------------------------------------- +// size + +/* +static gint gtk_combo_size_callback( GtkCombo *widget, GtkAllocation* alloc, wxComboBox *win ) +{ + if (!win->HasVMT()) return FALSE; + if (g_blockEventsOnDrag) return FALSE; + if (!widget->button) return FALSE; + + widget->button->allocation.x = + alloc->width - widget->button->allocation.width; + + return FALSE; }; +*/ //----------------------------------------------------------------------------- @@ -37,6 +75,7 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& value, int n, const wxString choices[], long style, const wxString& name ) { + m_alreadySent = FALSE; m_needParent = TRUE; PreCreation( parent, id, pos, size, style, name ); @@ -55,16 +94,23 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& value, GtkWidget *list_item; list_item = gtk_list_item_new_with_label( choices[i] ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); - gtk_container_add( GTK_CONTAINER(list), list_item ); + m_clientData.Append( (wxObject*)NULL ); + gtk_widget_show( list_item ); + + gtk_signal_connect( GTK_OBJECT(list_item), "select", + GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); }; PostCreation(); +/* + gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", + GTK_SIGNAL_FUNC(gtk_combo_size_callback), (gpointer)this ); +*/ + if (!value.IsNull()) SetValue( value ); Show( TRUE ); @@ -76,31 +122,44 @@ void wxComboBox::Clear(void) { GtkWidget *list = GTK_COMBO(m_widget)->list; gtk_list_clear_items( GTK_LIST(list), 0, Number() ); + + m_clientData.Clear(); }; void wxComboBox::Append( const wxString &item ) +{ + Append( item, (char*)NULL ); +}; + +void wxComboBox::Append( const wxString &item, char *clientData ) { GtkWidget *list = GTK_COMBO(m_widget)->list; GtkWidget *list_item; list_item = gtk_list_item_new_with_label( item ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", + gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); gtk_container_add( GTK_CONTAINER(list), list_item ); gtk_widget_show( list_item ); -}; - -void wxComboBox::Append( const wxString &WXUNUSED(item), char* WXUNUSED(clientData) ) -{ + + m_clientData.Append( (wxObject*)clientData ); }; void wxComboBox::Delete( int n ) { GtkWidget *list = GTK_COMBO(m_widget)->list; gtk_list_clear_items( GTK_LIST(list), n, n ); + + wxNode *node = m_clientData.Nth( n ); + if (!node) + { + wxFAIL_MSG( "wxComboBox: wrong index" ); + } + else + m_clientData.DeleteNode( node ); }; int wxComboBox::FindString( const wxString &item ) @@ -117,6 +176,9 @@ int wxComboBox::FindString( const wxString &item ) count++; child = child->next; }; + + wxFAIL_MSG( "wxComboBox: string not found" ); + return -1; }; @@ -124,6 +186,9 @@ char* wxComboBox::GetClientData( int n ) { wxNode *node = m_clientData.Nth( n ); if (node) return (char*)node->Data(); + + wxFAIL_MSG( "wxComboBox: wrong index" ); + return NULL; }; @@ -131,6 +196,8 @@ void wxComboBox::SetClientData( int n, char * clientData ) { wxNode *node = m_clientData.Nth( n ); if (node) node->SetData( (wxObject*) clientData ); + + wxFAIL_MSG( "wxComboBox: wrong index" ); }; int wxComboBox::GetSelection(void) const @@ -149,6 +216,9 @@ int wxComboBox::GetSelection(void) const child = child->next; }; }; + + wxFAIL_MSG( "wxComboBox: no selection" ); + return -1; }; @@ -163,6 +233,9 @@ wxString wxComboBox::GetString( int n ) const GtkLabel *label = GTK_LABEL( bin->child ); return label->label; }; + + wxFAIL_MSG( "wxComboBox: wrong index" ); + return ""; }; @@ -177,6 +250,9 @@ wxString wxComboBox::GetStringSelection(void) const wxString tmp = GTK_LABEL( bin->child )->label; return tmp; }; + + wxFAIL_MSG( "wxComboBox: no selection" ); + return ""; }; @@ -196,6 +272,13 @@ void wxComboBox::SetSelection( int n ) gtk_list_select_item( GTK_LIST(list), n ); }; +void wxComboBox::SetStringSelection( const wxString &string ) +{ + int res = FindString( string ); + if (res == -1) return; + SetSelection( res ); +}; + wxString wxComboBox::GetValue(void) const { GtkWidget *entry = GTK_COMBO(m_widget)->entry;