1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  10 // For compilers that support precompilation, includes "wx.h". 
  11 #include "wx/wxprec.h" 
  15 #include "wx/radiobut.h" 
  17 #include "wx/gtk/private.h" 
  19 //----------------------------------------------------------------------------- 
  21 //----------------------------------------------------------------------------- 
  23 extern bool           g_blockEventsOnDrag
; 
  25 //----------------------------------------------------------------------------- 
  27 //----------------------------------------------------------------------------- 
  31 void gtk_radiobutton_clicked_callback( GtkToggleButton 
*button
, wxRadioButton 
*rb 
) 
  33     if (!rb
->m_hasVMT
) return; 
  35     if (g_blockEventsOnDrag
) return; 
  37     if (!button
->active
) return; 
  39     wxCommandEvent 
event( wxEVT_COMMAND_RADIOBUTTON_SELECTED
, rb
->GetId()); 
  40     event
.SetInt( rb
->GetValue() ); 
  41     event
.SetEventObject( rb 
); 
  42     rb
->HandleWindowEvent( event 
); 
  46 //----------------------------------------------------------------------------- 
  48 //----------------------------------------------------------------------------- 
  50 IMPLEMENT_DYNAMIC_CLASS(wxRadioButton
,wxControl
) 
  52 bool wxRadioButton::Create( wxWindow 
*parent
, 
  54                             const wxString
& label
, 
  58                             const wxValidator
& validator
, 
  59                             const wxString
& name 
) 
  61     if (!PreCreation( parent
, pos
, size 
) || 
  62         !CreateBase( parent
, id
, pos
, size
, style
, validator
, name 
)) 
  64         wxFAIL_MSG( wxT("wxRadioButton creation failed") ); 
  68     GSList
* radioButtonGroup 
= NULL
; 
  69     if (!HasFlag(wxRB_GROUP
) && !HasFlag(wxRB_SINGLE
)) 
  71         // search backward for last group start 
  72         wxWindowList::compatibility_iterator node 
= parent
->GetChildren().GetLast(); 
  73         for (; node
; node 
= node
->GetPrevious()) 
  75             wxWindow 
*child 
= node
->GetData(); 
  76             if (child
->HasFlag(wxRB_GROUP
) && wxIsKindOf(child
, wxRadioButton
)) 
  78                 radioButtonGroup 
= gtk_radio_button_get_group( 
  79                     GTK_RADIO_BUTTON(child
->m_widget
)); 
  85     m_widget 
= gtk_radio_button_new_with_label( radioButtonGroup
, wxGTK_CONV( label 
) ); 
  86     g_object_ref(m_widget
); 
  90     g_signal_connect_after (m_widget
, "clicked", 
  91                             G_CALLBACK (gtk_radiobutton_clicked_callback
), this); 
  93     m_parent
->DoAddChild( this ); 
 100 void wxRadioButton::SetLabel( const wxString
& label 
) 
 102     wxCHECK_RET( m_widget 
!= NULL
, wxT("invalid radiobutton") ); 
 104     GTKSetLabelForLabel(GTK_LABEL(GTK_BIN(m_widget
)->child
), label
); 
 107 void wxRadioButton::SetValue( bool val 
) 
 109     wxCHECK_RET( m_widget 
!= NULL
, wxT("invalid radiobutton") ); 
 111     if (val 
== GetValue()) 
 114     g_signal_handlers_block_by_func( 
 115         m_widget
, (void*)gtk_radiobutton_clicked_callback
, this); 
 119         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widget
), TRUE 
); 
 123         // should give an assert 
 124         // RL - No it shouldn't.  A wxGenericValidator might try to set it 
 125         //      as FALSE.  Failing silently is probably TRTTD here. 
 128     g_signal_handlers_unblock_by_func( 
 129         m_widget
, (void*)gtk_radiobutton_clicked_callback
, this); 
 132 bool wxRadioButton::GetValue() const 
 134     wxCHECK_MSG( m_widget 
!= NULL
, false, wxT("invalid radiobutton") ); 
 136     return GTK_TOGGLE_BUTTON(m_widget
)->active
; 
 139 bool wxRadioButton::Enable( bool enable 
) 
 141     if (!base_type::Enable(enable
)) 
 144     gtk_widget_set_sensitive(GTK_BIN(m_widget
)->child
, enable
); 
 152 void wxRadioButton::DoApplyWidgetStyle(GtkRcStyle 
*style
) 
 154     gtk_widget_modify_style(m_widget
, style
); 
 155     gtk_widget_modify_style(GTK_BIN(m_widget
)->child
, style
); 
 159 wxRadioButton::GTKGetWindow(wxArrayGdkWindows
& WXUNUSED(windows
)) const 
 161     return GTK_BUTTON(m_widget
)->event_window
; 
 166 wxRadioButton::GetClassDefaultAttributes(wxWindowVariant 
WXUNUSED(variant
)) 
 168     wxVisualAttributes attr
; 
 169     // NB: we need toplevel window so that GTK+ can find the right style 
 170     GtkWidget 
*wnd 
= gtk_window_new(GTK_WINDOW_TOPLEVEL
); 
 171     GtkWidget
* widget 
= gtk_radio_button_new_with_label(NULL
, ""); 
 172     gtk_container_add(GTK_CONTAINER(wnd
), widget
); 
 173     attr 
= GetDefaultAttributesFromGTKWidget(widget
); 
 174     gtk_widget_destroy(wnd
);