]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtkspinbuttonaccessible.c
Change FSF Address
[~andy/gtk] / gtk / a11y / gtkspinbuttonaccessible.c
1 /* GAIL - The GNOME Accessibility Implementation Library
2  * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include "config.h"
19
20 #include <string.h>
21 #include <gtk/gtk.h>
22 #include "gtkspinbuttonaccessible.h"
23
24
25 static void atk_value_interface_init (AtkValueIface *iface);
26
27 G_DEFINE_TYPE_WITH_CODE (GtkSpinButtonAccessible, _gtk_spin_button_accessible, GTK_TYPE_ENTRY_ACCESSIBLE,
28                          G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, atk_value_interface_init))
29
30 static void
31 gtk_spin_button_accessible_value_changed (GtkAdjustment *adjustment,
32                                           gpointer       data)
33 {
34   GtkSpinButtonAccessible *spin_button;
35
36   if (adjustment == NULL || data == NULL)
37     return;
38
39   spin_button = GTK_SPIN_BUTTON_ACCESSIBLE (data);
40
41   g_object_notify (G_OBJECT (spin_button), "accessible-value");
42 }
43
44 static void
45 gtk_spin_button_accessible_initialize (AtkObject *obj,
46                                        gpointer  data)
47 {
48   GtkAdjustment *adjustment;
49
50   ATK_OBJECT_CLASS (_gtk_spin_button_accessible_parent_class)->initialize (obj, data);
51
52   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (data));
53   if (adjustment)
54     g_signal_connect (adjustment,
55                       "value-changed",
56                       G_CALLBACK (gtk_spin_button_accessible_value_changed),
57                       obj);
58
59   obj->role = ATK_ROLE_SPIN_BUTTON;
60 }
61
62 static void
63 gtk_spin_button_accessible_notify_gtk (GObject    *obj,
64                                        GParamSpec *pspec)
65 {
66   GtkWidget *widget = GTK_WIDGET (obj);
67   GtkSpinButtonAccessible *spin_button = GTK_SPIN_BUTTON_ACCESSIBLE (gtk_widget_get_accessible (widget));
68
69   if (strcmp (pspec->name, "adjustment") == 0)
70     {
71       GtkAdjustment* adjustment;
72
73       adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
74       g_signal_connect (adjustment, "value-changed",
75                         G_CALLBACK (gtk_spin_button_accessible_value_changed),
76                         spin_button);
77     }
78   else
79     GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_spin_button_accessible_parent_class)->notify_gtk (obj, pspec);
80 }
81
82
83
84 static void
85 _gtk_spin_button_accessible_class_init (GtkSpinButtonAccessibleClass *klass)
86 {
87   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
88   GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
89
90   widget_class->notify_gtk = gtk_spin_button_accessible_notify_gtk;
91
92   class->initialize = gtk_spin_button_accessible_initialize;
93 }
94
95 static void
96 _gtk_spin_button_accessible_init (GtkSpinButtonAccessible *button)
97 {
98 }
99
100 static void
101 gtk_spin_button_accessible_get_current_value (AtkValue *obj,
102                                               GValue   *value)
103 {
104   GtkWidget *widget;
105   GtkAdjustment *adjustment;
106
107   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
108   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
109   if (adjustment == NULL)
110     return;
111
112   memset (value,  0, sizeof (GValue));
113   g_value_init (value, G_TYPE_DOUBLE);
114   g_value_set_double (value, gtk_adjustment_get_value (adjustment));
115 }
116
117 static void
118 gtk_spin_button_accessible_get_maximum_value (AtkValue *obj,
119                                               GValue   *value)
120 {
121   GtkWidget *widget;
122   GtkAdjustment *adjustment;
123
124   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
125   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
126   if (adjustment == NULL)
127     return;
128
129   memset (value,  0, sizeof (GValue));
130   g_value_init (value, G_TYPE_DOUBLE);
131   g_value_set_double (value, gtk_adjustment_get_upper (adjustment));
132 }
133
134 static void
135 gtk_spin_button_accessible_get_minimum_value (AtkValue *obj,
136                                               GValue   *value)
137 {
138   GtkWidget *widget;
139   GtkAdjustment *adjustment;
140
141   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
142   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
143   if (adjustment == NULL)
144     return;
145
146   memset (value,  0, sizeof (GValue));
147   g_value_init (value, G_TYPE_DOUBLE);
148   g_value_set_double (value, gtk_adjustment_get_lower (adjustment));
149 }
150
151 static void
152 gtk_spin_button_accessible_get_minimum_increment (AtkValue *obj,
153                                                   GValue   *value)
154 {
155   GtkWidget *widget;
156   GtkAdjustment *adjustment;
157
158   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
159   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
160   if (adjustment == NULL)
161     return;
162
163   memset (value,  0, sizeof (GValue));
164   g_value_init (value, G_TYPE_DOUBLE);
165   g_value_set_double (value, gtk_adjustment_get_minimum_increment (adjustment));
166 }
167
168 static gboolean
169 gtk_spin_button_accessible_set_current_value (AtkValue     *obj,
170                                               const GValue *value)
171 {
172   GtkWidget *widget;
173   GtkAdjustment *adjustment;
174
175   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
176   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
177   if (adjustment == NULL)
178     return FALSE;
179
180   gtk_adjustment_set_value (adjustment, g_value_get_double (value));
181
182   return TRUE;
183 }
184
185 static void
186 atk_value_interface_init (AtkValueIface *iface)
187 {
188   iface->get_current_value = gtk_spin_button_accessible_get_current_value;
189   iface->get_maximum_value = gtk_spin_button_accessible_get_maximum_value;
190   iface->get_minimum_value = gtk_spin_button_accessible_get_minimum_value;
191   iface->get_minimum_increment = gtk_spin_button_accessible_get_minimum_increment;
192   iface->set_current_value = gtk_spin_button_accessible_set_current_value;
193 }