diff --git a/gtk/a11y/Makefile.am b/gtk/a11y/Makefile.am index 834a05eaa6..a68d3c9b3b 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 623de9cfc2..92b35007a1 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 e7913466fa..0000000000 --- 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 0fde2e69b5..0000000000 --- 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 9360f8f418..0000000000 --- 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 3d78b45e6f..0000000000 --- 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 0000000000..330fd9bb20 --- /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 0000000000..2efcf0a2e0 --- /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 0000000000..27e76ebab6 --- /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 0000000000..f614df3ffa --- /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 848c2a764f..af2ab5f525 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;