]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtkmenuitemaccessible.c
filechooser: Show FUSE mounted locations in shortcuts
[~andy/gtk] / gtk / a11y / gtkmenuitemaccessible.c
index cd53e8af83d9c7f761a8e510a46f458fd0ca674e..15ef15dbed89d66bb8628254bd73fc8983ff3e4a 100644 (file)
@@ -1,4 +1,4 @@
-/* GAIL - The GNOME Accessibility Implementation Library
+/* GTK+ - accessibility implementations
  * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
  *
  * This library is free software; you can redistribute it and/or
  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
 #include <string.h>
 #include <gtk/gtk.h>
 #include "gtkmenuitemaccessible.h"
+#include "gtkwidgetaccessibleprivate.h"
 #include "gtk/gtkmenuitemprivate.h"
 
+struct _GtkMenuItemAccessiblePrivate
+{
+  gchar *text;
+  gboolean selected;
+};
+
 #define KEYBINDING_SEPARATOR ";"
 
 static void menu_item_select   (GtkMenuItem *item);
@@ -36,7 +46,7 @@ static gint menu_item_remove_gtk (GtkContainer   *container,
 static void atk_action_interface_init    (AtkActionIface *iface);
 static void atk_selection_interface_init (AtkSelectionIface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (GtkMenuItemAccessible, _gtk_menu_item_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
+G_DEFINE_TYPE_WITH_CODE (GtkMenuItemAccessible, gtk_menu_item_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init);
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, atk_selection_interface_init))
 
@@ -48,7 +58,7 @@ gtk_menu_item_accessible_initialize (AtkObject *obj,
   GtkWidget *parent;
   GtkWidget *menu;
 
-  ATK_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->initialize (obj, data);
+  ATK_OBJECT_CLASS (gtk_menu_item_accessible_parent_class)->initialize (obj, data);
 
   g_signal_connect (data, "select", G_CALLBACK (menu_item_select), NULL);
   g_signal_connect (data, "deselect", G_CALLBACK (menu_item_deselect), NULL);
@@ -67,7 +77,7 @@ gtk_menu_item_accessible_initialize (AtkObject *obj,
         atk_object_set_parent (obj, gtk_widget_get_accessible (parent_widget));
     }
 
-  GTK_WIDGET_ACCESSIBLE (obj)->layer = ATK_LAYER_POPUP;
+  _gtk_widget_accessible_set_layer (GTK_WIDGET_ACCESSIBLE (obj), ATK_LAYER_POPUP);
 
   obj->role = ATK_ROLE_MENU_ITEM;
 
@@ -140,7 +150,11 @@ gtk_menu_item_accessible_ref_state_set (AtkObject *obj)
   AtkObject *menu_item;
   AtkStateSet *state_set, *parent_state_set;
 
-  state_set = ATK_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->ref_state_set (obj);
+  state_set = ATK_OBJECT_CLASS (gtk_menu_item_accessible_parent_class)->ref_state_set (obj);
+
+  atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
+  if (GTK_MENU_ITEM_ACCESSIBLE (obj)->priv->selected)
+    atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
 
   menu_item = atk_object_get_parent (obj);
 
@@ -171,7 +185,7 @@ gtk_menu_item_accessible_get_role (AtkObject *obj)
       gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)))
     return ATK_ROLE_MENU;
 
-  return ATK_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->get_role (obj);
+  return ATK_OBJECT_CLASS (gtk_menu_item_accessible_parent_class)->get_role (obj);
 }
 
 static const gchar *
@@ -186,17 +200,17 @@ gtk_menu_item_accessible_get_name (AtkObject *obj)
   if (widget == NULL)
     return NULL;
 
-  name = ATK_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->get_name (obj);
+  name = ATK_OBJECT_CLASS (gtk_menu_item_accessible_parent_class)->get_name (obj);
   if (name)
     return name;
 
   accessible = GTK_MENU_ITEM_ACCESSIBLE (obj);
   label = get_label_from_container (widget);
 
-  g_free (accessible->text);
-  accessible->text = get_text_from_label_widget (label);
+  g_free (accessible->priv->text);
+  accessible->priv->text = get_text_from_label_widget (label);
 
-  return accessible->text;
+  return accessible->priv->text;
 }
 
 static void
@@ -204,9 +218,9 @@ gtk_menu_item_accessible_finalize (GObject *object)
 {
   GtkMenuItemAccessible *accessible = GTK_MENU_ITEM_ACCESSIBLE (object);
 
-  g_free (accessible->text);
+  g_free (accessible->priv->text);
 
-  G_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->finalize (object);
+  G_OBJECT_CLASS (gtk_menu_item_accessible_parent_class)->finalize (object);
 }
 
 static void
@@ -224,11 +238,11 @@ gtk_menu_item_accessible_notify_gtk (GObject    *obj,
       g_signal_emit_by_name (atk_obj, "visible-data-changed");
     }
   else
-    GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_menu_item_accessible_parent_class)->notify_gtk (obj, pspec);
+    GTK_WIDGET_ACCESSIBLE_CLASS (gtk_menu_item_accessible_parent_class)->notify_gtk (obj, pspec);
 }
 
 static void
-_gtk_menu_item_accessible_class_init (GtkMenuItemAccessibleClass *klass)
+gtk_menu_item_accessible_class_init (GtkMenuItemAccessibleClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
@@ -244,11 +258,16 @@ _gtk_menu_item_accessible_class_init (GtkMenuItemAccessibleClass *klass)
   class->initialize = gtk_menu_item_accessible_initialize;
   class->get_name = gtk_menu_item_accessible_get_name;
   class->get_role = gtk_menu_item_accessible_get_role;
+
+  g_type_class_add_private (klass, sizeof (GtkMenuItemAccessiblePrivate));
 }
 
 static void
-_gtk_menu_item_accessible_init (GtkMenuItemAccessible *menu_item)
+gtk_menu_item_accessible_init (GtkMenuItemAccessible *menu_item)
 {
+  menu_item->priv = G_TYPE_INSTANCE_GET_PRIVATE (menu_item,
+                                                 GTK_TYPE_MENU_ITEM_ACCESSIBLE,
+                                                 GtkMenuItemAccessiblePrivate);
 }
 
 static GtkWidget *
@@ -404,10 +423,27 @@ static const gchar *
 gtk_menu_item_accessible_action_get_name (AtkAction *action,
                                           gint       i)
 {
-  if (i != 0 || gtk_menu_item_accessible_get_n_actions (action) == 0)
-    return NULL;
+  if (i == 0 && gtk_menu_item_accessible_get_n_actions (action) > 0)
+    return "click";
+  return NULL;
+}
 
-  return "click";
+static const gchar *
+gtk_menu_item_accessible_action_get_localized_name (AtkAction *action,
+                                                    gint       i)
+{
+  if (i == 0 && gtk_menu_item_accessible_get_n_actions (action) > 0)
+    return C_("Action name", "Click");
+  return NULL;
+}
+
+static const gchar *
+gtk_menu_item_accessible_action_get_description (AtkAction *action,
+                                                 gint       i)
+{
+  if (i == 0 && gtk_menu_item_accessible_get_n_actions (action) > 0)
+    return C_("Action description", "Clicks the menuitem");
+  return NULL;
 }
 
 static gboolean
@@ -599,6 +635,8 @@ atk_action_interface_init (AtkActionIface *iface)
   iface->do_action = gtk_menu_item_accessible_do_action;
   iface->get_n_actions = gtk_menu_item_accessible_get_n_actions;
   iface->get_name = gtk_menu_item_accessible_action_get_name;
+  iface->get_localized_name = gtk_menu_item_accessible_action_get_localized_name;
+  iface->get_description = gtk_menu_item_accessible_action_get_description;
   iface->get_keybinding = gtk_menu_item_accessible_get_keybinding;
 }
 
@@ -610,6 +648,7 @@ menu_item_selection (GtkMenuItem  *item,
   gint i;
 
   obj = gtk_widget_get_accessible (GTK_WIDGET (item));
+  GTK_MENU_ITEM_ACCESSIBLE (obj)->priv->selected = selected;
   atk_object_notify_state_change (obj, ATK_STATE_SELECTED, selected);
 
   for (i = 0; i < atk_object_get_n_accessible_children (obj); i++)
@@ -817,7 +856,7 @@ menu_item_add_gtk (GtkContainer *container,
   parent_widget = gtk_menu_get_attach_widget (GTK_MENU (container));
   if (GTK_IS_MENU_ITEM (parent_widget))
     {
-      GTK_CONTAINER_ACCESSIBLE_CLASS (_gtk_menu_item_accessible_parent_class)->add_gtk (container, widget, gtk_widget_get_accessible (parent_widget));
+      GTK_CONTAINER_ACCESSIBLE_CLASS (gtk_menu_item_accessible_parent_class)->add_gtk (container, widget, gtk_widget_get_accessible (parent_widget));
 
     }
   return 1;
@@ -834,7 +873,7 @@ menu_item_remove_gtk (GtkContainer *container,
   parent_widget = gtk_menu_get_attach_widget (GTK_MENU (container));
   if (GTK_IS_MENU_ITEM (parent_widget))
     {
-      GTK_CONTAINER_ACCESSIBLE_CLASS (_gtk_menu_item_accessible_parent_class)->remove_gtk (container, widget, gtk_widget_get_accessible (parent_widget));
+      GTK_CONTAINER_ACCESSIBLE_CLASS (gtk_menu_item_accessible_parent_class)->remove_gtk (container, widget, gtk_widget_get_accessible (parent_widget));
     }
   return 1;
 }