X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4161a2a08e622ba55f66610e26892f5fda37e6f..e86f2cc84aabc8a58b1984c1ed7fb9475f6abe67:/src/gtk/listbox.cpp diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 81f2e12471..97530d7a49 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -104,7 +104,7 @@ gtk_listbox_row_activated_callback(GtkTreeView * WXUNUSED(treeview), event.SetInt(-1); } - listbox->GetEventHandler()->ProcessEvent( event ); + listbox->HandleWindowEvent( event ); } } @@ -135,7 +135,7 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), event.SetExtraLong( 0 ); event.SetInt( -1 ); - listbox->GetEventHandler()->ProcessEvent( event ); + listbox->HandleWindowEvent( event ); return; } @@ -145,7 +145,7 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), event.SetExtraLong( 1 ); event.SetInt( selections[0] ); - listbox->GetEventHandler()->ProcessEvent( event ); + listbox->HandleWindowEvent( event ); } } else @@ -157,7 +157,7 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), event.SetExtraLong( 0 ); event.SetInt( -1 ); - listbox->GetEventHandler()->ProcessEvent( event ); + listbox->HandleWindowEvent( event ); return; } @@ -178,7 +178,7 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), else if ( listbox->HasClientUntypedData() ) event.SetClientData( gtk_tree_entry_get_userdata(entry) ); - listbox->GetEventHandler()->ProcessEvent( event ); + listbox->HandleWindowEvent( event ); g_object_unref (entry); } @@ -186,6 +186,69 @@ gtk_listitem_changed_callback(GtkTreeSelection * WXUNUSED(selection), } } +//----------------------------------------------------------------------------- +// "key_press_event" +//----------------------------------------------------------------------------- + +extern "C" { +static gint +gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget), + GdkEventKey *gdk_event, + wxListBox *listbox ) +{ + if ((gdk_event->keyval == GDK_Return) || + (gdk_event->keyval == GDK_ISO_Enter) || + (gdk_event->keyval == GDK_KP_Enter)) + { + int index = listbox->GetSelection(); + if (index != wxNOT_FOUND) + { + + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, listbox->GetId() ); + event.SetEventObject( listbox ); + + GtkTreeEntry* entry = listbox->GtkGetEntry( index ); + + // indicate that this is a selection + event.SetExtraLong( 1 ); + + event.SetInt( index ); + event.SetString(wxConvUTF8.cMB2WX(gtk_tree_entry_get_label(entry))); + + if ( listbox->HasClientObjectData() ) + event.SetClientObject( + (wxClientData*) gtk_tree_entry_get_userdata(entry) + ); + else if ( listbox->HasClientUntypedData() ) + event.SetClientData( gtk_tree_entry_get_userdata(entry) ); + + /* bool ret = */ listbox->HandleWindowEvent( event ); + + g_object_unref (entry); + +// wxMac and wxMSW always invoke default action +// if (!ret) + { + // DClick not handled -> invoke default action + wxWindow *tlw = wxGetTopLevelParent( listbox ); + if (tlw) + { + GtkWindow *gtk_window = GTK_WINDOW( tlw->GetHandle() ); + if (gtk_window) + gtk_window_activate_default( gtk_window ); + } + } + + // Always intercept, otherwise we'd get another dclick + // event from row_activated + return TRUE; + } + } + + return FALSE; +} +} + //----------------------------------------------------------------------------- // GtkTreeEntry destruction (to destroy client data) //----------------------------------------------------------------------------- @@ -206,7 +269,6 @@ static void gtk_tree_entry_destroy_cb(GtkTreeEntry* entry, //----------------------------------------------------------------------------- // Sorting callback (standard CmpNoCase return value) //----------------------------------------------------------------------------- -#include extern "C" { static gint gtk_listbox_sort_callback(GtkTreeModel * WXUNUSED(model), @@ -426,6 +488,10 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, g_signal_connect_after(m_treeview, "row-activated", G_CALLBACK(gtk_listbox_row_activated_callback), this); + // for intercepting dclick generation by + g_signal_connect (m_treeview, "key_press_event", + G_CALLBACK (gtk_listbox_key_press_callback), + this); m_parent->DoAddChild( this ); PostCreation(size); @@ -448,7 +514,7 @@ wxListBox::~wxListBox() int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, unsigned int pos, void **clientData, - wxClientDataType WXUNUSED(type)) + wxClientDataType type) { wxCHECK_MSG( m_treeview != NULL, wxNOT_FOUND, wxT("invalid listbox") ); @@ -473,15 +539,15 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, (GtkTreeEntryDestroy)gtk_tree_entry_destroy_cb, this); - if (clientData) - gtk_tree_entry_set_userdata(entry, clientData[i]); - GtkTreeIter itercur; gtk_list_store_insert_before(m_liststore, &itercur, pIter); GtkSetItem(itercur, entry); g_object_unref (entry); + + if (clientData) + AssignNewItemClientData(GtkGetIndexFor(itercur), clientData, i, type); } return pos + numItems - 1; @@ -780,7 +846,7 @@ void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent) m_blockEvent = false; } -void wxListBox::DoSetFirstItem( int n ) +void wxListBox::DoScrollToCell(int n, float alignY, float alignX) { wxCHECK_RET( m_treeview, wxT("invalid listbox") ); wxCHECK_RET( IsValid(n), wxT("invalid index")); @@ -798,11 +864,21 @@ void wxListBox::DoSetFirstItem( int n ) // Scroll to the desired cell (0.0 == topleft alignment) gtk_tree_view_scroll_to_cell(m_treeview, path, NULL, - TRUE, 0.0f, 0.0f); + TRUE, alignY, alignX); gtk_tree_path_free(path); } +void wxListBox::DoSetFirstItem(int n) +{ + DoScrollToCell(n, 0, 0); +} + +void wxListBox::EnsureVisible(int n) +{ + DoScrollToCell(n, 0.5, 0); +} + // ---------------------------------------------------------------------------- // hittest // ----------------------------------------------------------------------------