-/* 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;
-}