]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/radiobox.cpp
Modified mouse ENTER/LEAVE events so that they also
[wxWidgets.git] / src / gtk / radiobox.cpp
index 10044f42a13f5ac80c9323373b1ce3941b40ba2f..9ad17a94fe582e4899105635a6135e28c9aeca01 100644 (file)
@@ -114,14 +114,58 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_
     return TRUE;
 }
 
+static gint gtk_radiobutton_focus_in( GtkWidget *widget,
+                                      GdkEvent *WXUNUSED(event),
+                                      wxRadioBox *win )
+{
+    if ( win->m_lostFocus )
+    {
+        // no, we didn't really lose it
+        win->m_lostFocus = FALSE;
+    }
+    else if ( !win->m_hasFocus )
+    {
+        win->m_hasFocus = TRUE;
+
+        wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
+        event.SetEventObject( win );
+
+        // never stop the signal emission, it seems to break the kbd handling
+        // inside the radiobox
+        (void)win->GetEventHandler()->ProcessEvent( event );
+    }
+
+    return FALSE;
+}
+
+static gint gtk_radiobutton_focus_out( GtkWidget *widget,
+                                       GdkEvent *WXUNUSED(event),
+                                       wxRadioBox *win )
+{
+    wxASSERT_MSG( win->m_hasFocus, _T("got focus out without any focus in?") );
+
+    // we might have lost the focus, but may be not - it may have just gone to
+    // another button in the same radiobox, so we'll check for it in the next
+    // idle iteration (leave m_hasFocus == TRUE for now)
+    win->m_lostFocus = TRUE;
+
+    return FALSE;
+}
+
 //-----------------------------------------------------------------------------
 // wxRadioBox
 //-----------------------------------------------------------------------------
 
 IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl)
 
-wxRadioBox::wxRadioBox()
+void wxRadioBox::Init()
 {
+    m_alreadySent = FALSE;
+    m_needParent = TRUE;
+    m_acceptsFocus = TRUE;
+
+    m_hasFocus =
+    m_lostFocus = FALSE;
 }
 
 bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
@@ -130,10 +174,6 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
                          long style, const wxValidator& validator,
                          const wxString &name )
 {
-    m_alreadySent = FALSE;
-    m_needParent = TRUE;
-    m_acceptsFocus = TRUE;
-
     if (!PreCreation( parent, pos, size ) ||
         !CreateBase( parent, id, pos, size, style, validator, name ))
     {
@@ -175,6 +215,12 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
         gtk_signal_connect( GTK_OBJECT(m_radio), "clicked",
             GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
 
+        gtk_signal_connect( GTK_OBJECT(m_radio), "focus_in_event",
+            GTK_SIGNAL_FUNC(gtk_radiobutton_focus_in), (gpointer)this );
+
+        gtk_signal_connect( GTK_OBJECT(m_radio), "focus_out_event",
+            GTK_SIGNAL_FUNC(gtk_radiobutton_focus_out), (gpointer)this );
+
         gtk_pizza_put( GTK_PIZZA(m_parent->m_wxwindow),
                          GTK_WIDGET(m_radio),
                          m_x+10, m_y+10+(i*24), 10, 10 );
@@ -195,7 +241,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
     GtkRequisition req;
     req.width = 2;
     req.height = 2;
-    (* GTK_WIDGET_CLASS( GTK_OBJECT(m_widget)->klass )->size_request ) (m_widget, &req );
+    (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(m_widget) )->size_request ) (m_widget, &req );
     if (req.width > ls.x) ls.x = req.width;
     
     wxSize newSize = size;
@@ -275,7 +321,7 @@ wxSize wxRadioBox::LayoutItems()
                 GtkRequisition req;
                 req.width = 2;
                 req.height = 2;
-                (* GTK_WIDGET_CLASS( GTK_OBJECT(button)->klass )->size_request )
+                (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(button) )->size_request )
                       (button, &req );
                
                 if (req.width > max_len) max_len = req.width;
@@ -320,7 +366,7 @@ wxSize wxRadioBox::LayoutItems()
             GtkRequisition req;
             req.width = 2;
             req.height = 2;
-            (* GTK_WIDGET_CLASS( GTK_OBJECT(button)->klass )->size_request )
+            (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(button) )->size_request )
                   (button, &req );
 
             if (req.width > max) max = req.width;
@@ -665,4 +711,19 @@ bool wxRadioBox::IsOwnGtkWindow( GdkWindow *window )
     return FALSE;
 }
 
-#endif
+void wxRadioBox::OnInternalIdle()
+{
+    if ( m_lostFocus )
+    {
+        m_hasFocus = FALSE;
+        m_lostFocus = FALSE;
+
+        wxFocusEvent event( wxEVT_KILL_FOCUS, GetId() );
+        event.SetEventObject( this );
+
+        (void)GetEventHandler()->ProcessEvent( event );
+    }
+}
+
+#endif // wxUSE_RADIOBOX
+