/*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser 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 Lesser General Public License
* along with this program; if not, see .
*
*
* Authors:
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#include "gal-a11y-e-cell-toggle.h"
#include
#include
#include "e-cell-toggle.h"
#include "e-table-model.h"
#define PARENT_TYPE (gal_a11y_e_cell_get_type ())
static GObjectClass *parent_class;
static void
gal_a11y_e_cell_toggle_dispose (GObject *object)
{
GalA11yECellToggle *a11y = GAL_A11Y_E_CELL_TOGGLE (object);
ETableModel *e_table_model = GAL_A11Y_E_CELL (a11y)->item->table_model;
if (e_table_model && a11y->model_id > 0) {
g_signal_handler_disconnect (e_table_model, a11y->model_id);
a11y->model_id = 0;
}
if (parent_class->dispose)
parent_class->dispose (object);
}
static void
ect_get_current_value (AtkValue *obj,
GValue *value)
{
gint val;
GalA11yECell *cell = GAL_A11Y_E_CELL (obj);
val = GPOINTER_TO_INT (e_table_model_value_at (cell->cell_view->e_table_model, cell->model_col, cell->row));
memset (value, 0, sizeof (GValue));
g_value_init (value, G_TYPE_DOUBLE);
g_value_set_double (value, val);
}
static void
ect_value_iface_init (AtkValueIface *iface)
{
iface->get_current_value = ect_get_current_value;
}
G_DEFINE_TYPE_WITH_CODE (GalA11yECellToggle,
gal_a11y_e_cell_toggle,
GAL_A11Y_TYPE_E_CELL,
gal_a11y_e_cell_type_add_action_interface (g_define_type_id);
G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, ect_value_iface_init))
static void
gal_a11y_e_cell_toggle_class_init (GalA11yECellToggleClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
object_class->dispose = gal_a11y_e_cell_toggle_dispose;
parent_class = g_type_class_ref (PARENT_TYPE);
}
static void
gal_a11y_e_cell_toggle_init (GalA11yECellToggle *toggle)
{
}
static void
toggle_cell_action (GalA11yECell *cell)
{
gint finished;
GtkLayout *layout;
GdkEventButton event;
gint x, y, width, height;
gint row, col;
row = cell->row;
col = cell->view_col;
layout = GTK_LAYOUT (GNOME_CANVAS_ITEM (cell->item)->canvas);
e_table_item_get_cell_geometry (
cell->item, &row, &col, &x, &y, &width, &height);
event.x = x + width / 2 + (gint)(GNOME_CANVAS_ITEM (cell->item)->x1);
event.y = y + height / 2 + (gint)(GNOME_CANVAS_ITEM (cell->item)->y1);
event.type = GDK_BUTTON_PRESS;
event.window = gtk_layout_get_bin_window (layout);
event.button = 1;
event.send_event = TRUE;
event.time = GDK_CURRENT_TIME;
event.axes = NULL;
g_signal_emit_by_name (cell->item, "event", &event, &finished);
}
static void
update_cell (GalA11yECell *cell,
gboolean notify)
{
gint value;
const gchar *name;
value = GPOINTER_TO_INT (e_table_model_value_at (cell->cell_view->e_table_model, cell->model_col, cell->row));
name = e_cell_toggle_get_icon_description (E_CELL_TOGGLE (cell->cell_view->ecell), value);
if (name)
atk_object_set_name (ATK_OBJECT (cell), name);
if (value && !name)
gal_a11y_e_cell_add_state (cell, ATK_STATE_CHECKED, notify);
else
gal_a11y_e_cell_remove_state (cell, ATK_STATE_CHECKED, notify);
}
static void
model_change_cb (ETableModel *etm,
gint col,
gint row,
GalA11yECell *cell)
{
if (col == cell->model_col && row == cell->row)
update_cell (cell, TRUE);
}
AtkObject *
gal_a11y_e_cell_toggle_new (ETableItem *item,
ECellView *cell_view,
AtkObject *parent,
gint model_col,
gint view_col,
gint row)
{
AtkObject *a11y;
GalA11yECell *cell;
GalA11yECellToggle *toggle_cell;
a11y = ATK_OBJECT (g_object_new (GAL_A11Y_TYPE_E_CELL_TOGGLE, NULL));
g_return_val_if_fail (a11y != NULL, NULL);
cell = GAL_A11Y_E_CELL (a11y);
toggle_cell = GAL_A11Y_E_CELL_TOGGLE (a11y);
a11y->role = ATK_ROLE_TABLE_CELL;
gal_a11y_e_cell_construct (
a11y,
item,
cell_view,
parent,
model_col,
view_col,
row);
gal_a11y_e_cell_add_action (
cell,
"toggle",
/* Translators: description of a "toggle" action */
_("toggle the cell"),
NULL, /* action keybinding */
toggle_cell_action);
toggle_cell->model_id = g_signal_connect (
item->table_model, "model_cell_changed",
(GCallback) model_change_cb, a11y);
update_cell (cell, FALSE);
return a11y;
}