]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/gtk1/checkbox.cpp
1. fixed Maximise() mismatch between wxFrame and wxMDIFrame
[wxWidgets.git] / src / gtk1 / checkbox.cpp
... / ...
CommitLineData
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
26extern void wxapp_install_idle_handler();
27extern bool g_isIdle;
28
29//-----------------------------------------------------------------------------
30// data
31//-----------------------------------------------------------------------------
32
33extern bool g_blockEventsOnDrag;
34
35//-----------------------------------------------------------------------------
36// "clicked"
37//-----------------------------------------------------------------------------
38
39static 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
63IMPLEMENT_DYNAMIC_CLASS(wxCheckBox,wxControl)
64
65wxCheckBox::wxCheckBox()
66{
67}
68
69bool 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
145void 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
159bool 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
166void 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
175bool 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
185void 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