aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--a11y/e-table/gal-a11y-e-cell-popup.c143
-rw-r--r--a11y/e-table/gal-a11y-e-cell-popup.h64
-rw-r--r--widgets/table/e-cell-popup.c5
-rw-r--r--widgets/table/e-table-item.c2
4 files changed, 212 insertions, 2 deletions
diff --git a/a11y/e-table/gal-a11y-e-cell-popup.c b/a11y/e-table/gal-a11y-e-cell-popup.c
new file mode 100644
index 0000000000..b1485fd42a
--- /dev/null
+++ b/a11y/e-table/gal-a11y-e-cell-popup.c
@@ -0,0 +1,143 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* vim:expandtab:shiftwidth=8:tabstop=8:
+ */
+/* Evolution Accessibility: gal-a11y-e-cell-popup.h
+ *
+ * Copyright (C) 2003 Ximian, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Yang Wu <yang.wu@sun.com> Sun Microsystem Inc., 2003
+ *
+ */
+
+#include <config.h>
+#include <gal/e-table/e-cell-popup.h>
+#include "gal-a11y-e-cell-popup.h"
+#include "gal-a11y-util.h"
+#include <atk/atkobject.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtkwidget.h>
+
+static AtkObjectClass *parent_class = NULL;
+#define PARENT_TYPE (gal_a11y_e_cell_get_type ())
+
+static void gal_a11y_e_cell_popup_class_init (GalA11yECellPopupClass *klass);
+static void popup_cell_action (GalA11yECell *cell);
+
+/**
+ * gal_a11y_e_cell_popup_get_type:
+ * @void:
+ *
+ * Registers the &GalA11yECellPopup class if necessary, and returns the type ID
+ * associated to it.
+ *
+ * Return value: The type ID of the &GalA11yECellPopup class.
+ **/
+GType
+gal_a11y_e_cell_popup_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type) {
+ GTypeInfo info = {
+ sizeof (GalA11yECellPopupClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gal_a11y_e_cell_popup_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (GalA11yECellPopup),
+ 0,
+ (GInstanceInitFunc) NULL,
+ NULL /* value_cell_popup */
+ };
+
+ type = g_type_register_static (PARENT_TYPE, "GalA11yECellPopup", &info, 0);
+ gal_a11y_e_cell_type_add_action_interface (type);
+ }
+
+ return type;
+}
+
+static void
+gal_a11y_e_cell_popup_class_init (GalA11yECellPopupClass *klass)
+{
+ AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_ref (PARENT_TYPE);
+}
+
+AtkObject *
+gal_a11y_e_cell_popup_new (ETableItem *item,
+ ECellView *cell_view,
+ AtkObject *parent,
+ int model_col,
+ int view_col,
+ int row)
+{
+ AtkObject *a11y;
+ GalA11yECell *cell;
+ ECellPopup *popupcell;
+
+ g_return_val_if_fail (a11y != NULL, NULL);
+ popupcell= E_CELL_POPUP(cell_view->ecell);
+ ECellView* child_view =popupcell->popup_cell_view->child_view;
+ if (child_view->ecell) {
+ a11y = gal_a11y_e_cell_registry_get_object (NULL,
+ item,
+ child_view,
+ parent,
+ model_col,
+ view_col,
+ row);
+ } else {
+ a11y = g_object_new (GAL_A11Y_TYPE_E_CELL_POPUP, NULL);
+ gal_a11y_e_cell_construct (a11y,
+ item,
+ cell_view,
+ parent,
+ model_col,
+ view_col,
+ row);
+ }
+ g_return_val_if_fail (a11y != NULL, NULL);
+ cell = GAL_A11Y_E_CELL(a11y);
+ gal_a11y_e_cell_add_action (cell,
+ "popup", /* action name*/
+ "popup a child", /* action description */
+ "<Alt>Down", /* action keybinding */
+ popup_cell_action);
+
+ a11y->role = ATK_ROLE_TABLE_CELL;
+ return a11y;
+}
+
+static void
+popup_cell_action (GalA11yECell *cell)
+{
+ ECellPopup *ecp;
+ gint finished;
+ GdkEvent event;
+
+ event.key.type = GDK_KEY_PRESS;
+ event.key.window = GTK_LAYOUT(GNOME_CANVAS_ITEM(cell->item)->canvas)->bin_window;;
+ event.key.send_event = TRUE;
+ event.key.time = GDK_CURRENT_TIME;
+ event.key.state = GDK_MOD1_MASK;
+ event.key.keyval = GDK_Down;
+
+ g_signal_emit_by_name (cell->item, "event", &event, &finished);
+}
diff --git a/a11y/e-table/gal-a11y-e-cell-popup.h b/a11y/e-table/gal-a11y-e-cell-popup.h
new file mode 100644
index 0000000000..5809f9b4f4
--- /dev/null
+++ b/a11y/e-table/gal-a11y-e-cell-popup.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* vim:expandtab:shiftwidth=8:tabstop=8:
+ */
+/* Evolution Accessibility: gal-a11y-e-cell-popup.h
+ *
+ * Copyright (C) 2003 Ximian, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Yang Wu <yang.wu@sun.com> Sun Microsystem Inc., 2003
+ *
+ */
+
+#ifndef __GAL_A11Y_E_CELL_POPUP_H__
+#define __GAL_A11Y_E_CELL_POPUP_H__
+
+#include <glib-object.h>
+#include <gal/e-table/e-table-item.h>
+#include <a11y/e-table/gal-a11y-e-cell.h>
+#include <atk/atkgobjectaccessible.h>
+
+#define GAL_A11Y_TYPE_E_CELL_POPUP (gal_a11y_e_cell_popup_get_type ())
+#define GAL_A11Y_E_CELL_POPUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAL_A11Y_TYPE_E_CELL_POPUP, GalA11yECellPopup))
+#define GAL_A11Y_E_CELL_POPUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAL_A11Y_TYPE_E_CELL_POPUP, GalA11yECellPopupClass))
+#define GAL_A11Y_IS_E_CELL_POPUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAL_A11Y_TYPE_E_CELL_POPUP))
+#define GAL_A11Y_IS_E_CELL_POPUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAL_A11Y_TYPE_E_CELL_POPUP))
+
+typedef struct _GalA11yECellPopup GalA11yECellPopup;
+typedef struct _GalA11yECellPopupClass GalA11yECellPopupClass;
+
+/* This struct should actually be larger as this isn't what we derive from.
+ * The GalA11yECellPopupPrivate comes right after the parent class structure.
+ **/
+struct _GalA11yECellPopup {
+ GalA11yECell object;
+};
+
+struct _GalA11yECellPopupClass {
+ GalA11yECellClass parent_class;
+};
+
+
+/* Standard Glib function */
+GType gal_a11y_e_cell_popup_get_type (void);
+AtkObject *gal_a11y_e_cell_popup_new (ETableItem *item,
+ ECellView *cell_view,
+ AtkObject *parent,
+ int model_col,
+ int view_col,
+ int row);
+
+#endif /* ! __GAL_A11Y_E_CELL_POPUP_H__ */
diff --git a/widgets/table/e-cell-popup.c b/widgets/table/e-cell-popup.c
index 3c5eccbee3..010f4263a7 100644
--- a/widgets/table/e-cell-popup.c
+++ b/widgets/table/e-cell-popup.c
@@ -33,7 +33,7 @@
#include "gal/util/e-util.h"
#include "e-table-item.h"
#include "e-cell-popup.h"
-
+#include "gal/a11y/e-table/gal-a11y-e-cell-popup.h"
#define E_CELL_POPUP_ARROW_WIDTH 16
#define E_CELL_POPUP_ARROW_XPAD 3
@@ -140,6 +140,9 @@ e_cell_popup_class_init (GtkObjectClass *object_class)
ecc->get_bg_color = ecp_get_bg_color;
parent_class = g_type_class_ref (E_CELL_TYPE);
+ gal_a11y_e_cell_registry_add_cell_type (NULL,
+ E_CELL_POPUP_TYPE,
+ gal_a11y_e_cell_popup_new);
}
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
index 70d1213fa9..dd5a040c1d 100644
--- a/widgets/table/e-table-item.c
+++ b/widgets/table/e-table-item.c
@@ -2656,7 +2656,7 @@ eti_event (GnomeCanvasItem *item, GdkEvent *e)
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, cursor_row, E_CELL_CURSOR))
+ 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);