aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
authorLi Yuan <li.yuan@sun.com>2005-01-27 13:16:19 +0800
committerHarry Lu <haip@src.gnome.org>2005-01-27 13:16:19 +0800
commitd8d481373ff47bc77432b2f8d8de91afd1bd02a0 (patch)
tree8e8965a9867437704b2a317f2a52ff1a0880f71d /widgets
parent7b6ba9e828c68f9229bcb8ad41a550119260aef6 (diff)
downloadgsoc2013-evolution-d8d481373ff47bc77432b2f8d8de91afd1bd02a0.tar.gz
gsoc2013-evolution-d8d481373ff47bc77432b2f8d8de91afd1bd02a0.tar.zst
gsoc2013-evolution-d8d481373ff47bc77432b2f8d8de91afd1bd02a0.zip
add an a11y name for the popup list. make shortcut key ALT+Arrow work.
2005-01-27 Li Yuan <li.yuan@sun.com> * e-cell-combo.c: (e_cell_combo_init), (e_cell_combo_do_popup), (e_cell_combo_list_button_press), (e_cell_combo_button_press), (e_cell_combo_button_release), (e_cell_combo_key_press): add an a11y name for the popup list. make shortcut key ALT+Arrow work. Fixes #70261 * e-cell-text.c: (e_cell_text_class_init), (_delete_selection), (_insert): add "text_inserted" and "text_deleted" signals to notify the text has been changed. (e_cell_text_get_text_by_view): new helper function to get the text being editted. * e-cell-text.h: add signal declaration. * e-cell-toggle.c: (etog_draw): add range check for negative values. * e-cell-vbox.c: (e_cell_vbox_class_init): * e-cell-vbox.h: make ECellVboxView public since it will be used in a11y part. * e-table-click-to-add.c: (etcta_style_set), (create_rect_and_text), (etcta_realize), (etcta_class_init), (e_table_click_to_add_commit): add "style_set" signal to click_to_add and implement the style_set function. (etcta_init): add a11y name to click to add. * e-table-click-to-add.h: add "style_set" signal to click_to_add and implement the style_set function. * e-table-config.c: (config_button_up), (config_button_down): check whether the columns are empty. * e-table-group-container.c: * e-table-group-container.h: make ETableGroupContainerChildNode public since it will be used in a11y part. * e-table-item.c: (eti_init): init eti->cols. (eti_event): at GDK_KEY_PRESS event and GDK_Down key pressed, we check view_col value before we pass it to eti_e_cell_event. (eti_class_init): call the new initialize function * e-table.c: (table_canvas_focus_event_cb): if canvas has a focused item but the etable does not have a cursor row, just focus the first item after check whether the click_to_add should get the focus. svn path=/trunk/; revision=28571
Diffstat (limited to 'widgets')
-rw-r--r--widgets/table/e-cell-combo.c10
-rw-r--r--widgets/table/e-cell-text.c74
-rw-r--r--widgets/table/e-cell-text.h6
-rw-r--r--widgets/table/e-cell-toggle.c2
-rw-r--r--widgets/table/e-cell-vbox.c11
-rw-r--r--widgets/table/e-cell-vbox.h7
-rw-r--r--widgets/table/e-table-click-to-add.c110
-rw-r--r--widgets/table/e-table-click-to-add.h1
-rw-r--r--widgets/table/e-table-config.c10
-rw-r--r--widgets/table/e-table-group-container.c9
-rw-r--r--widgets/table/e-table-group-container.h10
-rw-r--r--widgets/table/e-table-item.c15
-rw-r--r--widgets/table/e-table.c8
13 files changed, 210 insertions, 63 deletions
diff --git a/widgets/table/e-cell-combo.c b/widgets/table/e-cell-combo.c
index 5b66fba28e..3ff3488ae5 100644
--- a/widgets/table/e-cell-combo.c
+++ b/widgets/table/e-cell-combo.c
@@ -56,6 +56,7 @@
#include <string.h> /* strcmp() */
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
+#include <glib/gi18n.h>
#include "gal/util/e-util.h"
#include "gal/widgets/e-unicode.h"
#include "e-table-item.h"
@@ -135,6 +136,7 @@ static void
e_cell_combo_init (ECellCombo *ecc)
{
GtkWidget *frame;
+ AtkObject *a11y;
/* We create one popup window for the ECell, since there will only
ever be one popup in use at a time. */
@@ -167,6 +169,9 @@ e_cell_combo_init (ECellCombo *ecc)
gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window)));
gtk_widget_show (ecc->popup_list);
+ a11y = gtk_widget_get_accessible (ecc->popup_list);
+ atk_object_set_name (a11y, _("popup list"));
+
g_signal_connect (ecc->popup_list,
"selection_changed",
G_CALLBACK (e_cell_combo_selection_changed),
@@ -285,6 +290,7 @@ e_cell_combo_do_popup (ECellPopup *ecp,
if (error_code != 0)
g_warning ("Failed to get pointer grab (%i)", error_code);
gtk_grab_add (ecc->popup_window);
+ gdk_keyboard_grab (ecc->popup_list->window, TRUE, time);
return TRUE;
}
@@ -516,6 +522,7 @@ e_cell_combo_list_button_press(GtkWidget *popup_list, GdkEvent *event, ECellComb
e_cell_combo_update_cell (ecc);
gtk_grab_remove (ecc->popup_window);
gdk_pointer_ungrab (event->button.time);
+ gdk_keyboard_ungrab (event->button.time);
gtk_widget_hide (ecc->popup_window);
e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
@@ -555,6 +562,7 @@ e_cell_combo_button_press (GtkWidget *popup_window,
gtk_grab_remove (ecc->popup_window);
gdk_pointer_ungrab (event->button.time);
+ gdk_keyboard_ungrab (event->button.time);
gtk_widget_hide (ecc->popup_window);
e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
@@ -596,6 +604,7 @@ e_cell_combo_button_release (GtkWidget *popup_window,
update the cell to reflect the new selection. */
gtk_grab_remove (ecc->popup_window);
gdk_pointer_ungrab (event->time);
+ gdk_keyboard_ungrab (event->time);
gtk_widget_hide (ecc->popup_window);
e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
@@ -625,6 +634,7 @@ e_cell_combo_key_press (GtkWidget *popup_window,
gtk_grab_remove (ecc->popup_window);
gdk_pointer_ungrab (event->time);
+ gdk_keyboard_ungrab (event->time);
gtk_widget_hide (ecc->popup_window);
e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
diff --git a/widgets/table/e-cell-text.c b/widgets/table/e-cell-text.c
index ecb9117e1c..cbc0fddca8 100644
--- a/widgets/table/e-cell-text.c
+++ b/widgets/table/e-cell-text.c
@@ -59,6 +59,7 @@
#define d(x)
#define DO_SELECTION 1
+#define VIEW_TO_CELL(view) E_CELL_TEXT (((ECellView *)view)->ecell)
#if d(!)0
#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)), g_print ("%s: e_table_item_leave_edit\n", __FUNCTION__))
@@ -94,6 +95,15 @@ enum {
E_SELECTION_CLIPBOARD
};
+/* signals */
+enum {
+ TEXT_INSERTED,
+ TEXT_DELETED,
+ LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0 };
+
static GdkAtom clipboard_atom = GDK_NONE;
#define PARENT_TYPE e_cell_get_type ()
@@ -1698,6 +1708,30 @@ e_cell_text_class_init (GObjectClass *object_class)
parent_class = g_type_class_ref (PARENT_TYPE);
+ signals [TEXT_INSERTED] =
+ g_signal_new ("text_inserted",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ECellTextClass, text_inserted),
+ NULL, NULL,
+ e_marshal_VOID__POINTER_INT_INT_INT_INT,
+ G_TYPE_NONE, 5,
+ G_TYPE_POINTER, G_TYPE_INT, G_TYPE_INT,
+ G_TYPE_INT, G_TYPE_INT);
+
+ signals [TEXT_DELETED] =
+ g_signal_new ("text_deleted",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ECellTextClass, text_deleted),
+ NULL, NULL,
+ e_marshal_VOID__POINTER_INT_INT_INT_INT,
+ G_TYPE_NONE, 5,
+ G_TYPE_POINTER, G_TYPE_INT, G_TYPE_INT,
+ G_TYPE_INT, G_TYPE_INT);
+
+
+
g_object_class_install_property (object_class, PROP_STRIKEOUT_COLUMN,
g_param_spec_int ("strikeout_column",
_("Strikeout Column"),
@@ -2182,6 +2216,8 @@ _delete_selection (ECellTextView *text_view)
memmove (sp, ep, length);
edit->selection_end = edit->selection_start;
+
+ g_signal_emit (VIEW_TO_CELL (text_view), signals[TEXT_DELETED], 0, text_view, edit->selection_start, ep-sp, edit->row, edit->model_col);
}
/* fixme: */
@@ -2209,6 +2245,8 @@ _insert (ECellTextView *text_view, char *string, int value)
edit->selection_start += value;
edit->selection_end = edit->selection_start;
+
+ g_signal_emit (VIEW_TO_CELL (text_view), signals[TEXT_INSERTED], 0, text_view, edit->selection_end-value, value, edit->row, edit->model_col);
}
static void
@@ -2778,3 +2816,39 @@ e_cell_text_delete_selection (ECellView *cell_view, gint col, gint row)
command.position = E_TEP_SELECTION;
e_cell_text_view_command (edit->tep, &command, edit);
}
+
+/**
+ * e_cell_text_get_text_by_view:
+ * @cell_view: the given cell view
+ * @col: column of the given cell in the model
+ * @row: row of the given cell in the model
+ *
+ * Get the cell's text directly from CellEdit,
+ * during editting this cell, the cell's text value maybe inconsistant
+ * with the text got from table_model.
+ * The caller should free the text after using it.
+ *
+ * This API is most likely to be used by a11y implementations.
+ */
+char *
+e_cell_text_get_text_by_view (ECellView *cell_view, gint col, gint row)
+{
+ ECellTextView *ectv;
+ CellEdit *edit;
+ gchar *ret, *model_text;
+
+ ectv = (ECellTextView *)cell_view;
+ edit = ectv->edit;
+
+ if (edit && ectv->edit->row == row && ectv->edit->model_col == col) { /* being editted now */
+ ret = g_strdup (edit->text);
+ } else{
+ model_text = e_cell_text_get_text (E_CELL_TEXT (cell_view->ecell),
+ cell_view->e_table_model, col, row);
+ ret = g_strdup (model_text);
+ e_cell_text_free_text (E_CELL_TEXT (cell_view->ecell), model_text);
+ }
+
+ return ret;
+
+}
diff --git a/widgets/table/e-cell-text.h b/widgets/table/e-cell-text.h
index 5310ffc5f9..0ef32b9ede 100644
--- a/widgets/table/e-cell-text.h
+++ b/widgets/table/e-cell-text.h
@@ -84,6 +84,9 @@ typedef struct {
char *(*get_text) (ECellText *cell, ETableModel *model, int col, int row);
void (*free_text) (ECellText *cell, char *text);
void (*set_value) (ECellText *cell, ETableModel *model, int col, int row, const char *text);
+ /* signal handlers */
+ void (*text_inserted) (ECellText *cell, ECellView *cell_view, int pos, int len, int row, int model_col);
+ void (*text_deleted) (ECellText *cell, ECellView *cell_view, int pos, int len, int row, int model_col);
} ECellTextClass;
GType e_cell_text_get_type (void);
@@ -116,6 +119,9 @@ void e_cell_text_paste_clipboard (ECellView *cell_view, gint col, gint row);
/* Deletes selected text */
void e_cell_text_delete_selection (ECellView *cell_view, gint col, gint row);
+/* get text directly from view, both col and row are model format */
+char *e_cell_text_get_text_by_view (ECellView *cell_view, gint col, gint row);
+
G_END_DECLS
#endif /* _E_CELL_TEXT_H_ */
diff --git a/widgets/table/e-cell-toggle.c b/widgets/table/e-cell-toggle.c
index f334c3f6ca..34e8a8b76d 100644
--- a/widgets/table/e-cell-toggle.c
+++ b/widgets/table/e-cell-toggle.c
@@ -201,7 +201,7 @@ etog_draw (ECellView *ecell_view, GdkDrawable *drawable,
selected = flags & E_CELL_SELECTED;
- if (value >= toggle->n_states){
+ if (value < 0 || value >= toggle->n_states){
g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
value, toggle->n_states);
return;
diff --git a/widgets/table/e-cell-vbox.c b/widgets/table/e-cell-vbox.c
index ab86e307c9..ee18694742 100644
--- a/widgets/table/e-cell-vbox.c
+++ b/widgets/table/e-cell-vbox.c
@@ -42,18 +42,13 @@
#include <gdk/gdkkeysyms.h>
#include "gal/util/e-util.h"
+#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h"
+#include "gal/a11y/e-table/gal-a11y-e-cell-vbox.h"
#include "e-table-item.h"
#include "e-cell-vbox.h"
#define PARENT_TYPE e_cell_get_type ()
-typedef struct {
- ECellView cell_view;
- int subcell_view_count;
- ECellView **subcell_views;
- int *model_cols;
-} ECellVboxView;
-
static ECellClass *parent_class;
#define INDENT_AMOUNT 16
@@ -443,6 +438,8 @@ e_cell_vbox_class_init (GObjectClass *object_class)
#endif
parent_class = g_type_class_ref (PARENT_TYPE);
+
+ gal_a11y_e_cell_registry_add_cell_type (NULL, E_CELL_VBOX_TYPE, gal_a11y_e_cell_vbox_new);
}
static void
diff --git a/widgets/table/e-cell-vbox.h b/widgets/table/e-cell-vbox.h
index 93ddc6d25c..f08e106128 100644
--- a/widgets/table/e-cell-vbox.h
+++ b/widgets/table/e-cell-vbox.h
@@ -50,6 +50,13 @@ typedef struct {
} ECellVbox;
typedef struct {
+ ECellView cell_view;
+ int subcell_view_count;
+ ECellView **subcell_views;
+ int *model_cols;
+} ECellVboxView;
+
+typedef struct {
ECellClass parent_class;
} ECellVboxClass;
diff --git a/widgets/table/e-table-click-to-add.c b/widgets/table/e-table-click-to-add.c
index c02e3b8869..69095c28d3 100644
--- a/widgets/table/e-table-click-to-add.c
+++ b/widgets/table/e-table-click-to-add.c
@@ -29,7 +29,8 @@
#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <atk/atkregistry.h>
-
+#include <atk/atkutil.h>
+#include <atk/atkgobjectaccessible.h>
#include "e-table-header.h"
#include "e-table-click-to-add.h"
#include "e-table-defines.h"
@@ -44,6 +45,7 @@
enum {
CURSOR_CHANGE,
+ STYLE_SET,
LAST_SIGNAL
};
@@ -73,6 +75,26 @@ etcta_cursor_change (GtkObject *object, gint row, gint col, ETableClickToAdd *et
}
static void
+etcta_style_set (ETableClickToAdd *etcta, GtkStyle *previous_style)
+{
+ GtkWidget *widget = GTK_WIDGET(GNOME_CANVAS_ITEM(etcta)->canvas);
+
+ if (etcta->rect) {
+ gnome_canvas_item_set (etcta->rect,
+ "outline_color_gdk", &widget->style->fg[GTK_STATE_NORMAL],
+ "fill_color_gdk", &widget->style->bg[GTK_STATE_NORMAL],
+ NULL );
+
+ }
+
+ if (etcta->text)
+ gnome_canvas_item_set (etcta->text,
+ "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
+ NULL);
+
+}
+
+static void
etcta_add_table_header (ETableClickToAdd *etcta, ETableHeader *header)
{
etcta->eth = header;
@@ -215,6 +237,33 @@ etcta_set_property (GObject *object, guint prop_id, const GValue *value, GParamS
}
static void
+create_rect_and_text (ETableClickToAdd *etcta)
+{
+ GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM(etcta)->canvas);
+
+ if (!etcta->rect)
+ etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
+ gnome_canvas_rect_get_type(),
+ "x1", (double) 0,
+ "y1", (double) 0,
+ "x2", (double) etcta->width - 1,
+ "y2", (double) etcta->height - 1,
+ "outline_color_gdk", &widget->style->fg[GTK_STATE_NORMAL],
+ "fill_color_gdk", &widget->style->bg[GTK_STATE_NORMAL],
+ NULL);
+
+ if (!etcta->text)
+ etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
+ e_text_get_type(),
+ "text", etcta->message ? etcta->message : "",
+ "anchor", GTK_ANCHOR_NW,
+ "width", etcta->width - 4,
+ "draw_background", FALSE,
+ "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
+ NULL);
+}
+
+static void
etcta_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
ETableClickToAdd *etcta;
@@ -248,23 +297,7 @@ etcta_realize (GnomeCanvasItem *item)
{
ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
- etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) etcta->width - 1,
- "y2", (double) etcta->height - 1,
- "outline_color", "black",
- "fill_color", "white",
- NULL);
-
- etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
- e_text_get_type(),
- "text", etcta->message ? etcta->message : "",
- "anchor", GTK_ANCHOR_NW,
- "width", etcta->width - 4,
- "draw_background", FALSE,
- NULL);
+ create_rect_and_text (etcta);
e_canvas_item_move_absolute (etcta->text, 2, 2);
if (GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->realize)
@@ -448,6 +481,7 @@ etcta_class_init (ETableClickToAddClass *klass)
etcta_parent_class = g_type_class_ref (PARENT_OBJECT_TYPE);
klass->cursor_change = NULL;
+ klass->style_set = etcta_style_set;
object_class->dispose = etcta_dispose;
object_class->set_property = etcta_set_property;
@@ -501,6 +535,16 @@ etcta_class_init (ETableClickToAddClass *klass)
e_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
+ etcta_signals [STYLE_SET] =
+ g_signal_new ("style_set",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (ETableClickToAddClass, style_set),
+ NULL, NULL,
+ e_marshal_NONE__OBJECT,
+ G_TYPE_NONE, 1, GTK_TYPE_STYLE);
+
+
atk_registry_set_factory_type (atk_get_default_registry (),
E_TABLE_CLICK_TO_ADD_TYPE,
gal_a11y_e_table_click_to_add_factory_get_type ());
@@ -511,6 +555,7 @@ static void
etcta_init (GnomeCanvasItem *item)
{
ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
+ AtkObject *a11y;
etcta->one = NULL;
etcta->model = NULL;
@@ -527,6 +572,12 @@ etcta_init (GnomeCanvasItem *item)
G_CALLBACK (etcta_cursor_change), etcta);
e_canvas_item_set_reflow_callback(item, etcta_reflow);
+
+ /* create its a11y object at this time if accessibility is enabled*/
+ if (atk_get_root () != NULL) {
+ a11y = atk_gobject_accessible_for_object (G_OBJECT (etcta));
+ atk_object_set_name (a11y, _("click to add"));
+ }
}
E_MAKE_TYPE(e_table_click_to_add, "ETableClickToAdd", ETableClickToAdd, etcta_class_init, etcta_init, PARENT_OBJECT_TYPE)
@@ -549,25 +600,6 @@ e_table_click_to_add_commit (ETableClickToAdd *etcta)
gtk_object_destroy(GTK_OBJECT (etcta->row));
etcta->row = NULL;
}
- if (!etcta->rect) {
- etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
- gnome_canvas_rect_get_type(),
- "x1", (double) 0,
- "y1", (double) 0,
- "x2", (double) etcta->width - 1,
- "y2", (double) etcta->height - 1,
- "outline_color", "black",
- "fill_color", "white",
- NULL);
- }
- if (!etcta->text) {
- etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
- e_text_get_type(),
- "text", etcta->message ? etcta->message : "",
- "anchor", GTK_ANCHOR_NW,
- "width", etcta->width - 4,
- "draw_background", FALSE,
- NULL);
- e_canvas_item_move_absolute (etcta->text, 3, 3);
- }
+ create_rect_and_text (etcta);
+ e_canvas_item_move_absolute (etcta->text, 3, 3);
}
diff --git a/widgets/table/e-table-click-to-add.h b/widgets/table/e-table-click-to-add.h
index f5417e23f9..42ffd42d07 100644
--- a/widgets/table/e-table-click-to-add.h
+++ b/widgets/table/e-table-click-to-add.h
@@ -66,6 +66,7 @@ typedef struct {
* signals
*/
void (*cursor_change) (ETableClickToAdd *etcta, gint row, gint col);
+ void (*style_set) (ETableClickToAdd *etcta, GtkStyle *previous_style);
} ETableClickToAddClass;
GType e_table_click_to_add_get_type (void);
diff --git a/widgets/table/e-table-config.c b/widgets/table/e-table-config.c
index 2ad23b7120..4e40c150fd 100644
--- a/widgets/table/e-table-config.c
+++ b/widgets/table/e-table-config.c
@@ -947,6 +947,11 @@ config_button_up (GtkWidget *widget, ETableConfig *config)
int i;
e_table_selected_row_foreach (config->shown, add_column, &columns);
+
+ /* if no columns left, just return */
+ if (columns == NULL)
+ return;
+
columns = g_list_reverse (columns);
new_shown = g_new (int, config->temp_state->col_count);
@@ -998,6 +1003,11 @@ config_button_down (GtkWidget *widget, ETableConfig *config)
e_table_selected_row_foreach (config->shown, add_column, &columns);
+ /* if no columns left, just return */
+ if (columns == NULL)
+ return;
+
+
new_shown = g_new (int, config->temp_state->col_count);
new_expansions = g_new (double, config->temp_state->col_count);
diff --git a/widgets/table/e-table-group-container.c b/widgets/table/e-table-group-container.c
index 61b8b9f1a5..2fc0617e8f 100644
--- a/widgets/table/e-table-group-container.c
+++ b/widgets/table/e-table-group-container.c
@@ -59,15 +59,6 @@ enum {
PROP_UNIFORM_ROW_HEIGHT
};
-typedef struct {
- ETableGroup *child;
- void *key;
- char *string;
- GnomeCanvasItem *text;
- GnomeCanvasItem *rect;
- gint count;
-} ETableGroupContainerChildNode;
-
static EPrintable *
etgc_get_printable (ETableGroup *etg);
diff --git a/widgets/table/e-table-group-container.h b/widgets/table/e-table-group-container.h
index b094167c09..d1809e48fd 100644
--- a/widgets/table/e-table-group-container.h
+++ b/widgets/table/e-table-group-container.h
@@ -84,6 +84,16 @@ typedef struct {
ETableGroupClass parent_class;
} ETableGroupContainerClass;
+typedef struct {
+ ETableGroup *child;
+ void *key;
+ char *string;
+ GnomeCanvasItem *text;
+ GnomeCanvasItem *rect;
+ gint count;
+} ETableGroupContainerChildNode;
+
+
ETableGroup *e_table_group_container_new (GnomeCanvasGroup *parent, ETableHeader *full_header, ETableHeader *header,
ETableModel *model, ETableSortInfo *sort_info, int n);
void e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
index a582502b7b..33798cc716 100644
--- a/widgets/table/e-table-item.c
+++ b/widgets/table/e-table-item.c
@@ -44,6 +44,7 @@
#include "gal/widgets/e-canvas.h"
#include "gal/widgets/e-canvas-utils.h"
#include "gal/util/e-util.h"
+#include "gal/a11y/e-table/gal-a11y-e-table-item.h"
#include "gal/util/e-i18n.h"
#include <string.h>
#include <stdlib.h>
@@ -1647,6 +1648,7 @@ eti_init (GnomeCanvasItem *item)
eti->cursor_y2 = -1;
eti->rows = -1;
+ eti->cols = -1;
eti->frozen_count = 0;
eti->queue_show_cursor = FALSE;
@@ -2669,9 +2671,10 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
case GDK_KP_Down:
if ((e->key.state & GDK_MOD1_MASK)
&& ((e->key.keyval == GDK_Down ) || (e->key.keyval == GDK_KP_Down))) {
- gint view_col = model_to_view_col(eti, cursor_col);
- if (eti_e_cell_event (eti, eti->cell_views [view_col], e, ((GdkEventKey *)e)->time, cursor_col, view_col, model_to_view_row(eti, cursor_row), E_CELL_CURSOR))
- return TRUE;
+ gint view_col = model_to_view_col(eti, cursor_col);
+ if ((view_col >= 0) && (view_col < eti->cols))
+ if (eti_e_cell_event (eti, eti->cell_views [view_col], e, ((GdkEventKey *)e)->time, cursor_col, view_col, model_to_view_row(eti, cursor_row), E_CELL_CURSOR))
+ return TRUE;
} else
return_val = e_selection_model_key_press(E_SELECTION_MODEL (eti->selection), (GdkEventKey *) e);
break;
@@ -3124,10 +3127,8 @@ eti_class_init (GObjectClass *object_class)
G_TYPE_NONE, 1,
G_TYPE_POINTER);
- atk_registry_set_factory_type (atk_get_default_registry (),
- E_TABLE_ITEM_TYPE,
- gal_a11y_e_table_item_factory_get_type ());
-
+ /* A11y Init */
+ gal_a11y_e_table_item_init ();
}
E_MAKE_TYPE (e_table_item,
diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c
index 00aa37e88b..200b78b151 100644
--- a/widgets/table/e-table.c
+++ b/widgets/table/e-table.c
@@ -1126,6 +1126,14 @@ table_canvas_focus_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer d
focus_first_etable_item (etable->group);
} else if (canvas->focused_item) {
ESelectionModel *selection = (ESelectionModel *)etable->selection;
+
+ /* check whether click_to_add already got the focus */
+ if (etable->click_to_add) {
+ GnomeCanvasItem *row = E_TABLE_CLICK_TO_ADD(etable->click_to_add)->row;
+ if (canvas->focused_item == row)
+ return TRUE;
+ }
+
if (e_selection_model_cursor_row (selection) == -1)
focus_first_etable_item (etable->group);
}