]> git.saurik.com Git - wxWidgets.git/blob - src/gtk/checkbox.cpp
Made tearoff menus work for gtk :-)
[wxWidgets.git] / src / gtk / checkbox.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: checkbox.cpp
3 // Purpose:
4 // Author: Robert Roebling
5 // Id: $Id$
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10
11 #ifdef __GNUG__
12 #pragma implementation "checkbox.h"
13 #endif
14
15 #include "wx/checkbox.h"
16
17 #if wxUSE_CHECKBOX
18
19 #include "gdk/gdk.h"
20 #include "gtk/gtk.h"
21
22 //-----------------------------------------------------------------------------
23 // idle system
24 //-----------------------------------------------------------------------------
25
26 extern void wxapp_install_idle_handler();
27 extern bool g_isIdle;
28
29 //-----------------------------------------------------------------------------
30 // data
31 //-----------------------------------------------------------------------------
32
33 extern bool g_blockEventsOnDrag;
34
35 //-----------------------------------------------------------------------------
36 // "clicked"
37 //-----------------------------------------------------------------------------
38
39 static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckBox *cb )
40 {
41 if (g_isIdle) wxapp_install_idle_handler();
42
43 if (!cb->m_hasVMT) return;
44
45 if (cb->m_blockFirstEvent)
46 {
47 cb->m_blockFirstEvent = FALSE;
48 return;
49 }
50
51 if (g_blockEventsOnDrag) return;
52
53 wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId());
54 event.SetInt( cb->GetValue() );
55 event.SetEventObject(cb);
56 cb->GetEventHandler()->ProcessEvent(event);
57 }
58
59 //-----------------------------------------------------------------------------
60 // wxCheckBox
61 //-----------------------------------------------------------------------------
62
63 IMPLEMENT_DYNAMIC_CLASS(wxCheckBox,wxControl)
64
65 wxCheckBox::wxCheckBox()
66 {
67 }
68
69 bool wxCheckBox::Create(wxWindow *parent,
70 wxWindowID id,
71 const wxString &label,
72 const wxPoint &pos,
73 const wxSize &size,
74 long style,
75 const wxValidator& validator,
76 const wxString &name )
77 {
78 m_needParent = TRUE;
79 m_acceptsFocus = TRUE;
80
81 PreCreation( parent, id, pos, size, style, name );
82
83 m_blockFirstEvent = FALSE;
84
85 #if wxUSE_VALIDATORS
86 SetValidator( validator );
87 #endif
88
89 wxControl::SetLabel( label );
90
91 if ( style & wxALIGN_RIGHT )
92 {
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
95 // left of it
96 m_widgetCheckbox = gtk_check_button_new();
97
98 m_widgetLabel = gtk_label_new(m_label.mbc_str());
99 gtk_misc_set_alignment(GTK_MISC(m_widgetLabel), 0.0, 0.5);
100
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);
104
105 // VZ: why do I have to do this to make them appear?
106 gtk_widget_show( m_widgetLabel );
107 gtk_widget_show( m_widgetCheckbox );
108 }
109 else
110 {
111 m_widgetCheckbox = gtk_check_button_new_with_label( m_label.mbc_str() );
112 m_widgetLabel = GTK_BUTTON( m_widgetCheckbox )->child;
113 m_widget = m_widgetCheckbox;
114 }
115
116 wxSize newSize(size);
117 if (newSize.x == -1)
118 {
119 newSize.x = 25 + gdk_string_measure( m_widgetCheckbox->style->font,
120 m_label.mbc_str() );
121 }
122 if (newSize.y == -1)
123 newSize.y = 26;
124
125 SetSize( newSize.x, newSize.y );
126
127 gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox),
128 "clicked",
129 GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
130 (gpointer *)this );
131
132 m_parent->DoAddChild( this );
133
134 PostCreation();
135
136 SetBackgroundColour( parent->GetBackgroundColour() );
137 SetForegroundColour( parent->GetForegroundColour() );
138 SetFont( parent->GetFont() );
139
140 Show( TRUE );
141
142 return TRUE;
143 }
144
145 void wxCheckBox::SetValue( bool state )
146 {
147 wxCHECK_RET( m_widgetCheckbox != NULL, _T("invalid checkbox") );
148
149 if ( state == GetValue() )
150 return;
151
152 // for compatibility with wxMSW don't send notification when the check box
153 // state is changed programmatically
154 m_blockFirstEvent = TRUE;
155
156 gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
157 }
158
159 bool wxCheckBox::GetValue() const
160 {
161 wxCHECK_MSG( m_widgetCheckbox != NULL, FALSE, _T("invalid checkbox") );
162
163 return GTK_TOGGLE_BUTTON(m_widgetCheckbox)->active;
164 }
165
166 void wxCheckBox::SetLabel( const wxString& label )
167 {
168 wxCHECK_RET( m_widgetLabel != NULL, _T("invalid checkbox") );
169
170 wxControl::SetLabel( label );
171
172 gtk_label_set( GTK_LABEL(m_widgetLabel), GetLabel().mbc_str() );
173 }
174
175 bool wxCheckBox::Enable( bool enable )
176 {
177 if ( !wxControl::Enable( enable ) )
178 return FALSE;
179
180 gtk_widget_set_sensitive( m_widgetLabel, enable );
181
182 return TRUE;
183 }
184
185 void wxCheckBox::ApplyWidgetStyle()
186 {
187 SetWidgetStyle();
188 gtk_widget_set_style( m_widgetCheckbox, m_widgetStyle );
189 gtk_widget_set_style( m_widgetLabel, m_widgetStyle );
190 }
191
192 #endif