]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtkbooleancellaccessible.c
GtkBubbleWindow: Use style border color to stroke the bubble shape
[~andy/gtk] / gtk / a11y / gtkbooleancellaccessible.c
index 67ae74eff5449324fd66b7456b04d95e4bf3f16b..f114261901a8646e786fa5193056cba299b66399 100644 (file)
@@ -1,4 +1,4 @@
-/* GAIL - The GNOME Accessibility Enabling Library
+/* GTK+ - accessibility implementations
  * Copyright 2001 Sun Microsystems Inc.
  *
  * This library is free software; you can redistribute it and/or
  * 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.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
 
 #include <gtk/gtk.h>
+#include <glib/gi18n-lib.h>
 #include "gtkbooleancellaccessible.h"
 
-
-static gchar *property_list[] = {
-  "active",
-  "radio",
-  "sensitive",
-  NULL
+struct _GtkBooleanCellAccessiblePrivate
+{
+  gboolean cell_value;
+  gboolean cell_sensitive;
 };
 
-G_DEFINE_TYPE (GtkBooleanCellAccessible, _gtk_boolean_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE)
+static AtkActionIface *parent_action_iface;
+
+static gint
+gtk_boolean_cell_accessible_get_n_actions (AtkAction *action)
+{
+  return parent_action_iface->get_n_actions (action) + 1;
+}
+
+static const gchar *
+gtk_boolean_cell_accessible_get_description (AtkAction *action,
+                                             gint       i)
+{
+  if (i == 0)
+    return C_("Action description", "Toggles the cell");
+
+  return parent_action_iface->get_description (action, i - 1);
+}
 
+static const gchar *
+gtk_boolean_cell_accessible_action_get_name (AtkAction *action,
+                                             gint       i)
+{
+  if (i == 0)
+    return "toggle";
+
+  return parent_action_iface->get_description (action, i - 1);
+}
+
+static const gchar *
+gtk_boolean_cell_accessible_action_get_localized_name (AtkAction *action,
+                                                       gint       i)
+{
+  if (i == 0)
+    return C_("Action name", "Toggle");
+
+  return parent_action_iface->get_description (action, i - 1);
+}
 
 static gboolean
-gtk_boolean_cell_accessible_update_cache (GtkRendererCellAccessible *cell,
-                                          gboolean                   emit_change_signal)
+gtk_boolean_cell_accessible_do_action (AtkAction *action,
+                                       gint       i)
+{
+  if (i == 0)
+    return parent_action_iface->do_action (action, 2);
+
+  return parent_action_iface->do_action (action, i - 1);
+}
+
+static void
+gtk_boolean_cell_accessible_action_interface_init (AtkActionIface *iface)
+{
+  parent_action_iface = g_type_interface_peek_parent (iface);
+
+  iface->do_action = gtk_boolean_cell_accessible_do_action;
+  iface->get_n_actions = gtk_boolean_cell_accessible_get_n_actions;
+  iface->get_description = gtk_boolean_cell_accessible_get_description;
+  iface->get_name = gtk_boolean_cell_accessible_action_get_name;
+  iface->get_localized_name = gtk_boolean_cell_accessible_action_get_localized_name;
+}
+
+
+G_DEFINE_TYPE_EXTENDED (GtkBooleanCellAccessible, gtk_boolean_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE, 0,
+                        G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, gtk_boolean_cell_accessible_action_interface_init))
+
+
+static AtkStateSet *
+gtk_boolean_cell_accessible_ref_state_set (AtkObject *accessible)
+{
+  GtkBooleanCellAccessible *cell = GTK_BOOLEAN_CELL_ACCESSIBLE (accessible);
+  AtkStateSet *state_set;
+
+  state_set = ATK_OBJECT_CLASS (gtk_boolean_cell_accessible_parent_class)->ref_state_set (accessible);
+
+  if (cell->priv->cell_value)
+    atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
+
+  if (cell->priv->cell_sensitive)
+    atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
+  else
+    atk_state_set_remove_state (state_set, ATK_STATE_SENSITIVE);
+
+  return state_set;
+}
+
+static void
+gtk_boolean_cell_accessible_update_cache (GtkCellAccessible *cell)
 {
   GtkBooleanCellAccessible *boolean_cell = GTK_BOOLEAN_CELL_ACCESSIBLE (cell);
-  gboolean rv = FALSE;
   gboolean active;
   gboolean sensitive;
+  GtkCellRenderer *renderer;
 
-  g_object_get (G_OBJECT (cell->renderer),
+  g_object_get (cell, "renderer", &renderer, NULL);
+  g_object_get (renderer,
                 "active", &active,
                 "sensitive", &sensitive,
                 NULL);
+  g_object_unref (renderer);
 
-  if (boolean_cell->cell_value != active)
+  if (boolean_cell->priv->cell_value != active)
     {
-      rv = TRUE;
-      boolean_cell->cell_value = !boolean_cell->cell_value;
+      boolean_cell->priv->cell_value = !boolean_cell->priv->cell_value;
 
-      if (active)
-        _gtk_cell_accessible_add_state (GTK_CELL_ACCESSIBLE (cell), ATK_STATE_CHECKED, emit_change_signal);
-      else
-        _gtk_cell_accessible_remove_state (GTK_CELL_ACCESSIBLE (cell), ATK_STATE_CHECKED, emit_change_signal);
+      atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, active);
     }
 
-  if (boolean_cell->cell_sensitive != sensitive)
+  if (boolean_cell->priv->cell_sensitive != sensitive)
     {
-      rv = TRUE;
-      boolean_cell->cell_sensitive = !boolean_cell->cell_sensitive;
+      boolean_cell->priv->cell_sensitive = !boolean_cell->priv->cell_sensitive;
 
-      if (sensitive)
-        _gtk_cell_accessible_add_state (GTK_CELL_ACCESSIBLE (cell), ATK_STATE_SENSITIVE, emit_change_signal);
-      else
-        _gtk_cell_accessible_remove_state (GTK_CELL_ACCESSIBLE (cell), ATK_STATE_SENSITIVE, emit_change_signal);
+      atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, sensitive);
     }
-
-  return rv;
 }
 
 static void
-_gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
+gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
 {
-  GtkRendererCellAccessibleClass *renderer_cell_class = GTK_RENDERER_CELL_ACCESSIBLE_CLASS (klass);
+  GtkCellAccessibleClass *cell_class = GTK_CELL_ACCESSIBLE_CLASS (klass);
+  AtkObjectClass *atkobject_class = ATK_OBJECT_CLASS (klass);
+
+  atkobject_class->ref_state_set = gtk_boolean_cell_accessible_ref_state_set;
 
-  renderer_cell_class->update_cache = gtk_boolean_cell_accessible_update_cache;
-  renderer_cell_class->property_list = property_list;
+  cell_class->update_cache = gtk_boolean_cell_accessible_update_cache;
+
+  g_type_class_add_private (klass, sizeof (GtkBooleanCellAccessiblePrivate));
 }
 
 static void
-_gtk_boolean_cell_accessible_init (GtkBooleanCellAccessible *cell)
+gtk_boolean_cell_accessible_init (GtkBooleanCellAccessible *cell)
 {
+  cell->priv =  G_TYPE_INSTANCE_GET_PRIVATE (cell,
+                                             GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE,
+                                             GtkBooleanCellAccessiblePrivate);
 }
 
-AtkObject *
-_gtk_boolean_cell_accessible_new (void)
-{
-  GObject *object;
-  AtkObject *atk_object;
-  GtkRendererCellAccessible *cell;
-  GtkBooleanCellAccessible *boolean_cell;
-
-  object = g_object_new (GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE, NULL);
-
-  atk_object = ATK_OBJECT (object);
-  atk_object->role = ATK_ROLE_TABLE_CELL;
-
-  cell = GTK_RENDERER_CELL_ACCESSIBLE (object);
-  cell->renderer = gtk_cell_renderer_toggle_new ();
-  g_object_ref_sink (cell->renderer);
-
-  boolean_cell = GTK_BOOLEAN_CELL_ACCESSIBLE (object);
-  boolean_cell->cell_value = FALSE;
-  boolean_cell->cell_sensitive = TRUE;
-
-  return atk_object;
-}