gpointer target_object;
gint i;
- if (cell->state_set)
- g_object_unref (cell->state_set);
-
if (cell->action_list)
g_list_free_full (cell->action_list, destroy_action_info);
}
static AtkStateSet *
-gtk_cell_accessible_ref_state_set (AtkObject *obj)
+gtk_cell_accessible_ref_state_set (AtkObject *accessible)
{
- GtkCellAccessible *cell = GTK_CELL_ACCESSIBLE (obj);
+ GtkCellAccessible *cell_accessible;
+ AtkStateSet *state_set;
+ GtkCellRendererState flags;
+ gboolean expandable, expanded;
+
+ cell_accessible = GTK_CELL_ACCESSIBLE (accessible);
+
+ state_set = atk_state_set_new ();
+
+ if (cell_accessible->widget == NULL)
+ {
+ atk_state_set_add_state (state_set, ATK_STATE_DEFUNCT);
+ return state_set;
+ }
+
+ flags = _gtk_cell_accessible_get_state (cell_accessible, &expandable, &expanded);
+
+ atk_state_set_add_state (state_set, ATK_STATE_TRANSIENT);
+
+ if (!(flags & GTK_CELL_RENDERER_INSENSITIVE))
+ {
+ atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
+ atk_state_set_add_state (state_set, ATK_STATE_ENABLED);
+ }
+
+ atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
+ if (flags & GTK_CELL_RENDERER_SELECTED)
+ atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
+
+ atk_state_set_add_state (state_set, ATK_STATE_VISIBLE);
+ if (gtk_widget_get_mapped (cell_accessible->widget))
+ atk_state_set_add_state (state_set, ATK_STATE_SHOWING);
- g_object_ref (cell->state_set);
+ /* This is not completely right. We should be tracking the
+ * focussed cell renderer, but that involves diving into
+ * cell areas...
+ */
+ atk_state_set_add_state (state_set, ATK_STATE_FOCUSABLE);
+ if (flags & GTK_CELL_RENDERER_FOCUSED)
+ {
+ /* XXX: Why do we set ACTIVE here? */
+ atk_state_set_add_state (state_set, ATK_STATE_ACTIVE);
+ atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
+ }
- return cell->state_set;
+ if (expandable)
+ atk_state_set_add_state (state_set, ATK_STATE_EXPANDABLE);
+ if (expanded)
+ atk_state_set_add_state (state_set, ATK_STATE_EXPANDED);
+
+ return state_set;
}
+
static void
_gtk_cell_accessible_class_init (GtkCellAccessibleClass *klass)
{
{
cell->widget = NULL;
cell->action_list = NULL;
- cell->state_set = atk_state_set_new ();
- atk_state_set_add_state (cell->state_set, ATK_STATE_TRANSIENT);
- atk_state_set_add_state (cell->state_set, ATK_STATE_ENABLED);
- atk_state_set_add_state (cell->state_set, ATK_STATE_SENSITIVE);
- atk_state_set_add_state (cell->state_set, ATK_STATE_SELECTABLE);
}
static void
AtkStateType state_type,
gboolean emit_signal)
{
- gboolean rc;
AtkObject *parent;
- if (atk_state_set_contains_state (cell->state_set, state_type))
- return FALSE;
-
- rc = atk_state_set_add_state (cell->state_set, state_type);
-
/* The signal should only be generated if the value changed,
* not when the cell is set up. So states that are set
* initially should pass FALSE as the emit_signal argument.
if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent))
_gtk_cell_accessible_add_state (GTK_CELL_ACCESSIBLE (parent), state_type, emit_signal);
- return rc;
+ return TRUE;
}
gboolean
AtkStateType state_type,
gboolean emit_signal)
{
- gboolean rc;
AtkObject *parent;
- if (!atk_state_set_contains_state (cell->state_set, state_type))
- return FALSE;
-
parent = atk_object_get_parent (ATK_OBJECT (cell));
- rc = atk_state_set_remove_state (cell->state_set, state_type);
-
/* The signal should only be generated if the value changed,
* not when the cell is set up. So states that are set
* initially should pass FALSE as the emit_signal argument.
if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent))
_gtk_cell_accessible_remove_state (GTK_CELL_ACCESSIBLE (parent), state_type, emit_signal);
- return rc;
+ return TRUE;
}
gboolean
G_DEFINE_TYPE_WITH_CODE (GtkTextCellAccessible, _gtk_text_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE,
G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init))
+static AtkStateSet *
+gtk_text_cell_accessible_ref_state_set (AtkObject *accessible)
+{
+ AtkStateSet *state_set;
+
+ state_set = ATK_OBJECT_CLASS (_gtk_text_cell_accessible_parent_class)->ref_state_set (accessible);
+
+ atk_state_set_add_state (state_set, ATK_STATE_SINGLE_LINE);
+
+ return state_set;
+}
static void
gtk_text_cell_accessible_finalize (GObject *object)
renderer_cell_class->property_list = property_list;
atk_object_class->get_name = gtk_text_cell_accessible_get_name;
+ atk_object_class->ref_state_set = gtk_text_cell_accessible_ref_state_set;
gobject_class->finalize = gtk_text_cell_accessible_finalize;
}
text_cell->cell_text = NULL;
text_cell->caret_pos = 0;
text_cell->cell_length = 0;
- atk_state_set_add_state (GTK_CELL_ACCESSIBLE (text_cell)->state_set,
- ATK_STATE_SINGLE_LINE);
}
AtkObject *