Re: [evolution-patches] patch to fix #302154 (add support to sort table items by gok) [e-table]



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

Here is a patch to fix #302154. It makes gok can grub the table header items
and 'click' them to sort the table items.
Please help me to review it.

Thank you very much.

Regards,
Li

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_ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]