aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--a11y/e-table/gal-a11y-e-table-item.c94
-rw-r--r--widgets/table/e-table-item.c4
2 files changed, 67 insertions, 31 deletions
diff --git a/a11y/e-table/gal-a11y-e-table-item.c b/a11y/e-table/gal-a11y-e-table-item.c
index fadcb296ac..bd34a87006 100644
--- a/a11y/e-table/gal-a11y-e-table-item.c
+++ b/a11y/e-table/gal-a11y-e-table-item.c
@@ -39,8 +39,13 @@ struct _GalA11yETableItemPrivate {
int selection_change_id;
int cursor_change_id;
ETableCol ** columns;
+ ESelectionModel *selection;
};
+static gboolean gal_a11y_e_table_item_ref_selection (GalA11yETableItem *a11y,
+ ESelectionModel *selection);
+static gboolean gal_a11y_e_table_item_unref_selection (GalA11yETableItem *a11y);
+
#if 0
static void
unref_accessible (gpointer user_data, GObject *obj_loc)
@@ -99,6 +104,8 @@ eti_dispose (GObject *object)
if (parent_class->dispose)
parent_class->dispose (object);
+ if (priv->selection)
+ gal_a11y_e_table_item_unref_selection (a11y);
}
/* Static functions */
@@ -527,7 +534,8 @@ table_add_row_selection (AtkTable *table, gint row)
if (table_is_row_selected (table, row))
return TRUE;
- e_selection_model_toggle_single_row (item->selection, view_to_model_row (item, row));
+ e_selection_model_toggle_single_row (item->selection,
+ view_to_model_row (item, row));
return TRUE;
}
@@ -909,6 +917,7 @@ eti_init (GalA11yETableItem *a11y)
priv->index_in_parent = -1;
priv->selection_change_id = 0;
priv->cursor_change_id = 0;
+ priv->selection = NULL;
}
/* atk selection */
@@ -1034,16 +1043,9 @@ gal_a11y_e_table_item_new (AtkObject *parent,
G_CALLBACK (eti_a11y_selection_model_removed_cb), NULL);
g_signal_connect (G_OBJECT(item), "selection_model_added",
G_CALLBACK (eti_a11y_selection_model_added_cb), NULL);
- if (item->selection) {
- GET_PRIVATE (a11y)->selection_change_id = g_signal_connect (
- G_OBJECT(item->selection), "selection_changed",
- G_CALLBACK (eti_a11y_selection_changed_cb), a11y);
- GET_PRIVATE (a11y)->cursor_change_id = g_signal_connect (
- G_OBJECT(item->selection), "cursor_changed",
- G_CALLBACK (eti_a11y_cursor_changed_cb), a11y);
-
- g_object_ref (item->selection);
- }
+ if (item->selection)
+ gal_a11y_e_table_item_ref_selection (a11y,
+ item->selection);
}
if (parent)
g_object_ref (parent);
@@ -1058,6 +1060,53 @@ gal_a11y_e_table_item_new (AtkObject *parent,
return ATK_OBJECT (a11y);
}
+static gboolean
+gal_a11y_e_table_item_ref_selection (GalA11yETableItem *a11y,
+ ESelectionModel *selection)
+{
+ GalA11yETableItemPrivate *priv;
+
+ g_return_val_if_fail (a11y && selection, FALSE);
+
+ priv = GET_PRIVATE (a11y);
+ priv->selection_change_id = g_signal_connect (
+ G_OBJECT(selection), "selection_changed",
+ G_CALLBACK (eti_a11y_selection_changed_cb), a11y);
+ priv->cursor_change_id = g_signal_connect (
+ G_OBJECT(selection), "cursor_changed",
+ G_CALLBACK (eti_a11y_cursor_changed_cb), a11y);
+
+ priv->selection = selection;
+ g_object_ref (selection);
+
+ return TRUE;
+}
+
+static gboolean
+gal_a11y_e_table_item_unref_selection (GalA11yETableItem *a11y)
+{
+ GalA11yETableItemPrivate *priv;
+
+ g_return_val_if_fail (a11y, FALSE);
+
+ priv = GET_PRIVATE (a11y);
+
+ g_return_val_if_fail (priv->selection_change_id != 0, FALSE);
+ g_return_val_if_fail (priv->cursor_change_id != 0, FALSE);
+
+
+ g_signal_handler_disconnect (priv->selection,
+ priv->selection_change_id);
+ g_signal_handler_disconnect (priv->selection,
+ priv->cursor_change_id);
+ priv->cursor_change_id = 0;
+ priv->selection_change_id = 0;
+
+ g_object_unref (priv->selection);
+ priv->selection = NULL;
+
+ return TRUE;
+}
/* callbacks */
@@ -1074,16 +1123,8 @@ eti_a11y_selection_model_removed_cb (ETableItem *eti, ESelectionModel *selection
atk_obj = atk_gobject_accessible_for_object (G_OBJECT (eti));
a11y = GAL_A11Y_E_TABLE_ITEM (atk_obj);
- if (GET_PRIVATE (a11y)->selection_change_id != 0 &&
- GET_PRIVATE (a11y)->cursor_change_id != 0) {
- g_signal_handler_disconnect (selection,
- GET_PRIVATE (a11y)->selection_change_id);
- g_signal_handler_disconnect (selection,
- GET_PRIVATE (a11y)->cursor_change_id);
- GET_PRIVATE (a11y)->cursor_change_id = 0;
- GET_PRIVATE (a11y)->selection_change_id = 0;
- g_object_unref (selection);
- }
+ if (selection == GET_PRIVATE (a11y)->selection)
+ gal_a11y_e_table_item_unref_selection (a11y);
}
static void
@@ -1099,14 +1140,9 @@ eti_a11y_selection_model_added_cb (ETableItem *eti, ESelectionModel *selection,
atk_obj = atk_gobject_accessible_for_object (G_OBJECT (eti));
a11y = GAL_A11Y_E_TABLE_ITEM (atk_obj);
- GET_PRIVATE (a11y)->selection_change_id = g_signal_connect (
- G_OBJECT(selection), "selection_changed",
- G_CALLBACK (eti_a11y_selection_changed_cb), a11y);
- GET_PRIVATE (a11y)->cursor_change_id = g_signal_connect (
- G_OBJECT(selection), "cursor_changed",
- G_CALLBACK (eti_a11y_cursor_changed_cb), a11y);
-
- g_object_ref (selection);
+ if (GET_PRIVATE (a11y)->selection)
+ gal_a11y_e_table_item_unref_selection (a11y);
+ gal_a11y_e_table_item_ref_selection (a11y, selection);
}
static void
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
index 35daab025e..70d1213fa9 100644
--- a/widgets/table/e-table-item.c
+++ b/widgets/table/e-table-item.c
@@ -553,8 +553,6 @@ eti_remove_selection_model (ETableItem *eti)
eti->cursor_change_id);
g_signal_handler_disconnect (eti->selection,
eti->cursor_activated_id);
- g_signal_emit_by_name (G_OBJECT(eti),
- "selection_model_removed", eti->selection);
g_object_unref (eti->selection);
eti->selection_change_id = 0;
@@ -1466,6 +1464,8 @@ eti_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpe
break;
case PROP_SELECTION_MODEL:
+ g_signal_emit_by_name (G_OBJECT(eti),
+ "selection_model_removed", eti->selection);
eti_remove_selection_model (eti);
if (g_value_get_object (value))
eti_add_selection_model (eti, E_SELECTION_MODEL(g_value_get_object(value)));