]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtkspinbuttonaccessible.c
Merge bgo593793-filechooser-recent-folders-master branch.
[~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, 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 <string.h>
23 #include <gtk/gtk.h>
24 #include "gtkspinbuttonaccessible.h"
25
26
27 static void atk_value_interface_init (AtkValueIface *iface);
28
29 G_DEFINE_TYPE_WITH_CODE (GtkSpinButtonAccessible, gtk_spin_button_accessible, GTK_TYPE_ENTRY_ACCESSIBLE,
30                          G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, atk_value_interface_init))
31
32 static void
33 gtk_spin_button_accessible_value_changed (GtkAdjustment *adjustment,
34                                           gpointer       data)
35 {
36   GtkSpinButtonAccessible *spin_button;
37
38   if (adjustment == NULL || data == NULL)
39     return;
40
41   spin_button = GTK_SPIN_BUTTON_ACCESSIBLE (data);
42
43   g_object_notify (G_OBJECT (spin_button), "accessible-value");
44 }
45
46 static void
47 gtk_spin_button_accessible_initialize (AtkObject *obj,
48                                        gpointer  data)
49 {
50   GtkAdjustment *adjustment;
51
52   ATK_OBJECT_CLASS (gtk_spin_button_accessible_parent_class)->initialize (obj, data);
53
54   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (data));
55   if (adjustment)
56     g_signal_connect (adjustment,
57                       "value-changed",
58                       G_CALLBACK (gtk_spin_button_accessible_value_changed),
59                       obj);
60
61   obj->role = ATK_ROLE_SPIN_BUTTON;
62 }
63
64 static void
65 gtk_spin_button_accessible_notify_gtk (GObject    *obj,
66                                        GParamSpec *pspec)
67 {
68   GtkWidget *widget = GTK_WIDGET (obj);
69   GtkSpinButtonAccessible *spin_button = GTK_SPIN_BUTTON_ACCESSIBLE (gtk_widget_get_accessible (widget));
70
71   if (strcmp (pspec->name, "adjustment") == 0)
72     {
73       GtkAdjustment* adjustment;
74
75       adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
76       g_signal_connect (adjustment,
77                         "value-changed",
78                         G_CALLBACK (gtk_spin_button_accessible_value_changed),
79                         spin_button);
80     }
81   else
82     GTK_WIDGET_ACCESSIBLE_CLASS (gtk_spin_button_accessible_parent_class)->notify_gtk (obj, pspec);
83 }
84
85
86
87 static void
88 gtk_spin_button_accessible_class_init (GtkSpinButtonAccessibleClass *klass)
89 {
90   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
91   GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
92
93   widget_class->notify_gtk = gtk_spin_button_accessible_notify_gtk;
94
95   class->initialize = gtk_spin_button_accessible_initialize;
96 }
97
98 static void
99 gtk_spin_button_accessible_init (GtkSpinButtonAccessible *button)
100 {
101 }
102
103 static void
104 gtk_spin_button_accessible_get_current_value (AtkValue *obj,
105                                               GValue   *value)
106 {
107   GtkWidget *widget;
108   GtkAdjustment *adjustment;
109
110   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
111   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
112   if (adjustment == NULL)
113     return;
114
115   memset (value,  0, sizeof (GValue));
116   g_value_init (value, G_TYPE_DOUBLE);
117   g_value_set_double (value, gtk_adjustment_get_value (adjustment));
118 }
119
120 static void
121 gtk_spin_button_accessible_get_maximum_value (AtkValue *obj,
122                                               GValue   *value)
123 {
124   GtkWidget *widget;
125   GtkAdjustment *adjustment;
126
127   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
128   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
129   if (adjustment == NULL)
130     return;
131
132   memset (value,  0, sizeof (GValue));
133   g_value_init (value, G_TYPE_DOUBLE);
134   g_value_set_double (value, gtk_adjustment_get_upper (adjustment));
135 }
136
137 static void
138 gtk_spin_button_accessible_get_minimum_value (AtkValue *obj,
139                                               GValue   *value)
140 {
141   GtkWidget *widget;
142   GtkAdjustment *adjustment;
143
144   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
145   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
146   if (adjustment == NULL)
147     return;
148
149   memset (value,  0, sizeof (GValue));
150   g_value_init (value, G_TYPE_DOUBLE);
151   g_value_set_double (value, gtk_adjustment_get_lower (adjustment));
152 }
153
154 static void
155 gtk_spin_button_accessible_get_minimum_increment (AtkValue *obj,
156                                                   GValue   *value)
157 {
158   GtkWidget *widget;
159   GtkAdjustment *adjustment;
160
161   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
162   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
163   if (adjustment == NULL)
164     return;
165
166   memset (value,  0, sizeof (GValue));
167   g_value_init (value, G_TYPE_DOUBLE);
168   g_value_set_double (value, gtk_adjustment_get_minimum_increment (adjustment));
169 }
170
171 static gboolean
172 gtk_spin_button_accessible_set_current_value (AtkValue     *obj,
173                                               const GValue *value)
174 {
175   GtkWidget *widget;
176   GtkAdjustment *adjustment;
177
178   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
179   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
180   if (adjustment == NULL)
181     return FALSE;
182
183   gtk_adjustment_set_value (adjustment, g_value_get_double (value));
184
185   return TRUE;
186 }
187
188 static void
189 atk_value_interface_init (AtkValueIface *iface)
190 {
191   iface->get_current_value = gtk_spin_button_accessible_get_current_value;
192   iface->get_maximum_value = gtk_spin_button_accessible_get_maximum_value;
193   iface->get_minimum_value = gtk_spin_button_accessible_get_minimum_value;
194   iface->get_minimum_increment = gtk_spin_button_accessible_get_minimum_increment;
195   iface->set_current_value = gtk_spin_button_accessible_set_current_value;
196 }