[gtk+/a11y] Convert GailRadio(Sub)MenuItem to GtkAccessible classes



commit d6f1c9f5eea166921d6a00046dc1c809c0cc04c8
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jul 1 11:41:45 2011 -0400

    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.

 gtk/a11y/Makefile.am                     |    8 +-
 gtk/a11y/gail.c                          |    3 -
 gtk/a11y/gailradiomenuitem.c             |  139 ------------------------------
 gtk/a11y/gailradiomenuitem.h             |   55 ------------
 gtk/a11y/gailradiosubmenuitem.c          |  135 -----------------------------
 gtk/a11y/gailradiosubmenuitem.h          |   55 ------------
 gtk/a11y/gtkradiomenuitemaccessible.c    |  102 ++++++++++++++++++++++
 gtk/a11y/gtkradiomenuitemaccessible.h    |   53 +++++++++++
 gtk/a11y/gtkradiosubmenuitemaccessible.c |  102 ++++++++++++++++++++++
 gtk/a11y/gtkradiosubmenuitemaccessible.h |   53 +++++++++++
 gtk/gtkradiomenuitem.c                   |   25 +++++-
 11 files changed, 337 insertions(+), 393 deletions(-)
---
diff --git a/gtk/a11y/Makefile.am b/gtk/a11y/Makefile.am
index 834a05e..a68d3c9 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 623de9c..92b3500 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/gtkradiomenuitemaccessible.c b/gtk/a11y/gtkradiomenuitemaccessible.c
new file mode 100644
index 0000000..330fd9b
--- /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 <gtk/gtk.h>
+#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 0000000..2efcf0a
--- /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 0000000..27e76eb
--- /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 <gtk/gtk.h>
+#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 0000000..f614df3
--- /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 848c2a7..af2ab5f 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;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]