Harish, Attached is the updated version of the patch. I fixed some compile warnings and added the dispose method in the new .c file. Please review it. Thanks! Harry Li Yuan wrote: Hi,JP |
Index: ChangeLog =================================================================== RCS file: /cvs/gnome/gal/ChangeLog,v retrieving revision 1.932 diff -u -r1.932 ChangeLog --- ChangeLog 6 May 2005 04:46:07 -0000 1.932 +++ ChangeLog 9 May 2005 07:22:56 -0000 @@ -1,3 +1,18 @@ +2005-05-09 Li Yuan <li yuan sun com> + + * gal/a11y/e-table/Makefile.am: + * gal/a11y/e-table/gal-a11y-e-table-column-header.c: + * gal/a11y/e-table/gal-a11y-e-table-column-header.h: + add two files to sort table items. + * gal/a11y/e-table/gal-a11y-e-cell.c: + (gal_a11y_e_cell_get_index_in_parent): + add table header. + * gal/a11y/e-table/gal-a11y-e-table-item.c: (eti_get_n_children): + (eti_ref_child), (eti_get_n_rows), (eti_get_column_header): + ditto. + + Fixes #302154 + 2005-05-06 Sarfraaz Ahmed <asarfraaz novell com> * gal/e-table/e-table.c (et_real_construct) : Check for NULL string Index: gal/a11y/e-table/Makefile.am =================================================================== RCS file: /cvs/gnome/gal/gal/a11y/e-table/Makefile.am,v retrieving revision 1.9 diff -u -r1.9 Makefile.am --- gal/a11y/e-table/Makefile.am 29 Apr 2005 14:13:45 -0000 1.9 +++ gal/a11y/e-table/Makefile.am 9 May 2005 07:22:58 -0000 @@ -22,6 +22,7 @@ gal-a11y-e-table-item.c \ gal-a11y-e-table-item-factory.c \ gal-a11y-e-table-click-to-add.c \ + gal-a11y-e-table-column-header.c \ gal-a11y-e-table-click-to-add-factory.c \ gal-a11y-e-table-factory.c @@ -41,5 +42,6 @@ gal-a11y-e-table-item.h \ gal-a11y-e-table-click-to-add-factory.h \ gal-a11y-e-table-click-to-add.h \ + gal-a11y-e-table-column-header.h \ gal-a11y-e-table-item-factory.h \ gal-a11y-e-table-factory.h Index: gal/a11y/e-table/gal-a11y-e-cell.c =================================================================== RCS file: /cvs/gnome/gal/gal/a11y/e-table/gal-a11y-e-cell.c,v retrieving revision 1.11 diff -u -r1.11 gal-a11y-e-cell.c --- gal/a11y/e-table/gal-a11y-e-cell.c 29 Apr 2005 14:13:45 -0000 1.11 +++ gal/a11y/e-table/gal-a11y-e-cell.c 9 May 2005 07:22:59 -0000 @@ -134,7 +134,7 @@ if (!is_valid (accessible)) return -1; - return a11y->row * a11y->item->cols + a11y->view_col; + return (a11y->row + 1) * a11y->item->cols + a11y->view_col; } Index: gal/a11y/e-table/gal-a11y-e-table-column-header.c =================================================================== RCS file: gal/a11y/e-table/gal-a11y-e-table-column-header.c diff -N gal/a11y/e-table/gal-a11y-e-table-column-header.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gal/a11y/e-table/gal-a11y-e-table-column-header.c 9 May 2005 07:23:00 -0000 @@ -0,0 +1,212 @@ +/* Evolution Accessibility: gal-a11y-e-table-column-header.h + * + * Author: Li Yuan <li yuan sun com> + * + */ + +#include <config.h> +#include <glib/gi18n.h> +#include <atk/atkobject.h> +#include <atk/atkregistry.h> +#include "gal/e-table/e-table-header-item.h" +#include "gal/a11y/gal-a11y-util.h" +#include "gal-a11y-e-table-column-header.h" + +static GObjectClass *parent_class; +static gint priv_offset; + +#define GET_PRIVATE(object) ((GalA11yETableColumnHeaderPrivate *) (((char *) object) + priv_offset)) +#define PARENT_TYPE (atk_gobject_accessible_get_type ()) + +struct _GalA11yETableColumnHeaderPrivate { + ETableItem *item; + AtkObject *parent; + AtkStateSet *state_set; +}; + +static void +etch_init (GalA11yETableColumnHeader *a11y) +{ + GET_PRIVATE (a11y)->item = NULL; + GET_PRIVATE (a11y)->parent = NULL; + GET_PRIVATE (a11y)->state_set = NULL; +} + +static AtkStateSet * +gal_a11y_e_table_column_header_ref_state_set (AtkObject *accessible) +{ + GalA11yETableColumnHeaderPrivate *priv = GET_PRIVATE (accessible); + + g_return_val_if_fail (priv->state_set, NULL); + + g_object_ref(priv->state_set); + + return priv->state_set; +} + +static void +gal_a11y_e_table_column_header_real_initialize (AtkObject *obj, gpointer data) +{ + ATK_OBJECT_CLASS (parent_class)->initialize (obj, data); +} + +static void +gal_a11y_e_table_column_header_dispose (GObject *object) +{ + GalA11yETableColumnHeader *a11y = GAL_A11Y_E_TABLE_COLUMN_HEADER (object); + GalA11yETableColumnHeaderPrivate *priv = GET_PRIVATE (a11y); + + if (priv->state_set) { + g_object_unref (priv->state_set); + priv->state_set = NULL; + } + + if (parent_class->dispose) + parent_class->dispose (object); + +} + +static void +etch_class_init (GalA11yETableColumnHeaderClass *klass) +{ + AtkObjectClass *class = ATK_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (PARENT_TYPE); + + object_class->dispose = gal_a11y_e_table_column_header_dispose; + + class->ref_state_set = gal_a11y_e_table_column_header_ref_state_set; + class->initialize = gal_a11y_e_table_column_header_real_initialize; +} + +inline static GObject * +etch_a11y_get_gobject (AtkGObjectAccessible *accessible) +{ + return atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible)); +} + +static gboolean +gal_a11y_e_table_column_header_do_action (AtkAction *action, + gint i) +{ + gboolean return_value = TRUE; + GtkWidget *widget; + GalA11yETableColumnHeader *a11y; + ETableHeaderItem *ethi; + ETableItem *item; + ETableCol *col; + + switch (i) { + case 0: + a11y = GAL_A11Y_E_TABLE_COLUMN_HEADER (action); + col = E_TABLE_COL (etch_a11y_get_gobject (ATK_GOBJECT_ACCESSIBLE (a11y))); + item = GET_PRIVATE (a11y)->item; + widget = gtk_widget_get_parent (GTK_WIDGET (item->parent.canvas)); + if (E_IS_TREE (widget)) { + ethi = E_TABLE_HEADER_ITEM (e_tree_get_header_item (E_TREE (widget))); + } + else if (E_IS_TABLE (widget)) + ethi = E_TABLE_HEADER_ITEM (E_TABLE (widget)->header_item); + else + break; + ethi_change_sort_state (ethi, col); + default: + return_value = FALSE; + break; + } + return return_value; +} + +static gint +gal_a11y_e_table_column_header_get_n_actions (AtkAction *action) +{ + return 1; +} + +static G_CONST_RETURN gchar* +gal_a11y_e_table_column_header_action_get_name (AtkAction *action, + gint i) +{ + G_CONST_RETURN gchar *return_value; + + switch (i) { + case 0: + return_value = _("sort"); + break; + default: + return_value = NULL; + break; + } + return return_value; +} + +static void +atk_action_interface_init (AtkActionIface *iface) +{ + g_return_if_fail (iface != NULL); + + iface->do_action = gal_a11y_e_table_column_header_do_action; + iface->get_n_actions = gal_a11y_e_table_column_header_get_n_actions; + iface->get_name = gal_a11y_e_table_column_header_action_get_name; +} + +GType +gal_a11y_e_table_column_header_get_type (void) +{ + static GType type = 0; + + if (!type) { + GTypeInfo info = { + sizeof (GalA11yETableColumnHeaderClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) etch_class_init, + (GClassFinalizeFunc) NULL, + NULL, + sizeof (GalA11yETableColumnHeader), + 0, + (GInstanceInitFunc) etch_init, + NULL + }; + static const GInterfaceInfo atk_action_info = { + (GInterfaceInitFunc) atk_action_interface_init, + (GInterfaceFinalizeFunc) NULL, + NULL + }; + + type = gal_a11y_type_register_static_with_private (PARENT_TYPE, "GalA11yETableColumnHeader", &info, 0, + sizeof (GalA11yETableColumnHeaderPrivate), &priv_offset); + + g_type_add_interface_static (type, ATK_TYPE_ACTION, &atk_action_info); + } + + return type; +} + +AtkObject * +gal_a11y_e_table_column_header_new (ETableCol *ecol, ETableItem *item) +{ + GalA11yETableColumnHeader *a11y; + AtkObject *accessible; + + g_return_val_if_fail (E_IS_TABLE_COL (ecol), NULL); + + a11y = g_object_new (gal_a11y_e_table_column_header_get_type(), NULL); + accessible = ATK_OBJECT (a11y); + atk_object_initialize (accessible, ecol); + + GET_PRIVATE (a11y)->item = item; + GET_PRIVATE (a11y)->state_set = atk_state_set_new (); + + atk_state_set_add_state (GET_PRIVATE(a11y)->state_set, ATK_STATE_VISIBLE); + atk_state_set_add_state (GET_PRIVATE(a11y)->state_set, ATK_STATE_SHOWING); + atk_state_set_add_state (GET_PRIVATE(a11y)->state_set, ATK_STATE_SENSITIVE); + atk_state_set_add_state (GET_PRIVATE(a11y)->state_set, ATK_STATE_ENABLED); + + if (ecol->text) + atk_object_set_name (accessible, ecol->text); + atk_object_set_role (accessible, ATK_ROLE_TABLE_COLUMN_HEADER); + + return ATK_OBJECT (a11y); +} Index: gal/a11y/e-table/gal-a11y-e-table-column-header.h =================================================================== RCS file: gal/a11y/e-table/gal-a11y-e-table-column-header.h diff -N gal/a11y/e-table/gal-a11y-e-table-column-header.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gal/a11y/e-table/gal-a11y-e-table-column-header.h 9 May 2005 07:23:00 -0000 @@ -0,0 +1,38 @@ +/* Evolution Accessibility: gal-a11y-e-table-column-header.h + * + * Author: Li Yuan <li yuan sun com> + * + */ + + +#ifndef __GAL_A11Y_E_TABLE_COLUMN_HEADER_H__ +#define __GAL_A11Y_E_TABLE_COLUMN_HEADER_H__ + +#include <glib-object.h> +#include <atk/atkgobjectaccessible.h> + +#define GAL_A11Y_TYPE_E_TABLE_COLUMN_HEADER (gal_a11y_e_table_column_header_get_type ()) +#define GAL_A11Y_E_TABLE_COLUMN_HEADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAL_A11Y_TYPE_E_TABLE_COLUMN_HEADER, GalA11yETableColumnHeader)) +#define GAL_A11Y_E_TABLE_COLUMN_HEADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAL_A11Y_TYPE_E_TABLE_COLUMN_HEADER, GalA11yETableColumnHeaderClass)) +#define GAL_A11Y_IS_E_TABLE_COLUMN_HEADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAL_A11Y_TYPE_E_TABLE_COLUMN_HEADER)) +#define GAL_A11Y_IS_E_TABLE_COLUMN_HEADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAL_A11Y_TYPE_E_TABLE_COLUMN_HEADER)) + +typedef struct _GalA11yETableColumnHeader GalA11yETableColumnHeader; +typedef struct _GalA11yETableColumnHeaderClass GalA11yETableColumnHeaderClass; +typedef struct _GalA11yETableColumnHeaderPrivate GalA11yETableColumnHeaderPrivate; + +struct _GalA11yETableColumnHeader { + AtkGObjectAccessible parent; +}; + +struct _GalA11yETableColumnHeaderClass { + AtkGObjectAccessibleClass parent_class; +}; + + +/* Standard Glib function */ +GType gal_a11y_e_table_column_header_get_type (void); +AtkObject *gal_a11y_e_table_column_header_new (ETableCol *etc, ETableItem *item); +void gal_a11y_e_table_column_header_init (void); + +#endif /* ! __GAL_A11Y_E_TABLE_COLUMN_HEADER_H__ */ 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.18 diff -u -r1.18 gal-a11y-e-table-item.c --- gal/a11y/e-table/gal-a11y-e-table-item.c 29 Apr 2005 14:13:45 -0000 1.18 +++ gal/a11y/e-table/gal-a11y-e-table-item.c 9 May 2005 07:23:03 -0000 @@ -26,6 +26,7 @@ #include "gal-a11y-e-table-click-to-add.h" #include "gal-a11y-e-cell-registry.h" #include "gal-a11y-e-cell.h" +#include "gal-a11y-e-table-column-header.h" #define CS_CLASS(a11y) (G_TYPE_INSTANCE_GET_CLASS ((a11y), C_TYPE_STREAM, GalA11yETableItemClass)) static GObjectClass *parent_class; @@ -205,7 +206,7 @@ return 0; return atk_table_get_n_columns (ATK_TABLE (accessible)) * - atk_table_get_n_rows (ATK_TABLE (accessible)); + (atk_table_get_n_rows (ATK_TABLE (accessible)) + 1); } static AtkObject* @@ -219,7 +220,17 @@ if (!item) return NULL; - /* don't support column header now */ + if (index < item->cols) { + ETableCol *ecol; + AtkObject *child; + + ecol = e_table_header_get_column (item->header, index); + child = gal_a11y_e_table_column_header_new (ecol, item); + if (child) + g_object_ref (child); + return child; + } + index -= item->cols; col = index % item->cols; row = index / item->cols; @@ -416,7 +427,7 @@ if (!item) return -1; - return item->rows; + return item->rows + 1; } static gint @@ -501,12 +512,7 @@ ecol = e_table_header_get_column (item->header, column); if (ecol) { - atk_obj = atk_gobject_accessible_for_object (G_OBJECT (ecol)); - if (atk_obj) { - if (ecol->text) - atk_object_set_name (atk_obj, ecol->text); - atk_object_set_role (atk_obj, ATK_ROLE_TABLE_COLUMN_HEADER); - } + atk_obj = gal_a11y_e_table_column_header_new (ecol, item); } return atk_obj; Index: gal/e-table/ChangeLog =================================================================== RCS file: /cvs/gnome/gal/gal/e-table/ChangeLog,v retrieving revision 1.948 diff -u -r1.948 ChangeLog --- gal/e-table/ChangeLog 14 Mar 2005 06:34:26 -0000 1.948 +++ gal/e-table/ChangeLog 9 May 2005 07:23:30 -0000 @@ -1,3 +1,14 @@ +2005-04-27 Li Yuan <li yuan sun com> + + * e-table-header-item.c: + * e-table-header-item.h: + export ethi_change_sort_state, so we can call it in a11y part. + * e-tree.c: (e_tree_get_header_item): + * e-tree.h: + return the header item of e-tree. + + Fix for #302154. + 2005-03-14 Theppitak Karoonboonyanan <theppitak gmail com> * e-cell-text.c (e_cell_text_retrieve_surrounding_cb) Index: gal/e-table/e-table-header-item.c =================================================================== RCS file: /cvs/gnome/gal/gal/e-table/e-table-header-item.c,v retrieving revision 1.129 diff -u -r1.129 e-table-header-item.c --- gal/e-table/e-table-header-item.c 29 Apr 2005 14:16:03 -0000 1.129 +++ gal/e-table/e-table-header-item.c 9 May 2005 07:23:35 -0000 @@ -1538,7 +1538,7 @@ ethi_signals [BUTTON_PRESSED], 0, event); } -static void +void ethi_change_sort_state (ETableHeaderItem *ethi, ETableCol *col) { int model_col; Index: gal/e-table/e-table-header-item.h =================================================================== RCS file: /cvs/gnome/gal/gal/e-table/e-table-header-item.h,v retrieving revision 1.30 diff -u -r1.30 e-table-header-item.h --- gal/e-table/e-table-header-item.h 21 Dec 2004 20:47:40 -0000 1.30 +++ gal/e-table/e-table-header-item.h 9 May 2005 07:23:35 -0000 @@ -112,6 +112,9 @@ void (*button_pressed) (ETableHeaderItem *ethi, GdkEventButton *button); } ETableHeaderItemClass; +void +ethi_change_sort_state (ETableHeaderItem *ethi, ETableCol *col); + GType e_table_header_item_get_type (void); G_END_DECLS Index: gal/e-table/e-tree.c =================================================================== RCS file: /cvs/gnome/gal/gal/e-table/e-tree.c,v retrieving revision 1.111 diff -u -r1.111 e-tree.c --- gal/e-table/e-tree.c 29 Apr 2005 14:16:04 -0000 1.111 +++ gal/e-table/e-tree.c 9 May 2005 07:23:41 -0000 @@ -2159,6 +2159,14 @@ return E_TABLE_ITEM (et->priv->item); } +GnomeCanvasItem * +e_tree_get_header_item(ETree * et) +{ + g_return_val_if_fail (et != NULL, NULL); + g_return_val_if_fail (E_IS_TREE (et), NULL); + + return et->priv->header_item; +} struct _ETreeDragSourceSite { Index: gal/e-table/e-tree.h =================================================================== RCS file: /cvs/gnome/gal/gal/e-table/e-tree.h,v retrieving revision 1.28 diff -u -r1.28 e-tree.h --- gal/e-table/e-tree.h 11 Oct 2003 03:00:59 -0000 1.28 +++ gal/e-table/e-tree.h 9 May 2005 07:23:42 -0000 @@ -306,6 +306,8 @@ ETableItem * e_tree_get_item(ETree * et); +GnomeCanvasItem * e_tree_get_header_item(ETree * et); + G_END_DECLS #endif /* _E_TREE_H_ */