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
