summaryrefslogtreecommitdiff
path: root/gtk/a11y/gtkexpanderaccessible.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2011-07-01 10:15:36 -0400
committerMatthias Clasen <mclasen@redhat.com>2011-07-05 16:08:57 -0400
commit896769df691bcdf0b6a139a7bdce5056be6cba25 (patch)
tree77d1d39c03736585852c71c9f8bbea96a2485a48 /gtk/a11y/gtkexpanderaccessible.c
parent6087131ab6c9bbe84bcfa32c6056fc7af01e5e60 (diff)
downloadgtk+-896769df691bcdf0b6a139a7bdce5056be6cba25.tar.gz
Convert GailExpander to GtkExpanderAccessible
At the same time, drop the AtkText implementation. Also, reintroduce a GtkBoxAccessible, since the previous way of setting the role in get_accessible was affecting GtkBox subclasses negatively. Adjust expected test output to match.
Diffstat (limited to 'gtk/a11y/gtkexpanderaccessible.c')
-rw-r--r--gtk/a11y/gtkexpanderaccessible.c290
1 files changed, 290 insertions, 0 deletions
diff --git a/gtk/a11y/gtkexpanderaccessible.c b/gtk/a11y/gtkexpanderaccessible.c
new file mode 100644
index 0000000000..105dfac2fe
--- /dev/null
+++ b/gtk/a11y/gtkexpanderaccessible.c
@@ -0,0 +1,290 @@
+/* GAIL - The GNOME Accessibility Implementation Library
+ * Copyright 2003 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 <string.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include "gtkexpanderaccessible.h"
+
+static void atk_action_interface_init (AtkActionIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GtkExpanderAccessible, gtk_expander_accessible, GAIL_TYPE_CONTAINER,
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
+
+static const gchar *
+gtk_expander_accessible_get_full_text (GtkExpander *widget)
+{
+ GtkWidget *label_widget;
+
+ label_widget = gtk_expander_get_label_widget (widget);
+
+ if (!GTK_IS_LABEL (label_widget))
+ return NULL;
+
+ return gtk_label_get_text (GTK_LABEL (label_widget));
+}
+
+static const gchar *
+gtk_expander_accessible_get_name (AtkObject *obj)
+{
+ GtkWidget *widget;
+ const gchar *name;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
+ if (widget == NULL)
+ return NULL;
+
+ name = ATK_OBJECT_CLASS (gtk_expander_accessible_parent_class)->get_name (obj);
+ if (name != NULL)
+ return name;
+
+ return gtk_expander_accessible_get_full_text (GTK_EXPANDER (widget));
+}
+
+static gint
+gtk_expander_accessible_get_n_children (AtkObject *obj)
+{
+ GtkWidget *widget;
+ GList *children;
+ gint count = 0;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
+ if (widget == NULL)
+ return 0;
+
+ children = gtk_container_get_children (GTK_CONTAINER(widget));
+ count = g_list_length (children);
+ g_list_free (children);
+
+ /* See if there is a label - if there is, reduce our count by 1
+ * since we don't want the label included with the children.
+ */
+ if (gtk_expander_get_label_widget (GTK_EXPANDER (widget)))
+ count -= 1;
+
+ return count;
+}
+
+static AtkObject *
+gtk_expander_accessible_ref_child (AtkObject *obj,
+ gint i)
+{
+ GList *children, *tmp_list;
+ AtkObject *accessible;
+ GtkWidget *widget;
+ GtkWidget *label;
+ gint index;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
+ if (widget == NULL)
+ return NULL;
+
+ children = gtk_container_get_children (GTK_CONTAINER (widget));
+
+ /* See if there is a label - if there is, we need to skip it
+ * since we don't want the label included with the children.
+ */
+ label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
+ if (label)
+ {
+ for (index = 0; index <= i; index++)
+ {
+ tmp_list = g_list_nth (children, index);
+ if (label == GTK_WIDGET (tmp_list->data))
+ {
+ i += 1;
+ break;
+ }
+ }
+ }
+
+ tmp_list = g_list_nth (children, i);
+ if (!tmp_list)
+ {
+ g_list_free (children);
+ return NULL;
+ }
+ accessible = gtk_widget_get_accessible (GTK_WIDGET (tmp_list->data));
+
+ g_list_free (children);
+ g_object_ref (accessible);
+ return accessible;
+}
+
+static void
+gtk_expander_accessible_initialize (AtkObject *obj,
+ gpointer data)
+{
+ ATK_OBJECT_CLASS (gtk_expander_accessible_parent_class)->initialize (obj, data);
+
+ obj->role = ATK_ROLE_TOGGLE_BUTTON;
+}
+
+static void
+gtk_expander_accessible_notify_gtk (GObject *obj,
+ GParamSpec *pspec)
+{
+ AtkObject* atk_obj;
+ GtkExpander *expander;
+
+ expander = GTK_EXPANDER (obj);
+ atk_obj = gtk_widget_get_accessible (GTK_WIDGET (expander));
+;
+ if (strcmp (pspec->name, "label") == 0)
+ {
+ if (atk_obj->name == NULL)
+ g_object_notify (G_OBJECT (atk_obj), "accessible-name");
+ g_signal_emit_by_name (atk_obj, "visible_data_changed");
+ }
+ else if (strcmp (pspec->name, "expanded") == 0)
+ {
+ atk_object_notify_state_change (atk_obj, ATK_STATE_CHECKED,
+ gtk_expander_get_expanded (expander));
+ atk_object_notify_state_change (atk_obj, ATK_STATE_EXPANDED,
+ gtk_expander_get_expanded (expander));
+ g_signal_emit_by_name (atk_obj, "visible_data_changed");
+ }
+ else
+ GAIL_WIDGET_CLASS (gtk_expander_accessible_parent_class)->notify_gtk (obj, pspec);
+}
+
+static AtkStateSet*
+gtk_expander_accessible_ref_state_set (AtkObject *obj)
+{
+ AtkStateSet *state_set;
+ GtkWidget *widget;
+ GtkExpander *expander;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
+ if (widget == NULL)
+ return NULL;
+
+ state_set = ATK_OBJECT_CLASS (gtk_expander_accessible_parent_class)->ref_state_set (obj);
+
+ expander = GTK_EXPANDER (widget);
+
+ atk_state_set_add_state (state_set, ATK_STATE_EXPANDABLE);
+
+ if (gtk_expander_get_expanded (expander))
+ {
+ atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
+ atk_state_set_add_state (state_set, ATK_STATE_EXPANDED);
+ }
+
+ return state_set;
+}
+
+static void
+gtk_expander_accessible_class_init (GtkExpanderAccessibleClass *klass)
+{
+ AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
+ GailWidgetClass *widget_class = (GailWidgetClass*)klass;
+
+ widget_class->notify_gtk = gtk_expander_accessible_notify_gtk;
+
+ class->get_name = gtk_expander_accessible_get_name;
+ class->get_n_children = gtk_expander_accessible_get_n_children;
+ class->ref_child = gtk_expander_accessible_ref_child;
+ class->ref_state_set = gtk_expander_accessible_ref_state_set;
+
+ class->initialize = gtk_expander_accessible_initialize;
+}
+
+static void
+gtk_expander_accessible_init (GtkExpanderAccessible *expander)
+{
+}
+
+static gboolean
+gtk_expander_accessible_do_action (AtkAction *action,
+ gint i)
+{
+ GtkWidget *widget;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
+ if (widget == NULL)
+ return FALSE;
+
+ if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
+ return FALSE;
+
+ if (i != 0)
+ return FALSE;
+
+ gtk_widget_activate (widget);
+ return TRUE;
+}
+
+static gint
+gtk_expander_accessible_get_n_actions (AtkAction *action)
+{
+ return 1;
+}
+
+static const gchar *
+gtk_expander_accessible_get_keybinding (AtkAction *action,
+ gint i)
+{
+ GtkExpanderAccessible *expander;
+ gchar *return_value = NULL;
+ GtkWidget *widget;
+ GtkWidget *label;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
+ if (widget == NULL)
+ return NULL;
+
+ if (i != 0)
+ return NULL;
+
+ expander = GTK_EXPANDER_ACCESSIBLE (action);
+
+ label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
+ if (GTK_IS_LABEL (label))
+ {
+ guint key_val;
+
+ key_val = gtk_label_get_mnemonic_keyval (GTK_LABEL (label));
+ if (key_val != GDK_KEY_VoidSymbol)
+ return_value = gtk_accelerator_name (key_val, GDK_MOD1_MASK);
+ }
+
+ return return_value;
+}
+
+static const gchar *
+gtk_expander_accessible_action_get_name (AtkAction *action,
+ gint i)
+{
+ if (i != 0)
+ return NULL;
+
+ return "activate";
+}
+
+static void
+atk_action_interface_init (AtkActionIface *iface)
+{
+ iface->do_action = gtk_expander_accessible_do_action;
+ iface->get_n_actions = gtk_expander_accessible_get_n_actions;
+ iface->get_keybinding = gtk_expander_accessible_get_keybinding;
+ iface->get_name = gtk_expander_accessible_action_get_name;
+}