]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtkspinbuttonaccessible.c
Merge branch 'bgo593793-filechooser-recent-folders-master'
[~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, "value-changed",
77                         G_CALLBACK (gtk_spin_button_accessible_value_changed),
78                         spin_button);
79     }
80   else
81     GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_spin_button_accessible_parent_class)->notify_gtk (obj, pspec);
82 }
83
84
85
86 static void
87 _gtk_spin_button_accessible_class_init (GtkSpinButtonAccessibleClass *klass)
88 {
89   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
90   GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
91
92   widget_class->notify_gtk = gtk_spin_button_accessible_notify_gtk;
93
94   class->initialize = gtk_spin_button_accessible_initialize;
95 }
96
97 static void
98 _gtk_spin_button_accessible_init (GtkSpinButtonAccessible *button)
99 {
100 }
101
102 static void
103 gtk_spin_button_accessible_get_current_value (AtkValue *obj,
104                                               GValue   *value)
105 {
106   GtkWidget *widget;
107   GtkAdjustment *adjustment;
108
109   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
110   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
111   if (adjustment == NULL)
112     return;
113
114   memset (value,  0, sizeof (GValue));
115   g_value_init (value, G_TYPE_DOUBLE);
116   g_value_set_double (value, gtk_adjustment_get_value (adjustment));
117 }
118
119 static void
120 gtk_spin_button_accessible_get_maximum_value (AtkValue *obj,
121                                               GValue   *value)
122 {
123   GtkWidget *widget;
124   GtkAdjustment *adjustment;
125
126   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
127   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
128   if (adjustment == NULL)
129     return;
130
131   memset (value,  0, sizeof (GValue));
132   g_value_init (value, G_TYPE_DOUBLE);
133   g_value_set_double (value, gtk_adjustment_get_upper (adjustment));
134 }
135
136 static void
137 gtk_spin_button_accessible_get_minimum_value (AtkValue *obj,
138                                               GValue   *value)
139 {
140   GtkWidget *widget;
141   GtkAdjustment *adjustment;
142
143   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
144   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
145   if (adjustment == NULL)
146     return;
147
148   memset (value,  0, sizeof (GValue));
149   g_value_init (value, G_TYPE_DOUBLE);
150   g_value_set_double (value, gtk_adjustment_get_lower (adjustment));
151 }
152
153 static void
154 gtk_spin_button_accessible_get_minimum_increment (AtkValue *obj,
155                                                   GValue   *value)
156 {
157   GtkWidget *widget;
158   GtkAdjustment *adjustment;
159
160   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
161   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
162   if (adjustment == NULL)
163     return;
164
165   memset (value,  0, sizeof (GValue));
166   g_value_init (value, G_TYPE_DOUBLE);
167   g_value_set_double (value, gtk_adjustment_get_minimum_increment (adjustment));
168 }
169
170 static gboolean
171 gtk_spin_button_accessible_set_current_value (AtkValue     *obj,
172                                               const GValue *value)
173 {
174   GtkWidget *widget;
175   GtkAdjustment *adjustment;
176
177   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
178   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
179   if (adjustment == NULL)
180     return FALSE;
181
182   gtk_adjustment_set_value (adjustment, g_value_get_double (value));
183
184   return TRUE;
185 }
186
187 static void
188 atk_value_interface_init (AtkValueIface *iface)
189 {
190   iface->get_current_value = gtk_spin_button_accessible_get_current_value;
191   iface->get_maximum_value = gtk_spin_button_accessible_get_maximum_value;
192   iface->get_minimum_value = gtk_spin_button_accessible_get_minimum_value;
193   iface->get_minimum_increment = gtk_spin_button_accessible_get_minimum_increment;
194   iface->set_current_value = gtk_spin_button_accessible_set_current_value;
195 }