1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  11 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  12 #pragma implementation "radiobut.h" 
  15 // For compilers that support precompilation, includes "wx.h". 
  16 #include "wx/wxprec.h" 
  20 #include "wx/radiobut.h" 
  22 #include "wx/gtk/private.h" 
  24 //----------------------------------------------------------------------------- 
  26 //----------------------------------------------------------------------------- 
  28 extern void wxapp_install_idle_handler(); 
  31 //----------------------------------------------------------------------------- 
  33 //----------------------------------------------------------------------------- 
  35 extern bool           g_blockEventsOnDrag
; 
  36 extern wxCursor       g_globalCursor
; 
  37 extern wxWindowGTK   
*g_delayedFocus
; 
  39 //----------------------------------------------------------------------------- 
  41 //----------------------------------------------------------------------------- 
  44 void gtk_radiobutton_clicked_callback( GtkToggleButton 
*button
, wxRadioButton 
*rb 
) 
  46     if (g_isIdle
) wxapp_install_idle_handler(); 
  48     if (!rb
->m_hasVMT
) return; 
  50     if (g_blockEventsOnDrag
) return; 
  52     if (!button
->active
) return; 
  54     if (rb
->m_blockEvent
) return; 
  56     wxCommandEvent 
event( wxEVT_COMMAND_RADIOBUTTON_SELECTED
, rb
->GetId()); 
  57     event
.SetInt( rb
->GetValue() ); 
  58     event
.SetEventObject( rb 
); 
  59     rb
->GetEventHandler()->ProcessEvent( event 
); 
  62 //----------------------------------------------------------------------------- 
  64 //----------------------------------------------------------------------------- 
  66 IMPLEMENT_DYNAMIC_CLASS(wxRadioButton
,wxControl
) 
  68 bool wxRadioButton::Create( wxWindow 
*parent
, 
  70                             const wxString
& label
, 
  74                             const wxValidator
& validator
, 
  75                             const wxString
& name 
) 
  77     m_acceptsFocus 
= TRUE
; 
  82     if (!PreCreation( parent
, pos
, size 
) || 
  83         !CreateBase( parent
, id
, pos
, size
, style
, validator
, name 
)) 
  85         wxFAIL_MSG( wxT("wxRadioButton creation failed") ); 
  89     if (HasFlag(wxRB_GROUP
)) 
  92         m_radioButtonGroup 
= (GSList
*) NULL
; 
  96         // search backward for last group start 
  97         wxRadioButton 
*chief 
= (wxRadioButton
*) NULL
; 
  98         wxWindowList::compatibility_iterator node 
= parent
->GetChildren().GetLast(); 
 101             wxWindow 
*child 
= node
->GetData(); 
 102             if (child
->IsRadioButton()) 
 104                 chief 
= (wxRadioButton
*) child
; 
 105                 if (child
->HasFlag(wxRB_GROUP
)) 
 108             node 
= node
->GetPrevious(); 
 112             // we are part of the group started by chief 
 113             m_radioButtonGroup 
= gtk_radio_button_group( GTK_RADIO_BUTTON(chief
->m_widget
) ); 
 118             m_radioButtonGroup 
= (GSList
*) NULL
; 
 122     m_widget 
= gtk_radio_button_new_with_label( m_radioButtonGroup
, wxGTK_CONV( label 
) ); 
 126     gtk_signal_connect( GTK_OBJECT(m_widget
), "clicked",  
 127       GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback
), (gpointer
*)this ); 
 129     m_parent
->DoAddChild( this ); 
 133     SetFont( parent
->GetFont() ); 
 135     wxSize 
size_best( DoGetBestSize() ); 
 136     wxSize 
new_size( size 
); 
 137     if (new_size
.x 
== -1) 
 138         new_size
.x 
= size_best
.x
; 
 139     if (new_size
.y 
== -1) 
 140         new_size
.y 
= size_best
.y
; 
 141     if ((new_size
.x 
!= size
.x
) || (new_size
.y 
!= size
.y
)) 
 142         SetSize( new_size
.x
, new_size
.y 
); 
 144     SetBackgroundColour( parent
->GetBackgroundColour() ); 
 145     SetForegroundColour( parent
->GetForegroundColour() ); 
 152 void wxRadioButton::SetLabel( const wxString
& label 
) 
 154     wxCHECK_RET( m_widget 
!= NULL
, wxT("invalid radiobutton") ); 
 156     wxControl::SetLabel( label 
); 
 157     GtkLabel 
*g_label 
= GTK_LABEL( BUTTON_CHILD(m_widget
) ); 
 159     wxString label2 
= PrepareLabelMnemonics( label 
); 
 160     gtk_label_set_text_with_mnemonic( g_label
, wxGTK_CONV( label2 
) ); 
 162     gtk_label_set( g_label
, wxGTK_CONV( GetLabel() ) ); 
 166 void wxRadioButton::SetValue( bool val 
) 
 168     wxCHECK_RET( m_widget 
!= NULL
, wxT("invalid radiobutton") ); 
 170     if (val 
== GetValue()) 
 177         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widget
), TRUE 
); 
 181         // should give an assert 
 182         // RL - No it shouldn't.  A wxGenericValidator might try to set it 
 183         //      as FALSE.  Failing silently is probably TRTTD here. 
 186     m_blockEvent 
= FALSE
; 
 189 bool wxRadioButton::GetValue() const 
 191     wxCHECK_MSG( m_widget 
!= NULL
, FALSE
, wxT("invalid radiobutton") ); 
 193     return GTK_TOGGLE_BUTTON(m_widget
)->active
; 
 196 bool wxRadioButton::Enable( bool enable 
) 
 198     if ( !wxControl::Enable( enable 
) ) 
 201     gtk_widget_set_sensitive( BUTTON_CHILD(m_widget
), enable 
); 
 206 void wxRadioButton::ApplyWidgetStyle() 
 209     gtk_widget_set_style( m_widget
, m_widgetStyle 
); 
 210     gtk_widget_set_style( BUTTON_CHILD(m_widget
), m_widgetStyle 
); 
 213 bool wxRadioButton::IsOwnGtkWindow( GdkWindow 
*window 
) 
 215     return window 
== TOGGLE_BUTTON_EVENT_WIN(m_widget
); 
 218 void wxRadioButton::OnInternalIdle() 
 220     wxCursor cursor 
= m_cursor
; 
 221     if (g_globalCursor
.Ok()) cursor 
= g_globalCursor
; 
 223     GdkWindow 
*win 
= TOGGLE_BUTTON_EVENT_WIN(m_widget
); 
 224     if ( win 
&& cursor
.Ok()) 
 226         /* I now set the cursor the anew in every OnInternalIdle call 
 227        as setting the cursor in a parent window also effects the 
 228        windows above so that checking for the current cursor is 
 231        gdk_window_set_cursor( win
, cursor
.GetCursor() ); 
 234     if (g_delayedFocus 
== this) 
 236         if (GTK_WIDGET_REALIZED(m_widget
)) 
 238             gtk_widget_grab_focus( m_widget 
); 
 239             g_delayedFocus 
= NULL
; 
 243     if (wxUpdateUIEvent::CanUpdate(this)) 
 244         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
 247 wxSize 
wxRadioButton::DoGetBestSize() const 
 249     return wxControl::DoGetBestSize();