From: Matthias Clasen Date: Fri, 1 Jul 2011 15:41:45 +0000 (-0400) Subject: Convert GailRadio(Sub)MenuItem to GtkAccessible classes X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=64b959986611eea18cdf81237631601c54db9a15;p=~andy%2Fgtk Convert GailRadio(Sub)MenuItem to GtkAccessible classes The way submenus are handled here isn't really right, since they can come and go at runtime, but I've left it like this for now. A side-effect is that we can't use gtk_widget_class_set_accessible_type here, but have to override get_accessible. --- diff --git a/gtk/a11y/Makefile.am b/gtk/a11y/Makefile.am index 834a05eaa..a68d3c9b3 100644 --- a/gtk/a11y/Makefile.am +++ b/gtk/a11y/Makefile.am @@ -31,8 +31,8 @@ gail_c_sources = \ gtkpanedaccessible.c \ gtkprogressbaraccessible.c \ gtkradiobuttonaccessible.c \ - gailradiomenuitem.c \ - gailradiosubmenuitem.c \ + gtkradiomenuitemaccessible.c \ + gtkradiosubmenuitemaccessible.c \ gtkrangeaccessible.c \ gailrenderercell.c \ gtkscaleaccessible.c \ @@ -83,8 +83,8 @@ gail_private_h_sources = \ gtkpanedaccessible.h \ gtkprogressbaraccessible.h \ gtkradiobuttonaccessible.h \ - gailradiomenuitem.h \ - gailradiosubmenuitem.h \ + gtkradiomenuitemaccessible.h \ + gtkradiosubmenuitemaccesisble.h \ gtkrangeaccessible.h \ gailrenderercell.h \ gtkscaleaccessible.h \ diff --git a/gtk/a11y/gail.c b/gtk/a11y/gail.c index 623de9cfc..92b35007a 100644 --- a/gtk/a11y/gail.c +++ b/gtk/a11y/gail.c @@ -33,7 +33,6 @@ #include "gailmenu.h" #include "gailmenushell.h" #include "gailmenuitem.h" -#include "gailradiomenuitem.h" #include "gailrenderercell.h" #include "gailtextcell.h" #include "gailtoplevel.h" @@ -93,7 +92,6 @@ GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_MENU_SHELL, GailMenuShell, gail_menu_shell, GT GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_MENU, GailMenu, gail_menu, GTK_TYPE_MENU) GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_WINDOW, GailWindow, gail_window, GTK_TYPE_BIN) GAIL_IMPLEMENT_FACTORY_WITH_FUNC (GAIL_TYPE_CHECK_MENU_ITEM, GailCheckMenuItem, gail_check_menu_item, gail_check_menu_item_new) -GAIL_IMPLEMENT_FACTORY_WITH_FUNC (GAIL_TYPE_RADIO_MENU_ITEM, GailRadioMenuItem, gail_radio_menu_item, gail_radio_menu_item_new) GAIL_IMPLEMENT_FACTORY_WITH_FUNC_DUMMY (GAIL_TYPE_RENDERER_CELL, GailRendererCell, gail_renderer_cell, GTK_TYPE_CELL_RENDERER, gail_renderer_cell_new) GAIL_IMPLEMENT_FACTORY_WITH_FUNC_DUMMY (GAIL_TYPE_BOOLEAN_CELL, GailBooleanCell, gail_boolean_cell, GTK_TYPE_CELL_RENDERER_TOGGLE, gail_boolean_cell_new) GAIL_IMPLEMENT_FACTORY_WITH_FUNC_DUMMY (GAIL_TYPE_IMAGE_CELL, GailImageCell, gail_image_cell, GTK_TYPE_CELL_RENDERER_PIXBUF, gail_image_cell_new) @@ -850,7 +848,6 @@ gail_accessibility_module_init (void) GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CELL_RENDERER_PIXBUF, gail_image_cell); GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CELL_RENDERER, gail_renderer_cell); GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CHECK_MENU_ITEM, gail_check_menu_item); - GAIL_WIDGET_SET_FACTORY (GTK_TYPE_RADIO_MENU_ITEM, gail_radio_menu_item); atk_focus_tracker_init (gail_focus_tracker_init); focus_tracker_id = atk_add_focus_tracker (gail_focus_tracker); diff --git a/gtk/a11y/gailradiomenuitem.c b/gtk/a11y/gailradiomenuitem.c deleted file mode 100644 index e7913466f..000000000 --- a/gtk/a11y/gailradiomenuitem.c +++ /dev/null @@ -1,139 +0,0 @@ -/* GAIL - The GNOME Accessibility Implementation Library - * Copyright 2002 Sun Microsystems Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include -#include "gailradiomenuitem.h" -#include "gailradiosubmenuitem.h" - -static void gail_radio_menu_item_class_init (GailRadioMenuItemClass *klass); -static void gail_radio_menu_item_init (GailRadioMenuItem *radio_menu_item); - -static AtkRelationSet* gail_radio_menu_item_ref_relation_set (AtkObject *obj); - -G_DEFINE_TYPE (GailRadioMenuItem, gail_radio_menu_item, GAIL_TYPE_CHECK_MENU_ITEM) - -static void -gail_radio_menu_item_class_init (GailRadioMenuItemClass *klass) -{ - AtkObjectClass *class = ATK_OBJECT_CLASS (klass); - - class->ref_relation_set = gail_radio_menu_item_ref_relation_set; -} - -AtkObject* -gail_radio_menu_item_new (GtkWidget *widget) -{ - GObject *object; - AtkObject *accessible; - - g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (widget), NULL); - - if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget))) - return gail_radio_sub_menu_item_new (widget); - - object = g_object_new (GAIL_TYPE_RADIO_MENU_ITEM, NULL); - - accessible = ATK_OBJECT (object); - atk_object_initialize (accessible, widget); - - accessible->role = ATK_ROLE_RADIO_MENU_ITEM; - return accessible; -} - -static void -gail_radio_menu_item_init (GailRadioMenuItem *radio_menu_item) -{ - radio_menu_item->old_group = NULL; -} - -AtkRelationSet* -gail_radio_menu_item_ref_relation_set (AtkObject *obj) -{ - GtkWidget *widget; - AtkRelationSet *relation_set; - GSList *list; - GailRadioMenuItem *radio_menu_item; - - g_return_val_if_fail (GAIL_IS_RADIO_MENU_ITEM (obj), NULL); - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)); - if (widget == NULL) - { - /* - * State is defunct - */ - return NULL; - } - radio_menu_item = GAIL_RADIO_MENU_ITEM (obj); - - relation_set = ATK_OBJECT_CLASS (gail_radio_menu_item_parent_class)->ref_relation_set (obj); - - /* - * If the radio menu_item'group has changed remove the relation - */ - list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget)); - - if (radio_menu_item->old_group != list) - { - AtkRelation *relation; - - relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_MEMBER_OF); - atk_relation_set_remove (relation_set, relation); - } - - if (!atk_relation_set_contains (relation_set, ATK_RELATION_MEMBER_OF)) - { - /* - * Get the members of the menu_item group - */ - - radio_menu_item->old_group = list; - if (list) - { - AtkObject **accessible_array; - guint list_length; - AtkRelation* relation; - gint i = 0; - - list_length = g_slist_length (list); - accessible_array = (AtkObject**) g_malloc (sizeof (AtkObject *) * - list_length); - while (list != NULL) - { - GtkWidget* list_item = list->data; - - accessible_array[i++] = gtk_widget_get_accessible (list_item); - - list = list->next; - } - relation = atk_relation_new (accessible_array, list_length, - ATK_RELATION_MEMBER_OF); - g_free (accessible_array); - - atk_relation_set_add (relation_set, relation); - /* - * Unref the relation so that it is not leaked. - */ - g_object_unref (relation); - } - } - return relation_set; -} diff --git a/gtk/a11y/gailradiomenuitem.h b/gtk/a11y/gailradiomenuitem.h deleted file mode 100644 index 0fde2e69b..000000000 --- a/gtk/a11y/gailradiomenuitem.h +++ /dev/null @@ -1,55 +0,0 @@ -/* GAIL - The GNOME Accessibility Implementation Library - * Copyright 2002 Sun Microsystems Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GAIL_RADIO_MENU_ITEM_H__ -#define __GAIL_RADIO_MENU_ITEM_H__ - -#include "gailcheckmenuitem.h" - -G_BEGIN_DECLS - -#define GAIL_TYPE_RADIO_MENU_ITEM (gail_radio_menu_item_get_type ()) -#define GAIL_RADIO_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAIL_TYPE_RADIO_MENU_ITEM, GailRadioMenuItem)) -#define GAIL_RADIO_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAIL_TYPE_RADIO_MENU_ITEM, GailRadioMenuItemClass)) -#define GAIL_IS_RADIO_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAIL_TYPE_RADIO_MENU_ITEM)) -#define GAIL_IS_RADIO_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAIL_TYPE_RADIO_MENU_ITEM)) -#define GAIL_RADIO_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GAIL_TYPE_RADIO_MENU_ITEM, GailRadioMenuItemClass)) - -typedef struct _GailRadioMenuItem GailRadioMenuItem; -typedef struct _GailRadioMenuItemClass GailRadioMenuItemClass; - -struct _GailRadioMenuItem -{ - GailCheckMenuItem parent; - - GSList *old_group; -}; - -GType gail_radio_menu_item_get_type (void); - -struct _GailRadioMenuItemClass -{ - GailCheckMenuItemClass parent_class; -}; - -AtkObject* gail_radio_menu_item_new (GtkWidget *widget); - -G_END_DECLS - -#endif /* __GAIL_RADIO_MENU_ITEM_H__ */ diff --git a/gtk/a11y/gailradiosubmenuitem.c b/gtk/a11y/gailradiosubmenuitem.c deleted file mode 100644 index 9360f8f41..000000000 --- a/gtk/a11y/gailradiosubmenuitem.c +++ /dev/null @@ -1,135 +0,0 @@ -/* GAIL - The GNOME Accessibility Implementation Library - * Copyright 2002 Sun Microsystems Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include -#include "gailradiosubmenuitem.h" - -static void gail_radio_sub_menu_item_class_init (GailRadioSubMenuItemClass *klass); -static void gail_radio_sub_menu_item_init (GailRadioSubMenuItem *radio_menu_item); - -static AtkRelationSet* gail_radio_sub_menu_item_ref_relation_set (AtkObject *obj); - -G_DEFINE_TYPE (GailRadioSubMenuItem, gail_radio_sub_menu_item, GAIL_TYPE_CHECK_SUB_MENU_ITEM) - -static void -gail_radio_sub_menu_item_class_init (GailRadioSubMenuItemClass *klass) -{ - AtkObjectClass *class = ATK_OBJECT_CLASS (klass); - - class->ref_relation_set = gail_radio_sub_menu_item_ref_relation_set; -} - -AtkObject* -gail_radio_sub_menu_item_new (GtkWidget *widget) -{ - GObject *object; - AtkObject *accessible; - - g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (widget), NULL); - - object = g_object_new (GAIL_TYPE_RADIO_SUB_MENU_ITEM, NULL); - - accessible = ATK_OBJECT (object); - atk_object_initialize (accessible, widget); - - accessible->role = ATK_ROLE_RADIO_MENU_ITEM; - return accessible; -} - -static void -gail_radio_sub_menu_item_init (GailRadioSubMenuItem *radio_menu_item) -{ - radio_menu_item->old_group = NULL; -} - -AtkRelationSet* -gail_radio_sub_menu_item_ref_relation_set (AtkObject *obj) -{ - GtkWidget *widget; - AtkRelationSet *relation_set; - GSList *list; - GailRadioSubMenuItem *radio_menu_item; - - g_return_val_if_fail (GAIL_IS_RADIO_SUB_MENU_ITEM (obj), NULL); - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)); - if (widget == NULL) - { - /* - * State is defunct - */ - return NULL; - } - radio_menu_item = GAIL_RADIO_SUB_MENU_ITEM (obj); - - relation_set = ATK_OBJECT_CLASS (gail_radio_sub_menu_item_parent_class)->ref_relation_set (obj); - - /* - * If the radio menu_item'group has changed remove the relation - */ - list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget)); - - if (radio_menu_item->old_group != list) - { - AtkRelation *relation; - - relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_MEMBER_OF); - atk_relation_set_remove (relation_set, relation); - } - - if (!atk_relation_set_contains (relation_set, ATK_RELATION_MEMBER_OF)) - { - /* - * Get the members of the menu_item group - */ - - radio_menu_item->old_group = list; - if (list) - { - AtkObject **accessible_array; - guint list_length; - AtkRelation* relation; - gint i = 0; - - list_length = g_slist_length (list); - accessible_array = (AtkObject**) g_malloc (sizeof (AtkObject *) * - list_length); - while (list != NULL) - { - GtkWidget* list_item = list->data; - - accessible_array[i++] = gtk_widget_get_accessible (list_item); - - list = list->next; - } - relation = atk_relation_new (accessible_array, list_length, - ATK_RELATION_MEMBER_OF); - g_free (accessible_array); - - atk_relation_set_add (relation_set, relation); - /* - * Unref the relation so that it is not leaked. - */ - g_object_unref (relation); - } - } - return relation_set; -} diff --git a/gtk/a11y/gailradiosubmenuitem.h b/gtk/a11y/gailradiosubmenuitem.h deleted file mode 100644 index 3d78b45e6..000000000 --- a/gtk/a11y/gailradiosubmenuitem.h +++ /dev/null @@ -1,55 +0,0 @@ -/* GAIL - The GNOME Accessibility Implementation Library - * Copyright 2002 Sun Microsystems Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GAIL_RADIO_SUB_MENU_ITEM_H__ -#define __GAIL_RADIO_SUB_MENU_ITEM_H__ - -#include "gailchecksubmenuitem.h" - -G_BEGIN_DECLS - -#define GAIL_TYPE_RADIO_SUB_MENU_ITEM (gail_radio_sub_menu_item_get_type ()) -#define GAIL_RADIO_SUB_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAIL_TYPE_RADIO_SUB_MENU_ITEM, GailRadioSubMenuItem)) -#define GAIL_RADIO_SUB_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAIL_TYPE_RADIO_SUB_MENU_ITEM, GailRadioSubMenuItemClass)) -#define GAIL_IS_RADIO_SUB_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAIL_TYPE_RADIO_SUB_MENU_ITEM)) -#define GAIL_IS_RADIO_SUB_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAIL_TYPE_RADIO_SUB_MENU_ITEM)) -#define GAIL_RADIO_SUB_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GAIL_TYPE_RADIO_SUB_MENU_ITEM, GailRadioSubMenuItemClass)) - -typedef struct _GailRadioSubMenuItem GailRadioSubMenuItem; -typedef struct _GailRadioSubMenuItemClass GailRadioSubMenuItemClass; - -struct _GailRadioSubMenuItem -{ - GailCheckSubMenuItem parent; - - GSList *old_group; -}; - -GType gail_radio_sub_menu_item_get_type (void); - -struct _GailRadioSubMenuItemClass -{ - GailCheckSubMenuItemClass parent_class; -}; - -AtkObject* gail_radio_sub_menu_item_new (GtkWidget *widget); - -G_END_DECLS - -#endif /* __GAIL_RADIO_SUB_MENU_ITEM_H__ */ diff --git a/gtk/a11y/gtkradiomenuitemaccessible.c b/gtk/a11y/gtkradiomenuitemaccessible.c new file mode 100644 index 000000000..330fd9bb2 --- /dev/null +++ b/gtk/a11y/gtkradiomenuitemaccessible.c @@ -0,0 +1,102 @@ +/* GAIL - The GNOME Accessibility Implementation Library + * Copyright 2002 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include "gtkradiomenuitemaccessible.h" +#include "gtkradiosubmenuitemaccessible.h" + + +G_DEFINE_TYPE (GtkRadioMenuItemAccessible, gtk_radio_menu_item_accessible, GAIL_TYPE_CHECK_MENU_ITEM) + +AtkRelationSet * +gtk_radio_menu_item_accessible_ref_relation_set (AtkObject *obj) +{ + GtkWidget *widget; + AtkRelationSet *relation_set; + GSList *list; + GtkRadioMenuItemAccessible *radio_menu_item; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)); + if (widget == NULL) + return NULL; + + radio_menu_item = GTK_RADIO_MENU_ITEM_ACCESSIBLE (obj); + + relation_set = ATK_OBJECT_CLASS (gtk_radio_menu_item_accessible_parent_class)->ref_relation_set (obj); + + /* If the radio menu_item'group has changed remove the relation */ + list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget)); + if (radio_menu_item->old_group != list) + { + AtkRelation *relation; + + relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_MEMBER_OF); + atk_relation_set_remove (relation_set, relation); + } + + if (!atk_relation_set_contains (relation_set, ATK_RELATION_MEMBER_OF)) + { + /* Get the members of the menu_item group */ + + radio_menu_item->old_group = list; + if (list) + { + AtkObject **accessible_array; + guint list_length; + AtkRelation* relation; + gint i = 0; + + list_length = g_slist_length (list); + accessible_array = g_new (AtkObject *, list_length); + while (list != NULL) + { + GtkWidget* list_item = list->data; + + accessible_array[i++] = gtk_widget_get_accessible (list_item); + + list = list->next; + } + relation = atk_relation_new (accessible_array, list_length, + ATK_RELATION_MEMBER_OF); + g_free (accessible_array); + + atk_relation_set_add (relation_set, relation); + + /* Unref the relation so that it is not leaked */ + g_object_unref (relation); + } + } + + return relation_set; +} + +static void +gtk_radio_menu_item_accessible_class_init (GtkRadioMenuItemAccessibleClass *klass) +{ + AtkObjectClass *class = ATK_OBJECT_CLASS (klass); + + class->ref_relation_set = gtk_radio_menu_item_accessible_ref_relation_set; +} + +static void +gtk_radio_menu_item_accessible_init (GtkRadioMenuItemAccessible *radio_menu_item) +{ +} diff --git a/gtk/a11y/gtkradiomenuitemaccessible.h b/gtk/a11y/gtkradiomenuitemaccessible.h new file mode 100644 index 000000000..2efcf0a2e --- /dev/null +++ b/gtk/a11y/gtkradiomenuitemaccessible.h @@ -0,0 +1,53 @@ +/* GAIL - The GNOME Accessibility Implementation Library + * Copyright 2002 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GTK_RADIO_MENU_ITEM_ACCESSIBLE_H__ +#define __GTK_RADIO_MENU_ITEM_ACCESSIBLE_H__ + +#include "gailcheckmenuitem.h" + +G_BEGIN_DECLS + +#define GTK_TYPE_RADIO_MENU_ITEM_ACCESSIBLE (gtk_radio_menu_item_accessible_get_type ()) +#define GTK_RADIO_MENU_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_RADIO_MENU_ITEM_ACCESSIBLE, GtkRadioMenuItemAccessible)) +#define GTK_RADIO_MENU_ITEM_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_RADIO_MENU_ITEM_ACCESSIBLE, GtkRadioMenuItemAccessibleClass)) +#define GTK_IS_RADIO_MENU_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_RADIO_MENU_ITEM_ACCESSIBLE)) +#define GTK_IS_RADIO_MENU_ITEM_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_RADIO_MENU_ITEM_ACCESSIBLE)) +#define GTK_RADIO_MENU_ITEM_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_RADIO_MENU_ITEM_ACCESSIBLE, GtkRadioMenuItemAccessibleClass)) + +typedef struct _GtkRadioMenuItemAccessible GtkRadioMenuItemAccessible; +typedef struct _GtkRadioMenuItemAccessibleClass GtkRadioMenuItemAccessibleClass; + +struct _GtkRadioMenuItemAccessible +{ + GailCheckMenuItem parent; + + GSList *old_group; +}; + +struct _GtkRadioMenuItemAccessibleClass +{ + GailCheckMenuItemClass parent_class; +}; + +GType gtk_radio_menu_item_accessible_get_type (void); + +G_END_DECLS + +#endif /* __GTK_RADIO_MENU_ITEM_ACCESSIBLE_H__ */ diff --git a/gtk/a11y/gtkradiosubmenuitemaccessible.c b/gtk/a11y/gtkradiosubmenuitemaccessible.c new file mode 100644 index 000000000..27e76ebab --- /dev/null +++ b/gtk/a11y/gtkradiosubmenuitemaccessible.c @@ -0,0 +1,102 @@ +/* GAIL - The GNOME Accessibility Implementation Library + * Copyright 2002 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include "gtkradiosubmenuitemaccessible.h" + + +G_DEFINE_TYPE (GtkRadioSubmenuItemAccessible, gtk_radio_submenu_item_accessible, GAIL_TYPE_CHECK_SUB_MENU_ITEM) + + +AtkRelationSet * +gtk_radio_submenu_item_accessible_ref_relation_set (AtkObject *obj) +{ + GtkWidget *widget; + AtkRelationSet *relation_set; + GSList *list; + GtkRadioSubmenuItemAccessible *radio_menu_item; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)); + if (widget == NULL) + return NULL; + + radio_menu_item = GTK_RADIO_SUBMENU_ITEM_ACCESSIBLE (obj); + + relation_set = ATK_OBJECT_CLASS (gtk_radio_submenu_item_accessible_parent_class)->ref_relation_set (obj); + + /* If the radio menu_item's group has changed remove the relation */ + list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget)); + + if (radio_menu_item->old_group != list) + { + AtkRelation *relation; + + relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_MEMBER_OF); + atk_relation_set_remove (relation_set, relation); + } + + if (!atk_relation_set_contains (relation_set, ATK_RELATION_MEMBER_OF)) + { + /* Get the members of the menu_item group */ + radio_menu_item->old_group = list; + if (list) + { + AtkObject **accessible_array; + guint list_length; + AtkRelation* relation; + gint i = 0; + + list_length = g_slist_length (list); + accessible_array = g_new (AtkObject *, list_length); + while (list != NULL) + { + GtkWidget* list_item = list->data; + + accessible_array[i++] = gtk_widget_get_accessible (list_item); + + list = list->next; + } + relation = atk_relation_new (accessible_array, list_length, + ATK_RELATION_MEMBER_OF); + g_free (accessible_array); + + atk_relation_set_add (relation_set, relation); + + /* Unref the relation so that it is not leaked */ + g_object_unref (relation); + } + } + + return relation_set; +} +static void +gtk_radio_submenu_item_accessible_class_init (GtkRadioSubmenuItemAccessibleClass *klass) +{ + AtkObjectClass *class = ATK_OBJECT_CLASS (klass); + + class->ref_relation_set = gtk_radio_submenu_item_accessible_ref_relation_set; +} + +static void +gtk_radio_submenu_item_accessible_init (GtkRadioSubmenuItemAccessible *radio_menu_item) +{ + radio_menu_item->old_group = NULL; +} diff --git a/gtk/a11y/gtkradiosubmenuitemaccessible.h b/gtk/a11y/gtkradiosubmenuitemaccessible.h new file mode 100644 index 000000000..f614df3ff --- /dev/null +++ b/gtk/a11y/gtkradiosubmenuitemaccessible.h @@ -0,0 +1,53 @@ +/* GAIL - The GNOME Accessibility Implementation Library + * Copyright 2002 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GTK_RADIO_SUBMENU_ITEM_ACCESSIBLE_H__ +#define __GTK_RADIO_SUBMENU_ITEM_ACCESSIBLE_H__ + +#include "gailchecksubmenuitem.h" + +G_BEGIN_DECLS + +#define GTK_TYPE_RADIO_SUBMENU_ITEM_ACCESSIBLE (gtk_radio_submenu_item_accessible_get_type ()) +#define GTK_RADIO_SUBMENU_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_RADIO_SUBMENU_ITEM_ACCESSIBLE, GtkRadioSubmenuItemAccessible)) +#define GTK_RADIO_SUBMENU_ITEM_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_RADIO_SUBMENU_ITEM_ACCESSIBLE, GtkRadioSubmenuItemAccessibleClass)) +#define GTK_IS_RADIO_SUBMENU_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_RADIO_SUBMENU_ITEM_ACCESSIBLE)) +#define GTK_IS_RADIO_SUBMENU_ITEM_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_RADIO_SUBMENU_ITEM_ACCESSIBLE)) +#define GTK_RADIO_SUBMENU_ITEM_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_RADIO_SUBMENU_ITEM_ACCESSIBLE, GtkRadioSubmenuItemAccessibleClass)) + +typedef struct _GtkRadioSubmenuItemAccessible GtkRadioSubmenuItemAccessible; +typedef struct _GtkRadioSubmenuItemAccessibleClass GtkRadioSubmenuItemAccessibleClass; + +struct _GtkRadioSubmenuItemAccessible +{ + GailCheckSubMenuItem parent; + + GSList *old_group; +}; + +struct _GtkRadioSubmenuItemAccessibleClass +{ + GailCheckSubMenuItemClass parent_class; +}; + +GType gtk_radio_submenu_item_accessible_get_type (void); + +G_END_DECLS + +#endif /* __GTK_RADIO_SUBMENU_ITEM_ACCESSIBLE_H__ */ diff --git a/gtk/gtkradiomenuitem.c b/gtk/gtkradiomenuitem.c index 848c2a764..af2ab5f52 100644 --- a/gtk/gtkradiomenuitem.c +++ b/gtk/gtkradiomenuitem.c @@ -31,7 +31,8 @@ #include "gtkactivatable.h" #include "gtkprivate.h" #include "gtkintl.h" - +#include "a11y/gtkradiomenuitemaccessible.h" +#include "a11y/gtkradiosubmenuitemaccessible.h" /** * SECTION:gtkradiomenuitem @@ -393,11 +394,30 @@ gtk_radio_menu_item_get_group (GtkRadioMenuItem *radio_menu_item) return radio_menu_item->priv->group; } +static AtkObject * +gtk_radio_menu_item_get_accessible (GtkWidget *widget) +{ + GObject *object; + AtkObject *accessible; + + /* FIXME this is not really right, submenus can come and go */ + if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget))) + object = g_object_new (GTK_TYPE_RADIO_SUBMENU_ITEM_ACCESSIBLE, NULL); + else + object = g_object_new (GTK_TYPE_RADIO_MENU_ITEM_ACCESSIBLE, NULL); + + accessible = ATK_OBJECT (object); + atk_object_initialize (accessible, widget); + + accessible->role = ATK_ROLE_RADIO_MENU_ITEM; + + return accessible; +} static void gtk_radio_menu_item_class_init (GtkRadioMenuItemClass *klass) { - GObjectClass *gobject_class; + GObjectClass *gobject_class; GtkWidgetClass *widget_class; GtkMenuItemClass *menu_item_class; @@ -409,6 +429,7 @@ gtk_radio_menu_item_class_init (GtkRadioMenuItemClass *klass) gobject_class->get_property = gtk_radio_menu_item_get_property; widget_class->destroy = gtk_radio_menu_item_destroy; + widget_class->get_accessible = gtk_radio_menu_item_get_accessible; menu_item_class->activate = gtk_radio_menu_item_activate;