]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/listbox.cpp
reorganized wxBitmap/wxBitmapHandler classes to use wxBitmapType instead of "long...
[wxWidgets.git] / src / gtk / listbox.cpp
index 0f28034f816efc596d89b8c0744ce089887f46ba..97530d7a49beb917b78eda4eb7c561f1cf0d5510 100644 (file)
@@ -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)
 //-----------------------------------------------------------------------------
@@ -425,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 <ENTER>
+    g_signal_connect (m_treeview, "key_press_event",
+                      G_CALLBACK (gtk_listbox_key_press_callback),
+                           this);
     m_parent->DoAddChild( this );
 
     PostCreation(size);
@@ -447,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") );
 
@@ -472,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;
@@ -779,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"));
@@ -797,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
 // ----------------------------------------------------------------------------