1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk1/checkbox.cpp 
   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/checkbox.h" 
  17 #include "wx/gtk1/private.h" 
  19 //----------------------------------------------------------------------------- 
  21 //----------------------------------------------------------------------------- 
  23 extern void wxapp_install_idle_handler(); 
  26 //----------------------------------------------------------------------------- 
  28 //----------------------------------------------------------------------------- 
  30 extern bool           g_blockEventsOnDrag
; 
  31 extern wxCursor       g_globalCursor
; 
  32 extern wxWindowGTK   
*g_delayedFocus
; 
  34 //----------------------------------------------------------------------------- 
  36 //----------------------------------------------------------------------------- 
  39 static void gtk_checkbox_toggled_callback(GtkWidget 
*widget
, wxCheckBox 
*cb
) 
  41     if (g_isIdle
) wxapp_install_idle_handler(); 
  43     if (!cb
->m_hasVMT
) return; 
  45     if (g_blockEventsOnDrag
) return; 
  47     if (cb
->m_blockEvent
) return; 
  49     wxCommandEvent 
event(wxEVT_COMMAND_CHECKBOX_CLICKED
, cb
->GetId()); 
  50     event
.SetInt(cb
->GetValue()); 
  51     event
.SetEventObject(cb
); 
  52     cb
->GetEventHandler()->ProcessEvent(event
); 
  56 //----------------------------------------------------------------------------- 
  58 //----------------------------------------------------------------------------- 
  60 IMPLEMENT_DYNAMIC_CLASS(wxCheckBox
,wxControl
) 
  62 wxCheckBox::wxCheckBox() 
  66 bool wxCheckBox::Create(wxWindow 
*parent
, 
  68                         const wxString 
&label
, 
  72                         const wxValidator
& validator
, 
  73                         const wxString 
&name 
) 
  76     m_acceptsFocus 
= true; 
  79     if (!PreCreation( parent
, pos
, size 
) || 
  80         !CreateBase( parent
, id
, pos
, size
, style
, validator
, name 
)) 
  82         wxFAIL_MSG( wxT("wxCheckBox creation failed") ); 
  86     wxASSERT_MSG( (style 
& wxCHK_ALLOW_3RD_STATE_FOR_USER
) == 0 || 
  87                   (style 
& wxCHK_3STATE
) != 0, 
  88                   wxT("Using wxCHK_ALLOW_3RD_STATE_FOR_USER") 
  89                   wxT(" style flag for a 2-state checkbox is useless") ); 
  91     if ( style 
& wxALIGN_RIGHT 
) 
  93         // VZ: as I don't know a way to create a right aligned checkbox with 
  94         //     GTK we will create a checkbox without label and a label at the 
  96         m_widgetCheckbox 
= gtk_check_button_new(); 
  98         m_widgetLabel 
= gtk_label_new(""); 
  99         gtk_misc_set_alignment(GTK_MISC(m_widgetLabel
), 0.0, 0.5); 
 101         m_widget 
= gtk_hbox_new(FALSE
, 0); 
 102         gtk_box_pack_start(GTK_BOX(m_widget
), m_widgetLabel
, FALSE
, FALSE
, 3); 
 103         gtk_box_pack_start(GTK_BOX(m_widget
), m_widgetCheckbox
, FALSE
, FALSE
, 3); 
 105         gtk_widget_show( m_widgetLabel 
); 
 106         gtk_widget_show( m_widgetCheckbox 
); 
 110         m_widgetCheckbox 
= gtk_check_button_new_with_label(""); 
 111         m_widgetLabel 
= BUTTON_CHILD( m_widgetCheckbox 
); 
 112         m_widget 
= m_widgetCheckbox
; 
 116     gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox
), 
 118                         GTK_SIGNAL_FUNC(gtk_checkbox_toggled_callback
), 
 121     m_parent
->DoAddChild( this ); 
 128 void wxCheckBox::SetValue( bool state 
) 
 130     wxCHECK_RET( m_widgetCheckbox 
!= NULL
, wxT("invalid checkbox") ); 
 132     if (state 
== GetValue()) 
 137     gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox
), state 
); 
 139     m_blockEvent 
= false; 
 142 bool wxCheckBox::GetValue() const 
 144     wxCHECK_MSG( m_widgetCheckbox 
!= NULL
, false, wxT("invalid checkbox") ); 
 146     return GTK_TOGGLE_BUTTON(m_widgetCheckbox
)->active
; 
 149 void wxCheckBox::SetLabel( const wxString
& label 
) 
 151     wxCHECK_RET( m_widgetLabel 
!= NULL
, wxT("invalid checkbox") ); 
 153     GTKSetLabelForLabel(GTK_LABEL(m_widgetLabel
), label
); 
 156 bool wxCheckBox::Enable( bool enable 
) 
 158     if ( !wxControl::Enable( enable 
) ) 
 161     gtk_widget_set_sensitive( m_widgetLabel
, enable 
); 
 166 void wxCheckBox::DoApplyWidgetStyle(GtkRcStyle 
*style
) 
 168     gtk_widget_modify_style(m_widgetCheckbox
, style
); 
 169     gtk_widget_modify_style(m_widgetLabel
, style
); 
 172 bool wxCheckBox::IsOwnGtkWindow( GdkWindow 
*window 
) 
 174     return window 
== TOGGLE_BUTTON_EVENT_WIN(m_widget
); 
 177 void wxCheckBox::OnInternalIdle() 
 179     wxCursor cursor 
= m_cursor
; 
 180     if (g_globalCursor
.Ok()) cursor 
= g_globalCursor
; 
 182     GdkWindow 
*event_window 
= TOGGLE_BUTTON_EVENT_WIN(m_widgetCheckbox
); 
 183     if ( event_window 
&& cursor
.Ok() ) 
 185         /* I now set the cursor the anew in every OnInternalIdle call 
 186            as setting the cursor in a parent window also effects the 
 187            windows above so that checking for the current cursor is 
 190        gdk_window_set_cursor( event_window
, cursor
.GetCursor() ); 
 193     if (g_delayedFocus 
== this) 
 195         if (GTK_WIDGET_REALIZED(m_widget
)) 
 197             gtk_widget_grab_focus( m_widget 
); 
 198             g_delayedFocus 
= NULL
; 
 202     if (wxUpdateUIEvent::CanUpdate(this)) 
 203         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
 206 wxSize 
wxCheckBox::DoGetBestSize() const 
 208     return wxControl::DoGetBestSize(); 
 213 wxCheckBox::GetClassDefaultAttributes(wxWindowVariant 
WXUNUSED(variant
)) 
 215     return GetDefaultAttributesFromGTKWidget(gtk_check_button_new
);