diff options
-rw-r--r-- | a11y/e-table/gal-a11y-e-cell-tree.c | 154 | ||||
-rw-r--r-- | a11y/e-table/gal-a11y-e-cell-tree.h | 48 | ||||
-rw-r--r-- | a11y/e-table/gal-a11y-e-cell.c | 50 | ||||
-rw-r--r-- | a11y/e-table/gal-a11y-e-cell.h | 8 | ||||
-rw-r--r-- | widgets/table/e-cell-tree.c | 11 | ||||
-rw-r--r-- | widgets/table/e-cell-tree.h | 2 |
6 files changed, 273 insertions, 0 deletions
diff --git a/a11y/e-table/gal-a11y-e-cell-tree.c b/a11y/e-table/gal-a11y-e-cell-tree.c new file mode 100644 index 0000000000..3f7071d72b --- /dev/null +++ b/a11y/e-table/gal-a11y-e-cell-tree.c @@ -0,0 +1,154 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: + * Tim Wo <tim.wo@sun.com>, Sun Microsystem Inc. 2003. + * + * Copyright (C) 2002 Ximian, Inc. + */ + +#include <config.h> +#include <atk/atkaction.h> +#include "gal-a11y-e-cell-tree.h" +#include "gal-a11y-util.h" +#include "gal/e-table/e-cell-tree.h" +#include "gal/e-table/e-table.h" +#include "gal/e-table/e-tree-table-adapter.h" + +#define CS_CLASS(a11y) (G_TYPE_INSTANCE_GET_CLASS ((a11y), C_TYPE_STREAM, GalA11yECellTreeClass)) +static AtkObjectClass *a11y_parent_class; +#define A11Y_PARENT_TYPE (gal_a11y_e_cell_get_type ()) + +static void +ectr_do_action_expand (AtkAction *action) +{ + GalA11yECell *a11y; + ETableModel *table_model; + ETreePath node; + ETreeModel *tree_model; + ETreeTableAdapter *tree_table_adapter; + + a11y = GAL_A11Y_E_CELL (action); + table_model = a11y->item->table_model; + node = e_table_model_value_at (table_model, -1, a11y->row); + tree_model = e_table_model_value_at (table_model, -2, a11y->row); + tree_table_adapter = e_table_model_value_at (table_model, -3, a11y->row); + + if (e_tree_model_node_is_expandable (tree_model, node)) { + e_tree_table_adapter_node_set_expanded (tree_table_adapter, + node, + TRUE); + gal_a11y_e_cell_add_state (a11y, ATK_STATE_EXPANDED, TRUE); + } +} + +static void +ectr_do_action_collapse (AtkAction *action) +{ + GalA11yECell *a11y; + ETableModel *table_model; + ETreePath node; + ETreeModel *tree_model; + ETreeTableAdapter *tree_table_adapter; + + a11y = GAL_A11Y_E_CELL (action); + table_model = a11y->item->table_model; + node = e_table_model_value_at (table_model, -1, a11y->row); + tree_model = e_table_model_value_at (table_model, -2, a11y->row); + tree_table_adapter = e_table_model_value_at (table_model, -3, a11y->row); + + if (e_tree_model_node_is_expandable (tree_model, node)) { + e_tree_table_adapter_node_set_expanded (tree_table_adapter, + node, + FALSE); + gal_a11y_e_cell_remove_state (a11y, ATK_STATE_EXPANDED, TRUE); + } +} + +static void +ectr_class_init (GalA11yECellTreeClass *klass) +{ + a11y_parent_class = g_type_class_ref (A11Y_PARENT_TYPE); +} + +static void +ectr_init (GalA11yECellTree *a11y) +{ +} + +GType +gal_a11y_e_cell_tree_get_type (void) +{ + static GType type = 0; + + if (!type) { + GTypeInfo info = { + sizeof (GalA11yECellTreeClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) ectr_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (GalA11yECellTree), + 0, + (GInstanceInitFunc) ectr_init, + NULL /* value_cell_text */ + }; + + type = g_type_register_static (A11Y_PARENT_TYPE, "GalA11yECellTree", &info, 0); + gal_a11y_e_cell_type_add_action_interface (type); + } + + return type; +} + +AtkObject * +gal_a11y_e_cell_tree_new (ETableItem *item, + ECellView *cell_view, + AtkObject *parent, + int model_col, + int view_col, + int row) +{ + GalA11yECell *a11y; + GtkWidget *e_table; + gint model_row; + + ECellView *subcell_view; + subcell_view = e_cell_tree_view_get_subcell_view (cell_view); + + if (subcell_view->ecell) { + a11y = gal_a11y_e_cell_registry_get_object (NULL, + item, + subcell_view, + parent, + model_col, + view_col, + row); + } else { + a11y = g_object_new (gal_a11y_e_cell_tree_get_type (), NULL); + + gal_a11y_e_cell_construct (a11y, + item, + cell_view, + parent, + model_col, + view_col, + row); + } + + gal_a11y_e_cell_add_action (a11y, + "expand", + "expands the row in the ETree containing this cell", + NULL, + (ACTION_FUNC)ectr_do_action_expand); + + gal_a11y_e_cell_add_action (a11y, + "collapse", + "collapses the row in the ETree containing this cell", + NULL, + (ACTION_FUNC)ectr_do_action_collapse); + + gal_a11y_e_cell_add_state (a11y, ATK_STATE_EXPANDABLE, FALSE); + + return a11y; +} diff --git a/a11y/e-table/gal-a11y-e-cell-tree.h b/a11y/e-table/gal-a11y-e-cell-tree.h new file mode 100644 index 0000000000..4d48b66de4 --- /dev/null +++ b/a11y/e-table/gal-a11y-e-cell-tree.h @@ -0,0 +1,48 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: + * Tim Wo <tim.wo@sun.com>, Sun Microsystem Inc. 2003. + * + * Copyright (C) 2002 Ximian, Inc. + */ + +#ifndef __GAL_A11Y_E_CELL_TREE_H__ +#define __GAL_A11Y_E_CELL_TREE_H__ + +#include <glib-object.h> +#include <gal/e-table/e-table-item.h> +#include <gal/e-table/e-cell-tree.h> +#include "gal-a11y-e-cell.h" + +#define GAL_A11Y_TYPE_E_CELL_TREE (gal_a11y_e_cell_tree_get_type ()) +#define GAL_A11Y_E_CELL_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAL_A11Y_TYPE_E_CELL_TREE, GalA11yECellTree)) +#define GAL_A11Y_E_CELL_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAL_A11Y_TYPE_E_CELL_TREE, GalA11yECellTreeClass)) +#define GAL_A11Y_IS_E_CELL_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAL_A11Y_TYPE_E_CELL_TREE)) +#define GAL_A11Y_IS_E_CELL_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAL_A11Y_TYPE_E_CELL_TREE)) + +typedef struct _GalA11yECellTree GalA11yECellTree; +typedef struct _GalA11yECellTreeClass GalA11yECellTreeClass; +typedef struct _GalA11yECellTreePrivate GalA11yECellTreePrivate; + +/* This struct should actually be larger as this isn't what we derive from. + * The GalA11yECellTreePrivate comes right after the parent class structure. + **/ +struct _GalA11yECellTree { + GalA11yECell object; +}; + +struct _GalA11yECellTreeClass { + GalA11yECellClass parent_class; +}; + + +/* Standard Glib function */ +GType gal_a11y_e_cell_tree_get_type (void); +AtkObject *gal_a11y_e_cell_tree_new (ETableItem *item, + ECellView *cell_view, + AtkObject *parent, + int model_col, + int view_col, + int row); + +#endif /* ! __GAL_A11Y_E_CELL_TREE_H__ */ diff --git a/a11y/e-table/gal-a11y-e-cell.c b/a11y/e-table/gal-a11y-e-cell.c index a387c6ed6f..69dcf8d621 100644 --- a/a11y/e-table/gal-a11y-e-cell.c +++ b/a11y/e-table/gal-a11y-e-cell.c @@ -57,11 +57,24 @@ eti_dispose (GObject *object) a11y->view_col = -1; a11y->row = -1; + if (a11y->state_set) + g_object_unref (a11y->state_set); + if (parent_class->dispose) parent_class->dispose (object); } /* Static functions */ +static AtkStateSet * +eti_ref_state_set (AtkObject *accessible) +{ + GalA11yECell *cell = GAL_A11Y_E_CELL (accessible); + g_return_val_if_fail (cell->state_set, NULL); + + g_object_ref(cell->state_set); + return cell->state_set; +} + static AtkObject* eti_get_parent (AtkObject *accessible) { @@ -154,6 +167,7 @@ eti_class_init (GalA11yECellClass *klass) atk_object_class->get_parent = eti_get_parent; atk_object_class->get_index_in_parent = eti_get_index_in_parent; + atk_object_class->ref_state_set = eti_ref_state_set; } static void @@ -165,6 +179,10 @@ eti_init (GalA11yECell *a11y) a11y->model_col = -1; a11y->view_col = -1; a11y->row = -1; + + a11y->state_set = atk_state_set_new (); + atk_state_set_add_state (a11y->state_set, ATK_STATE_TRANSIENT); + atk_state_set_add_state (a11y->state_set, ATK_STATE_ENABLED); } @@ -407,9 +425,40 @@ gal_a11y_e_cell_add_state (GalA11yECell *cell, if (state_type == ATK_STATE_VISIBLE) g_signal_emit_by_name (cell, "visible_data_changed"); } + + return rc; } + else + return FALSE; } +gboolean +gal_a11y_e_cell_remove_state (GalA11yECell *cell, + AtkStateType state_type, + gboolean emit_signal) +{ + if (atk_state_set_contains_state (cell->state_set, state_type)) { + gboolean rc; + + rc = atk_state_set_remove_state (cell->state_set, state_type); + /* + * The signal should only be generated if the value changed, + * not when the cell is set up. So states that are set + * initially should pass FALSE as the emit_signal argument. + */ + + if (emit_signal) { + atk_object_notify_state_change (ATK_OBJECT (cell), state_type, FALSE); + /* If state_type is ATK_STATE_VISIBLE, additional notification */ + if (state_type == ATK_STATE_VISIBLE) + g_signal_emit_by_name (cell, "visible_data_changed"); + } + + return rc; + } + else + return FALSE; +} /** * gal_a11y_e_cell_get_type: @@ -451,6 +500,7 @@ gal_a11y_e_cell_get_type (void) return type; } + AtkObject * gal_a11y_e_cell_new (ETableItem *item, ECellView *cell_view, diff --git a/a11y/e-table/gal-a11y-e-cell.h b/a11y/e-table/gal-a11y-e-cell.h index 81f5f147ca..53a6c0089d 100644 --- a/a11y/e-table/gal-a11y-e-cell.h +++ b/a11y/e-table/gal-a11y-e-cell.h @@ -87,5 +87,13 @@ gboolean gal_a11y_e_cell_remove_action (GalA11yECell *cell, gboolean gal_a11y_e_cell_remove_action_by_name (GalA11yECell *cell, const gchar *action_name); +gboolean gal_a11y_e_cell_add_state (GalA11yECell *cell, + AtkStateType state_type, + gboolean emit_signal); + +gboolean gal_a11y_e_cell_remove_state (GalA11yECell *cell, + AtkStateType state_type, + gboolean emit_signal); + #endif /* ! __GAL_A11Y_E_CELL_H__ */ diff --git a/widgets/table/e-cell-tree.c b/widgets/table/e-cell-tree.c index cbe896ceda..a0be81e889 100644 --- a/widgets/table/e-cell-tree.c +++ b/widgets/table/e-cell-tree.c @@ -52,6 +52,9 @@ #include "tree-expanded.xpm" #include "tree-unexpanded.xpm" +#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h" +#include "gal/a11y/e-table/gal-a11y-e-cell-tree.h" + #define PARENT_TYPE e_cell_get_type () typedef struct { @@ -70,6 +73,12 @@ static ECellClass *parent_class; #define INDENT_AMOUNT 16 +ECellView * +e_cell_tree_view_get_subcell_view (ECellView *ect) +{ + return ((ECellTreeView *)ect)->subcell_view; +} + static ETreePath e_cell_tree_get_node (ETableModel *table_model, int row) { @@ -828,6 +837,8 @@ e_cell_tree_class_init (GObjectClass *object_class) ecc->get_bg_color = ect_get_bg_color; parent_class = g_type_class_ref (PARENT_TYPE); + + gal_a11y_e_cell_registry_add_cell_type (NULL, E_CELL_TREE_TYPE, gal_a11y_e_cell_tree_new); } E_MAKE_TYPE(e_cell_tree, "ECellTree", ECellTree, e_cell_tree_class_init, NULL, PARENT_TYPE) diff --git a/widgets/table/e-cell-tree.h b/widgets/table/e-cell-tree.h index 13462ee428..dfdd6f0191 100644 --- a/widgets/table/e-cell-tree.h +++ b/widgets/table/e-cell-tree.h @@ -41,6 +41,7 @@ G_BEGIN_DECLS #define E_IS_CELL_TREE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_TREE_TYPE)) #define E_IS_CELL_TREE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_TREE_TYPE)) + typedef struct { ECell parent; @@ -67,6 +68,7 @@ void e_cell_tree_construct (ECellTree *ect, gboolean draw_lines, ECell *subcell); +ECellView *e_cell_tree_view_get_subcell_view (ECellView *ect); G_END_DECLS |