]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtkscalebuttonaccessible.c
c89688e14a5028c21d5d387e00f3765dce918fd2
[~andy/gtk] / gtk / a11y / gtkscalebuttonaccessible.c
1 /* GAIL - The GNOME Accessibility Implementation Library
2  * Copyright 2008 Jan Arne Petersen
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, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 #include <config.h>
21
22 #include <gtk/gtk.h>
23 #include "gtkscalebuttonaccessible.h"
24
25 #include <string.h>
26
27
28 static void atk_action_interface_init (AtkActionIface *iface);
29 static void atk_value_interface_init  (AtkValueIface  *iface);
30
31 G_DEFINE_TYPE_WITH_CODE (GtkScaleButtonAccessible, _gtk_scale_button_accessible, GTK_TYPE_BUTTON_ACCESSIBLE,
32                          G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
33                          G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, atk_value_interface_init));
34
35 static void
36 gtk_scale_button_accessible_value_changed (GtkAdjustment *adjustment,
37                                            gpointer       data)
38 {
39   g_object_notify (G_OBJECT (data), "accessible-value");
40 }
41
42 static void
43 gtk_scale_button_accessible_initialize (AtkObject *obj,
44                                         gpointer   data)
45 {
46   GtkAdjustment *adjustment;
47
48   ATK_OBJECT_CLASS (_gtk_scale_button_accessible_parent_class)->initialize (obj, data);
49
50   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (data));
51   if (adjustment)
52     g_signal_connect (adjustment,
53                       "value-changed",
54                       G_CALLBACK (gtk_scale_button_accessible_value_changed),
55                       obj);
56
57   obj->role = ATK_ROLE_SLIDER;
58 }
59
60 static void
61 gtk_scale_button_accessible_notify_gtk (GObject    *obj,
62                                         GParamSpec *pspec)
63 {
64   GtkScaleButton *scale_button;
65   GtkScaleButtonAccessible *accessible;
66
67   scale_button = GTK_SCALE_BUTTON (obj);
68   accessible = GTK_SCALE_BUTTON_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (scale_button)));
69
70   if (strcmp (pspec->name, "adjustment") == 0)
71     {
72       GtkAdjustment* adjustment;
73
74       adjustment = gtk_scale_button_get_adjustment (scale_button);
75       g_signal_connect (adjustment,
76                         "value-changed",
77                         G_CALLBACK (gtk_scale_button_accessible_value_changed),
78                         accessible);
79     }
80   else
81     {
82       GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_scale_button_accessible_parent_class)->notify_gtk (obj, pspec);
83     }
84 }
85
86 static void
87 _gtk_scale_button_accessible_class_init (GtkScaleButtonAccessibleClass *klass)
88 {
89   AtkObjectClass *atk_object_class = ATK_OBJECT_CLASS (klass);
90   GtkWidgetAccessibleClass *widget_class = GTK_WIDGET_ACCESSIBLE_CLASS (klass);
91
92   atk_object_class->initialize = gtk_scale_button_accessible_initialize;
93
94   widget_class->notify_gtk = gtk_scale_button_accessible_notify_gtk;
95 }
96
97 static void
98 _gtk_scale_button_accessible_init (GtkScaleButtonAccessible *button)
99 {
100 }
101
102 static gboolean
103 gtk_scale_button_accessible_do_action (AtkAction *action,
104                                        gint       i)
105 {
106   GtkWidget *widget;
107
108   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
109   if (widget == NULL)
110     return FALSE;
111
112   if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
113     return FALSE;
114
115   switch (i)
116     {
117     case 0:
118       g_signal_emit_by_name (widget, "popup");
119       return TRUE;
120     case 1:
121       g_signal_emit_by_name (widget, "popdown");
122       return TRUE;
123     default:
124       return FALSE;
125     }
126 }
127
128 static gint
129 gtk_scale_button_accessible_get_n_actions (AtkAction *action)
130 {
131   return 2;
132 }
133
134 static const gchar *
135 gtk_scale_button_accessible_get_description (AtkAction *action,
136                                              gint       i)
137 {
138   return NULL;
139 }
140
141 static const gchar *
142 gtk_scale_button_accessible_action_get_name (AtkAction *action,
143                                              gint       i)
144 {
145   switch (i)
146     {
147     case 0:
148       return "popup";
149     case 1:
150       return "popdown";
151     default:
152       return NULL;
153     }
154 }
155
156 static void
157 atk_action_interface_init (AtkActionIface *iface)
158 {
159   iface->do_action = gtk_scale_button_accessible_do_action;
160   iface->get_n_actions = gtk_scale_button_accessible_get_n_actions;
161   iface->get_description = gtk_scale_button_accessible_get_description;
162   iface->get_name = gtk_scale_button_accessible_action_get_name;
163 }
164
165 static void
166 gtk_scale_button_accessible_get_current_value (AtkValue *obj,
167                                                GValue   *value)
168 {
169   GtkWidget *widget;
170   GtkAdjustment *adjustment;
171
172   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
173   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
174   if (adjustment == NULL)
175     return;
176
177   memset (value,  0, sizeof (GValue));
178   g_value_init (value, G_TYPE_DOUBLE);
179   g_value_set_double (value, gtk_adjustment_get_value (adjustment));
180 }
181
182 static void
183 gtk_scale_button_accessible_get_maximum_value (AtkValue *obj,
184                                                GValue   *value)
185 {
186   GtkWidget *widget;
187   GtkAdjustment *adjustment;
188
189   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
190   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
191   if (adjustment == NULL)
192     return;
193
194   memset (value,  0, sizeof (GValue));
195   g_value_init (value, G_TYPE_DOUBLE);
196   g_value_set_double (value, gtk_adjustment_get_upper (adjustment));
197 }
198
199 static void
200 gtk_scale_button_accessible_get_minimum_value (AtkValue *obj,
201                                                GValue   *value)
202 {
203   GtkWidget *widget;
204   GtkAdjustment *adjustment;
205
206   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
207   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
208   if (adjustment == NULL)
209     return;
210
211   memset (value,  0, sizeof (GValue));
212   g_value_init (value, G_TYPE_DOUBLE);
213   g_value_set_double (value, gtk_adjustment_get_lower (adjustment));
214 }
215
216 static void
217 gtk_scale_button_accessible_get_minimum_increment (AtkValue *obj,
218                                                    GValue   *value)
219 {
220   GtkWidget *widget;
221   GtkAdjustment *adjustment;
222
223   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
224   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
225   if (adjustment == NULL)
226     return;
227
228   memset (value,  0, sizeof (GValue));
229   g_value_init (value, G_TYPE_DOUBLE);
230   g_value_set_double (value, gtk_adjustment_get_minimum_increment (adjustment));
231 }
232
233 static gboolean
234 gtk_scale_button_accessible_set_current_value (AtkValue     *obj,
235                                                const GValue *value)
236 {
237   GtkWidget *widget;
238   GtkAdjustment *adjustment;
239
240   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
241   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
242   if (adjustment == NULL)
243     return FALSE;
244
245   gtk_adjustment_set_value (adjustment, g_value_get_double (value));
246
247   return TRUE;
248 }
249
250 static void
251 atk_value_interface_init (AtkValueIface *iface)
252 {
253   iface->get_current_value = gtk_scale_button_accessible_get_current_value;
254   iface->get_maximum_value = gtk_scale_button_accessible_get_maximum_value;
255   iface->get_minimum_value = gtk_scale_button_accessible_get_minimum_value;
256   iface->get_minimum_increment = gtk_scale_button_accessible_get_minimum_increment;
257   iface->set_current_value = gtk_scale_button_accessible_set_current_value;
258 }