Hi Mike, gal a11y patch again. see it here: http://bugzilla.ximian.com/show_bug.cgi?id=51145 Summary: add column headers as children of e-table-item. (impl. get_column_header) Thanks, Bolian |
Index: ChangeLog =================================================================== RCS file: /cvs/gnome/gal/ChangeLog,v retrieving revision 1.824 diff -u -r1.824 ChangeLog --- ChangeLog 17 Nov 2003 21:05:13 -0000 1.824 +++ ChangeLog 19 Nov 2003 07:41:20 -0000 @@ -1,3 +1,17 @@ +2003-11-19 Bolian Yin <bolian yin sun com> + + Fixes #51145 + + * gal/a11y/gal-a11y-e-table-item (eti_get_column_header): new impl. + (eti_ref_child): add column headers as children + +2003-11-19 Bolian Yin <bolian yin sun com> + + Fixes #51139 + + * gal/a11y/gal-a11y-e-table-item: (gal_a11y_e_table_item_ref_selection) + (gal_a11y_e_table_item_unref_selection): new functions. + 2003-11-17 Mike Kestner <mkestner ximian com> * gal/widgets/gtk-combo* : renamespace and move to Index: gal/a11y/e-table/gal-a11y-e-table-item.c =================================================================== RCS file: /cvs/gnome/gal/gal/a11y/e-table/gal-a11y-e-table-item.c,v retrieving revision 1.3 diff -u -r1.3 gal-a11y-e-table-item.c --- gal/a11y/e-table/gal-a11y-e-table-item.c 11 Nov 2003 03:42:58 -0000 1.3 +++ gal/a11y/e-table/gal-a11y-e-table-item.c 19 Nov 2003 07:41:21 -0000 @@ -34,8 +34,13 @@ gint index_in_parent; int selection_change_id; int cursor_change_id; + 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) @@ -90,6 +95,8 @@ if (parent_class->dispose) parent_class->dispose (object); + if (priv->selection) + gal_a11y_e_table_item_unref_selection (a11y); } /* Static functions */ @@ -122,7 +129,7 @@ } static AtkObject* -eti_ref_child (AtkObject *accessible, gint i) +eti_ref_child (AtkObject *accessible, gint index) { AtkGObjectAccessible *atk_gobj; ETableItem *item; @@ -133,8 +140,19 @@ if (!item) return NULL; - col = i % item->cols; - row = i / item->cols; + if (index < item->cols) { + AtkObject *child; + + /* A column header is required */ + child = atk_table_get_column_header (ATK_TABLE (accessible), index); + if (child) + g_object_ref (child); + return child; + } + + index -= item->cols; + col = index % item->cols; + row = index / item->cols; return atk_table_ref_at (ATK_TABLE (accessible), row, col); } @@ -384,11 +402,22 @@ } static AtkObject * -eti_get_column_header (AtkTable *table, - gint column) +eti_get_column_header (AtkTable *table, gint column) { - /* Unimplemented */ - return NULL; + ETableItem *item; + ETableCol *ecol; + AtkObject *atk_obj = NULL; + ECell *ecell; + + item = E_TABLE_ITEM (eti_a11y_get_gobject (ATK_OBJECT (table))); + if (!item) + return NULL; + + ecol = e_table_header_get_column (item->header, column); + ecell = ecol->ecell; + if (ecell) + atk_obj = atk_gobject_accessible_for_object (G_OBJECT (ecell)); + return atk_obj; } static G_CONST_RETURN gchar * @@ -471,7 +500,8 @@ 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; } @@ -554,6 +584,7 @@ priv->index_in_parent = -1; priv->selection_change_id = 0; priv->cursor_change_id = 0; + priv->selection = NULL; } /* atk selection */ @@ -575,9 +606,11 @@ static void eti_a11y_selection_model_added_cb (ETableItem *eti, ESelectionModel *selection, gpointer data); -static void eti_a11y_selection_changed_cb (ESelectionModel *selection, GalA11yETableItem *a11y); +static void eti_a11y_selection_changed_cb (ESelectionModel *selection, + GalA11yETableItem *a11y); static void eti_a11y_cursor_changed_cb (ESelectionModel *selection, - int row, int col, GalA11yETableItem *a11y); + int row, int col, + GalA11yETableItem *a11y); /** * gal_a11y_e_table_item_get_type: @@ -660,16 +693,9 @@ 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); @@ -684,6 +710,53 @@ 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 */ @@ -700,16 +773,8 @@ 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 @@ -725,14 +790,9 @@ 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