]> Pileus Git - ~andy/gtk/blob - modules/other/gail/gailscalebutton.c
956543cbcbe7b056b3b3f72e9881ce9b4f76bcdb
[~andy/gtk] / modules / other / gail / gailscalebutton.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 "gailscalebutton.h"
24 #include "gailadjustment.h"
25 #include "gail-private-macros.h"
26
27 #include <string.h>
28
29 static void gail_scale_button_class_init (GailScaleButtonClass *klass);
30 static void gail_scale_button_init       (GailScaleButton      *button);
31
32 /* GailWidget */
33 static void gail_scale_button_notify_gtk (GObject    *obj,
34                                           GParamSpec *pspec);
35
36 /* AtkObject */
37 static void gail_scale_button_initialize (AtkObject *obj,
38                                           gpointer   data);
39
40 /* AtkAction */
41 static void                  atk_action_interface_init        (AtkActionIface *iface);
42 static gboolean              gail_scale_button_do_action      (AtkAction      *action,
43                                                                gint           i);
44 static gint                  gail_scale_button_get_n_actions  (AtkAction      *action);
45 static G_CONST_RETURN gchar* gail_scale_button_get_description(AtkAction      *action,
46                                                                gint           i);
47 static G_CONST_RETURN gchar* gail_scale_button_action_get_name(AtkAction      *action,
48                                                                gint           i);
49 static G_CONST_RETURN gchar* gail_scale_button_get_keybinding (AtkAction      *action,
50                                                                gint           i);
51 static gboolean              gail_scale_button_set_description(AtkAction      *action,
52                                                                gint           i,
53                                                                const gchar    *desc);
54
55 /* AtkValue */
56 static void     atk_value_interface_init                (AtkValueIface  *iface);
57 static void     gail_scale_button_get_current_value     (AtkValue       *obj,
58                                                          GValue         *value);
59 static void     gail_scale_button_get_maximum_value     (AtkValue       *obj,
60                                                          GValue         *value);
61 static void     gail_scale_button_get_minimum_value     (AtkValue       *obj,
62                                                          GValue         *value);
63 static void     gail_scale_button_get_minimum_increment (AtkValue       *obj,
64                                                          GValue         *value);
65 static gboolean gail_scale_button_set_current_value     (AtkValue       *obj,
66                                                          const GValue   *value);
67
68 G_DEFINE_TYPE_WITH_CODE (GailScaleButton, gail_scale_button, GAIL_TYPE_BUTTON,
69                          G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
70                          G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, atk_value_interface_init));
71
72 static void
73 gail_scale_button_class_init (GailScaleButtonClass *klass)
74 {
75   AtkObjectClass *atk_object_class = ATK_OBJECT_CLASS (klass);
76   GailWidgetClass *widget_class = GAIL_WIDGET_CLASS (klass);
77
78   atk_object_class->initialize = gail_scale_button_initialize;
79
80   widget_class->notify_gtk = gail_scale_button_notify_gtk;
81 }
82
83 static void
84 gail_scale_button_init (GailScaleButton *button)
85 {
86 }
87
88 static void
89 gail_scale_button_initialize (AtkObject *obj,
90                               gpointer   data)
91 {
92   ATK_OBJECT_CLASS (gail_scale_button_parent_class)->initialize (obj, data);
93
94   obj->role = ATK_ROLE_SLIDER;
95 }
96
97 static void
98 atk_action_interface_init (AtkActionIface *iface)
99 {
100   iface->do_action = gail_scale_button_do_action;
101   iface->get_n_actions = gail_scale_button_get_n_actions;
102   iface->get_description = gail_scale_button_get_description;
103   iface->get_keybinding = gail_scale_button_get_keybinding;
104   iface->get_name = gail_scale_button_action_get_name;
105   iface->set_description = gail_scale_button_set_description;
106 }
107
108 static gboolean
109 gail_scale_button_do_action(AtkAction *action,
110                             gint       i)
111 {
112   GtkWidget *widget;
113
114   widget = GTK_ACCESSIBLE (action)->widget;
115   if (widget == NULL)
116     return FALSE;
117
118   if (!gtk_widget_is_sensitive (widget) || !GTK_WIDGET_VISIBLE (widget))
119     return FALSE;
120
121   switch (i) {
122     case 0:
123       g_signal_emit_by_name (widget, "popup");
124       return TRUE;
125     case 1:
126       g_signal_emit_by_name (widget, "podown");
127       return TRUE;
128     default:
129       return FALSE;
130   }
131 }
132
133 static gint
134 gail_scale_button_get_n_actions (AtkAction *action)
135 {
136   return 2;
137 }
138
139 static G_CONST_RETURN gchar*
140 gail_scale_button_get_description (AtkAction *action,
141                                    gint       i)
142 {
143   return NULL;
144 }
145
146 static G_CONST_RETURN gchar*
147 gail_scale_button_action_get_name (AtkAction *action,
148                                    gint       i)
149 {
150   switch (i) {
151     case 0:
152       return "popup";
153     case 1:
154       return "popdown";
155     default:
156       return NULL;
157   }
158 }
159
160 static G_CONST_RETURN gchar*
161 gail_scale_button_get_keybinding (AtkAction *action,
162                                   gint       i)
163 {
164   return NULL;
165 }
166
167 static gboolean
168 gail_scale_button_set_description (AtkAction   *action,
169                                    gint         i,
170                                    const gchar *desc)
171 {
172   return FALSE;
173 }
174
175
176 static void
177 atk_value_interface_init (AtkValueIface *iface)
178 {
179   iface->get_current_value = gail_scale_button_get_current_value;
180   iface->get_maximum_value = gail_scale_button_get_maximum_value;
181   iface->get_minimum_value = gail_scale_button_get_minimum_value;
182   iface->get_minimum_increment = gail_scale_button_get_minimum_increment;
183   iface->set_current_value = gail_scale_button_set_current_value;
184 }
185
186 static void
187 gail_scale_button_get_current_value (AtkValue *obj,
188                                      GValue   *value)
189 {
190   GtkScaleButton *gtk_scale_button;
191
192   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
193
194   gtk_scale_button = GTK_SCALE_BUTTON (GTK_ACCESSIBLE (obj)->widget);
195
196   g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
197                       gtk_scale_button_get_value (gtk_scale_button));
198 }
199
200 static void
201 gail_scale_button_get_maximum_value (AtkValue *obj,
202                                      GValue   *value)
203 {
204   GtkWidget *gtk_widget;
205   GtkAdjustment *adj;
206
207   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
208
209   gtk_widget = GTK_ACCESSIBLE (obj)->widget;
210   if (gtk_widget == NULL)
211     return;
212
213   adj = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (gtk_widget));
214   if (adj != NULL)
215     g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
216                         adj->upper);
217 }
218
219 static void
220 gail_scale_button_get_minimum_value (AtkValue *obj,
221                                      GValue   *value)
222 {
223   GtkWidget *gtk_widget;
224   GtkAdjustment *adj;
225
226   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
227
228   gtk_widget = GTK_ACCESSIBLE (obj)->widget;
229   if (gtk_widget == NULL)
230     return;
231
232   adj = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (gtk_widget));
233   if (adj != NULL)
234     g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
235                         adj->lower);
236 }
237
238 static void
239 gail_scale_button_get_minimum_increment (AtkValue *obj,
240                                          GValue   *value)
241 {
242   GtkWidget *gtk_widget;
243   GtkAdjustment *adj;
244
245   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
246
247   gtk_widget = GTK_ACCESSIBLE (obj)->widget;
248   if (gtk_widget == NULL)
249     return;
250
251   adj = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (gtk_widget));
252   if (adj != NULL)
253     g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
254                         adj->step_increment);
255 }
256
257 static gboolean
258 gail_scale_button_set_current_value (AtkValue     *obj,
259                                      const GValue *value)
260 {
261   GtkWidget *gtk_widget;
262
263   g_return_val_if_fail (GAIL_IS_SCALE_BUTTON (obj), FALSE);
264
265   gtk_widget = GTK_ACCESSIBLE (obj)->widget;
266   if (gtk_widget == NULL)
267     return FALSE;
268
269   if (G_VALUE_HOLDS_DOUBLE (value))
270     {
271       gtk_scale_button_set_value (GTK_SCALE_BUTTON (gtk_widget), g_value_get_double (value));
272       return TRUE;
273     }
274   return FALSE;
275 }
276
277 static void
278 gail_scale_button_notify_gtk (GObject    *obj,
279                               GParamSpec *pspec)
280 {
281   GtkScaleButton *gtk_scale_button;
282   GailScaleButton *scale_button;
283
284   g_return_if_fail (GTK_IS_SCALE_BUTTON (obj));
285
286   gtk_scale_button = GTK_SCALE_BUTTON (obj);
287   scale_button = GAIL_SCALE_BUTTON (gtk_widget_get_accessible (GTK_WIDGET (gtk_scale_button)));
288
289   if (strcmp (pspec->name, "value") == 0)
290     {
291       g_object_notify (G_OBJECT (scale_button), "accessible-value");
292     }
293   else
294     {
295       GAIL_WIDGET_CLASS (gail_scale_button_parent_class)->notify_gtk (obj, pspec);
296     }
297 }
298
299