1 /* GAIL - The GNOME Accessibility Implementation Library
2 * Copyright 2003 Sun Microsystems Inc.
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.
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.
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/>.
21 #include "gtkexpanderaccessible.h"
23 static void atk_action_interface_init (AtkActionIface *iface);
25 G_DEFINE_TYPE_WITH_CODE (GtkExpanderAccessible, _gtk_expander_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
26 G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
29 gtk_expander_accessible_get_full_text (GtkExpander *widget)
31 GtkWidget *label_widget;
33 label_widget = gtk_expander_get_label_widget (widget);
35 if (!GTK_IS_LABEL (label_widget))
38 return gtk_label_get_text (GTK_LABEL (label_widget));
42 gtk_expander_accessible_get_name (AtkObject *obj)
47 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
51 name = ATK_OBJECT_CLASS (_gtk_expander_accessible_parent_class)->get_name (obj);
55 return gtk_expander_accessible_get_full_text (GTK_EXPANDER (widget));
59 gtk_expander_accessible_get_n_children (AtkObject *obj)
65 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
69 children = gtk_container_get_children (GTK_CONTAINER(widget));
70 count = g_list_length (children);
71 g_list_free (children);
73 /* See if there is a label - if there is, reduce our count by 1
74 * since we don't want the label included with the children.
76 if (gtk_expander_get_label_widget (GTK_EXPANDER (widget)))
83 gtk_expander_accessible_ref_child (AtkObject *obj,
86 GList *children, *tmp_list;
87 AtkObject *accessible;
92 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
96 children = gtk_container_get_children (GTK_CONTAINER (widget));
98 /* See if there is a label - if there is, we need to skip it
99 * since we don't want the label included with the children.
101 label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
104 for (index = 0; index <= i; index++)
106 tmp_list = g_list_nth (children, index);
107 if (label == GTK_WIDGET (tmp_list->data))
115 tmp_list = g_list_nth (children, i);
118 g_list_free (children);
121 accessible = gtk_widget_get_accessible (GTK_WIDGET (tmp_list->data));
123 g_list_free (children);
124 g_object_ref (accessible);
129 gtk_expander_accessible_initialize (AtkObject *obj,
132 ATK_OBJECT_CLASS (_gtk_expander_accessible_parent_class)->initialize (obj, data);
134 obj->role = ATK_ROLE_TOGGLE_BUTTON;
138 gtk_expander_accessible_notify_gtk (GObject *obj,
142 GtkExpander *expander;
144 expander = GTK_EXPANDER (obj);
145 atk_obj = gtk_widget_get_accessible (GTK_WIDGET (expander));
147 if (g_strcmp0 (pspec->name, "label") == 0)
149 if (atk_obj->name == NULL)
150 g_object_notify (G_OBJECT (atk_obj), "accessible-name");
151 g_signal_emit_by_name (atk_obj, "visible-data-changed");
153 else if (g_strcmp0 (pspec->name, "expanded") == 0)
155 atk_object_notify_state_change (atk_obj, ATK_STATE_CHECKED,
156 gtk_expander_get_expanded (expander));
157 atk_object_notify_state_change (atk_obj, ATK_STATE_EXPANDED,
158 gtk_expander_get_expanded (expander));
159 g_signal_emit_by_name (atk_obj, "visible-data-changed");
162 GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_expander_accessible_parent_class)->notify_gtk (obj, pspec);
166 gtk_expander_accessible_ref_state_set (AtkObject *obj)
168 AtkStateSet *state_set;
170 GtkExpander *expander;
172 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
176 state_set = ATK_OBJECT_CLASS (_gtk_expander_accessible_parent_class)->ref_state_set (obj);
178 expander = GTK_EXPANDER (widget);
180 atk_state_set_add_state (state_set, ATK_STATE_EXPANDABLE);
182 if (gtk_expander_get_expanded (expander))
184 atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
185 atk_state_set_add_state (state_set, ATK_STATE_EXPANDED);
192 _gtk_expander_accessible_class_init (GtkExpanderAccessibleClass *klass)
194 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
195 GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
197 widget_class->notify_gtk = gtk_expander_accessible_notify_gtk;
199 class->get_name = gtk_expander_accessible_get_name;
200 class->get_n_children = gtk_expander_accessible_get_n_children;
201 class->ref_child = gtk_expander_accessible_ref_child;
202 class->ref_state_set = gtk_expander_accessible_ref_state_set;
204 class->initialize = gtk_expander_accessible_initialize;
208 _gtk_expander_accessible_init (GtkExpanderAccessible *expander)
213 gtk_expander_accessible_do_action (AtkAction *action,
218 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
222 if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
228 gtk_widget_activate (widget);
233 gtk_expander_accessible_get_n_actions (AtkAction *action)
239 gtk_expander_accessible_get_keybinding (AtkAction *action,
242 gchar *return_value = NULL;
246 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
253 label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
254 if (GTK_IS_LABEL (label))
258 key_val = gtk_label_get_mnemonic_keyval (GTK_LABEL (label));
259 if (key_val != GDK_KEY_VoidSymbol)
260 return_value = gtk_accelerator_name (key_val, GDK_MOD1_MASK);
267 gtk_expander_accessible_action_get_name (AtkAction *action,
277 atk_action_interface_init (AtkActionIface *iface)
279 iface->do_action = gtk_expander_accessible_do_action;
280 iface->get_n_actions = gtk_expander_accessible_get_n_actions;
281 iface->get_keybinding = gtk_expander_accessible_get_keybinding;
282 iface->get_name = gtk_expander_accessible_action_get_name;