1 /* GAIL - The GNOME Accessibility Implementation Library
2 * Copyright 2002, 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 "gtksubmenuitemaccessible.h"
25 static gint menu_item_add_gtk (GtkContainer *container,
27 static gint menu_item_remove_gtk (GtkContainer *container,
30 static void atk_selection_interface_init (AtkSelectionIface *iface);
32 G_DEFINE_TYPE_WITH_CODE (GtkSubmenuItemAccessible, _gtk_submenu_item_accessible, GTK_TYPE_MENU_ITEM_ACCESSIBLE,
33 G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, atk_selection_interface_init))
36 gtk_submenu_item_accessible_initialize (AtkObject *obj,
41 ATK_OBJECT_CLASS (_gtk_submenu_item_accessible_parent_class)->initialize (obj, data);
43 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (data));
46 g_signal_connect (submenu, "add", G_CALLBACK (menu_item_add_gtk), NULL);
47 g_signal_connect (submenu, "remove", G_CALLBACK (menu_item_remove_gtk), NULL);
52 _gtk_submenu_item_accessible_class_init (GtkSubmenuItemAccessibleClass *klass)
54 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
56 class->initialize = gtk_submenu_item_accessible_initialize;
60 _gtk_submenu_item_accessible_init (GtkSubmenuItemAccessible *item)
65 gtk_submenu_item_accessible_add_selection (AtkSelection *selection,
75 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
79 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
83 shell = GTK_MENU_SHELL (submenu);
84 kids = gtk_container_get_children (GTK_CONTAINER (shell));
85 length = g_list_length (kids);
86 if (i < 0 || i > length)
92 child = g_list_nth_data (kids, i);
94 g_return_val_if_fail (GTK_IS_MENU_ITEM (child), FALSE);
95 gtk_menu_shell_select_item (shell, GTK_WIDGET (child));
100 gtk_submenu_item_accessible_clear_selection (AtkSelection *selection)
105 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
109 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
113 gtk_menu_shell_deselect (GTK_MENU_SHELL (submenu));
119 gtk_submenu_item_accessible_ref_selection (AtkSelection *selection,
131 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
135 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
139 shell = GTK_MENU_SHELL (submenu);
141 item = gtk_menu_shell_get_selected_item (shell);
144 obj = gtk_widget_get_accessible (item);
153 gtk_submenu_item_accessible_get_selection_count (AtkSelection *selection)
159 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
163 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
167 shell = GTK_MENU_SHELL (submenu);
169 if (gtk_menu_shell_get_selected_item (shell) != NULL)
176 gtk_submenu_item_accessible_is_child_selected (AtkSelection *selection,
186 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
190 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
194 shell = GTK_MENU_SHELL (submenu);
196 item = gtk_menu_shell_get_selected_item (shell);
200 kids = gtk_container_get_children (GTK_CONTAINER (shell));
201 j = g_list_index (kids, item);
208 gtk_submenu_item_accessible_remove_selection (AtkSelection *selection,
219 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
223 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
227 shell = GTK_MENU_SHELL (submenu);
229 item = gtk_menu_shell_get_selected_item (shell);
230 if (item && gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)))
231 gtk_menu_shell_deselect (shell);
237 atk_selection_interface_init (AtkSelectionIface *iface)
239 iface->add_selection = gtk_submenu_item_accessible_add_selection;
240 iface->clear_selection = gtk_submenu_item_accessible_clear_selection;
241 iface->ref_selection = gtk_submenu_item_accessible_ref_selection;
242 iface->get_selection_count = gtk_submenu_item_accessible_get_selection_count;
243 iface->is_child_selected = gtk_submenu_item_accessible_is_child_selected;
244 iface->remove_selection = gtk_submenu_item_accessible_remove_selection;
248 menu_item_add_gtk (GtkContainer *container,
251 GtkWidget *parent_widget;
252 AtkObject *atk_parent;
253 AtkObject *atk_child;
254 GtkContainerAccessible *container_accessible;
257 g_return_val_if_fail (GTK_IS_MENU (container), 1);
259 parent_widget = gtk_menu_get_attach_widget (GTK_MENU (container));
260 if (GTK_IS_MENU_ITEM (parent_widget))
262 atk_parent = gtk_widget_get_accessible (parent_widget);
263 atk_child = gtk_widget_get_accessible (widget);
265 g_object_notify (G_OBJECT (atk_child), "accessible-parent");
266 container_accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
267 g_list_free (container_accessible->children);
268 container_accessible->children = gtk_container_get_children (container);
269 index = g_list_index (container_accessible->children, widget);
270 g_signal_emit_by_name (atk_parent, "children-changed::add",
271 index, atk_child, NULL);
277 menu_item_remove_gtk (GtkContainer *container,
280 GtkWidget *parent_widget;
281 AtkObject *atk_parent;
282 AtkObject *atk_child;
283 GtkContainerAccessible *container_accessible;
287 g_return_val_if_fail (GTK_IS_MENU (container), 1);
289 parent_widget = gtk_menu_get_attach_widget (GTK_MENU (container));
290 if (GTK_IS_MENU_ITEM (parent_widget))
292 atk_parent = gtk_widget_get_accessible (parent_widget);
293 atk_child = gtk_widget_get_accessible (widget);
295 g_object_notify (G_OBJECT (atk_child), "accessible-parent");
297 container_accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
298 index = g_list_index (container_accessible->children, widget);
299 list_length = g_list_length (container_accessible->children);
300 g_list_free (container_accessible->children);
301 container_accessible->children = gtk_container_get_children (container);
302 if (index >= 0 && index <= list_length)
303 g_signal_emit_by_name (atk_parent, "children-changed::remove",
304 index, atk_child, NULL);