X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/53010e52d3adc63d2771263e294714bf644fc979..3b8b23873a175edc3065f67a1865b7808dd6f80d:/src/gtk1/combobox.cpp diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index b3630535a5..6f0acae137 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -13,30 +13,69 @@ #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; }; +*/ //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxComboBox,wxControl) -bool wxComboBox::Create(wxWindow *parent, const wxWindowID id, const wxString& value, +bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, - const int n, const wxString choices[], - const long style, const wxString& name ) + 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, const wxWindowID id, const wxString& v 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 ); + + m_clientData.Append( (wxObject*)clientData ); }; -void wxComboBox::Append( const wxString &WXUNUSED(item), char* WXUNUSED(clientData) ) -{ -}; - -void wxComboBox::Delete( const int n ) +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,20 +176,28 @@ int wxComboBox::FindString( const wxString &item ) count++; child = child->next; }; + + wxFAIL_MSG( "wxComboBox: string not found" ); + return -1; }; -char* wxComboBox::GetClientData( const int n ) +char* wxComboBox::GetClientData( int n ) { wxNode *node = m_clientData.Nth( n ); if (node) return (char*)node->Data(); + + wxFAIL_MSG( "wxComboBox: wrong index" ); + return NULL; }; -void wxComboBox::SetClientData( const int n, char * clientData ) +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,10 +216,13 @@ int wxComboBox::GetSelection(void) const child = child->next; }; }; + + wxFAIL_MSG( "wxComboBox: no selection" ); + return -1; }; -wxString wxComboBox::GetString( const int n ) const +wxString wxComboBox::GetString( int n ) const { GtkWidget *list = GTK_COMBO(m_widget)->list; @@ -163,6 +233,9 @@ wxString wxComboBox::GetString( const 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 ""; }; @@ -190,12 +266,19 @@ int wxComboBox::Number(void) const return count; }; -void wxComboBox::SetSelection( const int n ) +void wxComboBox::SetSelection( int n ) { GtkWidget *list = GTK_COMBO(m_widget)->list; 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; @@ -229,7 +312,7 @@ void wxComboBox::Paste(void) gtk_editable_paste_clipboard( GTK_EDITABLE(entry), 0 ); }; -void wxComboBox::SetInsertionPoint( const long pos ) +void wxComboBox::SetInsertionPoint( long pos ) { GtkWidget *entry = GTK_COMBO(m_widget)->entry; int tmp = (int) pos; @@ -256,7 +339,7 @@ long wxComboBox::GetLastPosition(void) const return (long) pos-1; }; -void wxComboBox::Replace( const long from, const long to, const wxString& value ) +void wxComboBox::Replace( long from, long to, const wxString& value ) { GtkWidget *entry = GTK_COMBO(m_widget)->entry; gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); @@ -265,17 +348,17 @@ void wxComboBox::Replace( const long from, const long to, const wxString& value gtk_editable_insert_text( GTK_EDITABLE(entry), value, value.Length(), &pos ); }; -void wxComboBox::Remove(const long from, const long to) +void wxComboBox::Remove(long from, long to) { GtkWidget *entry = GTK_COMBO(m_widget)->entry; gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); }; -void wxComboBox::SetSelection( const long WXUNUSED(from), const long WXUNUSED(to) ) +void wxComboBox::SetSelection( long WXUNUSED(from), long WXUNUSED(to) ) { }; -void wxComboBox::SetEditable( const bool WXUNUSED(editable) ) +void wxComboBox::SetEditable( bool WXUNUSED(editable) ) { };