]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/listbox.cpp
Fixed some off-by-one errors that were visible on wxGTK but actually
[wxWidgets.git] / src / gtk / listbox.cpp
index ae049dada82b7515e71eb127d0c798a9d635275c..4412ded52af7575548f9f7953c7d3b7c1c3f551e 100644 (file)
 #include "wx/tooltip.h"
 #endif
 
-#if wxUSE_DRAG_AND_DROP
-#include "wx/dnd.h"
-#endif
-
-#include "gdk/gdk.h"
-#include "gtk/gtk.h"
+# include <gdk/gdk.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
 
 //-----------------------------------------------------------------------------
 // idle system
@@ -170,32 +167,52 @@ gtk_listbox_button_press_callback( GtkWidget *widget,
 // "key_press_event"
 //-----------------------------------------------------------------------------
 
-#if wxUSE_CHECKLISTBOX
 static gint
 gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxListBox *listbox )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+    if (g_isIdle) 
+        wxapp_install_idle_handler();
 
-    if (g_blockEventsOnDrag) return FALSE;
+    if (g_blockEventsOnDrag) 
+        return FALSE;
 
-    if (!listbox->m_hasVMT) return FALSE;
+    bool ret = FALSE;
 
-    if (gdk_event->keyval != ' ') return FALSE;
+    if ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab))
+    {
+        wxNavigationKeyEvent new_event;
+        /* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
+        new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
+        /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
+        new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) );
+        new_event.SetCurrentFocus( listbox );
+        ret = listbox->GetEventHandler()->ProcessEvent( new_event );
+    }
+    
+#if wxUSE_CHECKLISTBOX
+    if ((gdk_event->keyval == ' ') && (listbox->m_hasCheckBoxes) && (!ret))
+    {
+        int sel = listbox->GtkGetIndex( widget );
 
-    int sel = listbox->GtkGetIndex( widget );
+        wxCheckListBox *clb = (wxCheckListBox *)listbox;
 
-    wxCheckListBox *clb = (wxCheckListBox *)listbox;
+        clb->Check( sel, !clb->IsChecked(sel) );
 
-    clb->Check( sel, !clb->IsChecked(sel) );
+        wxCommandEvent new_event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, listbox->GetId() );
+        new_event.SetEventObject( listbox );
+        new_event.SetInt( sel );
+        ret = listbox->GetEventHandler()->ProcessEvent( new_event );
+    }
+#endif // wxUSE_CHECKLISTBOX
 
-    wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, listbox->GetId() );
-    event.SetEventObject( listbox );
-    event.SetInt( sel );
-    listbox->GetEventHandler()->ProcessEvent( event );
+    if (ret)
+    {
+        gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" );
+        return TRUE;
+    }
 
     return FALSE;
 }
-#endif // wxUSE_CHECKLISTBOX
 
 //-----------------------------------------------------------------------------
 // "select" and "deselect"
@@ -214,7 +231,7 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox
 
     if (!listbox->m_hasVMT) return;
     if (g_blockEventsOnDrag) return;
-
+    
     wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
     event.SetEventObject( listbox );
 
@@ -236,7 +253,8 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox
 
     event.m_commandInt = n;
 
-    listbox->GetEventHandler()->ProcessEvent( event );
+    listbox->GetEventHandler()->AddPendingEvent( event );
+//    listbox->GetEventHandler()->ProcessEvent( event );
 }
 
 //-----------------------------------------------------------------------------
@@ -309,16 +327,17 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
 
     gtk_widget_show( GTK_WIDGET(m_list) );
 
-    wxSize newSize = size;
-    if (newSize.x == -1) newSize.x = 100;
-    if (newSize.y == -1) newSize.y = 110;
-    SetSize( newSize.x, newSize.y );
+    SetSizeOrDefault( size );
 
     if ( style & wxLB_SORT )
     {
         // this will change DoAppend() behaviour
         m_strings = new wxSortedArrayString;
     }
+    else
+    {
+        m_strings = (wxSortedArrayString *)NULL;
+    }
 
     for (int i = 0; i < n; i++)
     {
@@ -330,7 +349,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
 
     PostCreation();
 
-    SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_WINDOW ) );
+    SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_LISTBOX ) );
     SetForegroundColour( parent->GetForegroundColour() );
     SetFont( parent->GetFont() );
 
@@ -455,20 +474,15 @@ void wxListBox::GtkAddItem( const wxString &item, int pos )
                         (GtkSignalFunc)gtk_listbox_button_release_callback,
                         (gpointer) this );
 
-#if wxUSE_CHECKLISTBOX
-    if (m_hasCheckBoxes)
-    {
-       gtk_signal_connect( GTK_OBJECT(list_item),
+    gtk_signal_connect( GTK_OBJECT(list_item),
                            "key_press_event",
                            (GtkSignalFunc)gtk_listbox_key_press_callback,
                            (gpointer)this );
-    }
-#endif // wxUSE_CHECKLISTBOX
-
-    gtk_widget_show( list_item );
 
     ConnectWidget( list_item );
 
+    gtk_widget_show( list_item );
+
     if (GTK_WIDGET_REALIZED(m_widget))
     {
         gtk_widget_realize( list_item );
@@ -742,19 +756,10 @@ bool wxListBox::IsSelected( int n ) const
     wxCHECK_MSG( m_list != NULL, FALSE, wxT("invalid listbox") );
 
     GList *target = g_list_nth( m_list->children, n );
-    if (target)
-    {
-        GList *child = m_list->selection;
-        while (child)
-        {
-            if (child->data == target->data) return TRUE;
-            child = child->next;
-        }
-    }
-
-    wxFAIL_MSG(wxT("wrong listbox index"));
-
-    return FALSE;
+    
+    wxCHECK_MSG( target, FALSE, wxT("invalid listbox index") );
+    
+    return (GTK_WIDGET(target->data)->state == GTK_STATE_SELECTED) ;
 }
 
 void wxListBox::SetSelection( int n, bool select )
@@ -847,7 +852,7 @@ GtkWidget *wxListBox::GetConnectWidget()
 
 bool wxListBox::IsOwnGtkWindow( GdkWindow *window )
 {
-    if (wxWindow::IsOwnGtkWindow( window )) return TRUE;
+    if (GTK_WIDGET(m_list)->window == window) return TRUE;
 
     GList *child = m_list->children;
     while (child)
@@ -920,4 +925,9 @@ void wxListBox::OnInternalIdle()
     UpdateWindowUI();
 }
 
+wxSize wxListBox::DoGetBestSize() const
+{
+    return wxSize(100, 110);
+}
+
 #endif