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, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #include "gtkexpanderaccessible.h"
25 static void atk_action_interface_init (AtkActionIface *iface);
27 G_DEFINE_TYPE_WITH_CODE (GtkExpanderAccessible, _gtk_expander_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
28 G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
31 gtk_expander_accessible_get_full_text (GtkExpander *widget)
33 GtkWidget *label_widget;
35 label_widget = gtk_expander_get_label_widget (widget);
37 if (!GTK_IS_LABEL (label_widget))
40 return gtk_label_get_text (GTK_LABEL (label_widget));
44 gtk_expander_accessible_get_name (AtkObject *obj)
49 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
53 name = ATK_OBJECT_CLASS (_gtk_expander_accessible_parent_class)->get_name (obj);
57 return gtk_expander_accessible_get_full_text (GTK_EXPANDER (widget));
61 gtk_expander_accessible_get_n_children (AtkObject *obj)
67 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
71 children = gtk_container_get_children (GTK_CONTAINER(widget));
72 count = g_list_length (children);
73 g_list_free (children);
75 /* See if there is a label - if there is, reduce our count by 1
76 * since we don't want the label included with the children.
78 if (gtk_expander_get_label_widget (GTK_EXPANDER (widget)))
85 gtk_expander_accessible_ref_child (AtkObject *obj,
88 GList *children, *tmp_list;
89 AtkObject *accessible;
94 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
98 children = gtk_container_get_children (GTK_CONTAINER (widget));
100 /* See if there is a label - if there is, we need to skip it
101 * since we don't want the label included with the children.
103 label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
106 for (index = 0; index <= i; index++)
108 tmp_list = g_list_nth (children, index);
109 if (label == GTK_WIDGET (tmp_list->data))
117 tmp_list = g_list_nth (children, i);
120 g_list_free (children);
123 accessible = gtk_widget_get_accessible (GTK_WIDGET (tmp_list->data));
125 g_list_free (children);
126 g_object_ref (accessible);
131 gtk_expander_accessible_initialize (AtkObject *obj,
134 ATK_OBJECT_CLASS (_gtk_expander_accessible_parent_class)->initialize (obj, data);
136 obj->role = ATK_ROLE_TOGGLE_BUTTON;
140 gtk_expander_accessible_notify_gtk (GObject *obj,
144 GtkExpander *expander;
146 expander = GTK_EXPANDER (obj);
147 atk_obj = gtk_widget_get_accessible (GTK_WIDGET (expander));
149 if (g_strcmp0 (pspec->name, "label") == 0)
151 if (atk_obj->name == NULL)
152 g_object_notify (G_OBJECT (atk_obj), "accessible-name");
153 g_signal_emit_by_name (atk_obj, "visible-data-changed");
155 else if (g_strcmp0 (pspec->name, "expanded") == 0)
157 atk_object_notify_state_change (atk_obj, ATK_STATE_CHECKED,
158 gtk_expander_get_expanded (expander));
159 atk_object_notify_state_change (atk_obj, ATK_STATE_EXPANDED,
160 gtk_expander_get_expanded (expander));
161 g_signal_emit_by_name (atk_obj, "visible-data-changed");
164 GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_expander_accessible_parent_class)->notify_gtk (obj, pspec);
168 gtk_expander_accessible_ref_state_set (AtkObject *obj)
170 AtkStateSet *state_set;
172 GtkExpander *expander;
174 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
178 state_set = ATK_OBJECT_CLASS (_gtk_expander_accessible_parent_class)->ref_state_set (obj);
180 expander = GTK_EXPANDER (widget);
182 atk_state_set_add_state (state_set, ATK_STATE_EXPANDABLE);
184 if (gtk_expander_get_expanded (expander))
186 atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
187 atk_state_set_add_state (state_set, ATK_STATE_EXPANDED);
194 _gtk_expander_accessible_class_init (GtkExpanderAccessibleClass *klass)
196 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
197 GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
199 widget_class->notify_gtk = gtk_expander_accessible_notify_gtk;
201 class->get_name = gtk_expander_accessible_get_name;
202 class->get_n_children = gtk_expander_accessible_get_n_children;
203 class->ref_child = gtk_expander_accessible_ref_child;
204 class->ref_state_set = gtk_expander_accessible_ref_state_set;
206 class->initialize = gtk_expander_accessible_initialize;
210 _gtk_expander_accessible_init (GtkExpanderAccessible *expander)
215 gtk_expander_accessible_do_action (AtkAction *action,
220 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
224 if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
230 gtk_widget_activate (widget);
235 gtk_expander_accessible_get_n_actions (AtkAction *action)
241 gtk_expander_accessible_get_keybinding (AtkAction *action,
244 gchar *return_value = NULL;
248 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
255 label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
256 if (GTK_IS_LABEL (label))
260 key_val = gtk_label_get_mnemonic_keyval (GTK_LABEL (label));
261 if (key_val != GDK_KEY_VoidSymbol)
262 return_value = gtk_accelerator_name (key_val, GDK_MOD1_MASK);
269 gtk_expander_accessible_action_get_name (AtkAction *action,
279 atk_action_interface_init (AtkActionIface *iface)
281 iface->do_action = gtk_expander_accessible_do_action;
282 iface->get_n_actions = gtk_expander_accessible_get_n_actions;
283 iface->get_keybinding = gtk_expander_accessible_get_keybinding;
284 iface->get_name = gtk_expander_accessible_action_get_name;