/*
* e-cell-checkbox.c: Checkbox cell renderer
*
* Author:
* Miguel de Icaza (miguel@kernel.org)
*
* (C) 1999 Helix Code, Inc
*/
#include <config.h>
#include <gtk/gtkenums.h>
#include <gtk/gtkentry.h>
#include <gtk/gtkwindow.h>
#include <gtk/gtksignal.h>
#include <gdk/gdkkeysyms.h>
#include <libgnomeui/gnome-canvas.h>
#include "e-cell-checkbox.h"
#include "e-util.h"
#include "e-table-item.h"
#define PARENT_TYPE e_cell_get_type()
typedef struct {
ECellView cell_view;
GdkGC *gc;
GnomeCanvas *canvas;
ETableItem *eti;
} ECellCheckboxView;
static ECellClass *parent_class;
static void
eccb_queue_redraw (ECellCheckboxView *text_view, int col, int row)
{
e_table_item_redraw_range (text_view->eti, col, row, col, row);
}
/*
* ECell::realize method
*/
static ECellView *
eecb_realize (ECell *ecell, void *view)
{
ECellCheckbox *eccb = E_CELL_CHECKBOX (ecell);
ECellCheckboxView *check_view = g_new0 (ECellCheckboxView, 1);
ETableItem *eti = E_TABLE_ITEM (view);
GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
check_view->cell_view.ecell = ecell;
check_view->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
check_view->eti = eti;
check_view->canvas = canvas;
return (ECellView *) check_view;
}
/*
* ECell::unrealize method
*/
static void
eecb_unrealize (ECellView *ecv)
{
ECellCheckboxView *check_view = (ECellCheckboxView *) ecv;
gdk_gc_unref (check_view->gc);
text_view->gc = NULL;
g_free (check_view);
}
/*
* ECell::draw method
*/
static void
eecb_draw (ECellView *ecell_view, GdkDrawable *drawable,
int col, int row, gboolean selected,
int x1, int y1, int x2, int y2)
{
}
/*
* ECell::event method
*/
static gint
eecb_event (ECellView *ecell_view, GdkEvent *event, int col, int row)
{
ECellCheckboxView *text_view = (ECellCheckboxView *) ecell_view;
switch (event->type){
case GDK_BUTTON_PRESS:
/*
* Adjust for the border we use
*/
event->button.x++;
printf ("Button pressed at %g %g\n", event->button.x, event->button.y);
if (text_view->edit){
printf ("FIXME: Should handle click here\n");
} else
e_table_item_enter_edit (text_view->eti, col, row);
break;
case GDK_BUTTON_RELEASE:
/*
* Adjust for the border we use
*/
event->button.x++;
printf ("Button released at %g %g\n", event->button.x, event->button.y);
return TRUE;
case GDK_KEY_PRESS:
if (event->key.keyval == GDK_Escape){
eecb_cancel_edit (text_view);
return TRUE;
}
if (!text_view->edit){
e_table_item_enter_edit (text_view->eti, col, row);
eecb_edit_seleecb_all (text_view);
}
gtk_widget_event (GTK_WIDGET (text_view->edit->entry), event);
eecb_queue_redraw (text_view, col, row);
break;
case GDK_KEY_RELEASE:
break;
default:
return FALSE;
}
return TRUE;
}
/*
* ECell::height method
*/
static int
eecb_height (ECellView *ecell_view, int col, int row)
{
return 10;
}
/*
* ECellView::enter_edit method
*/
static void *
eecb_enter_edit (ECellView *ecell_view, int col, int row)
{
}
/*
* ECellView::leave_edit method
*/
static void
eecb_leave_edit (ECellView *ecell_view, int col, int row, void *edit_context)
{
}
static void
e_cell_checkbox_class_init (GtkObjectClass *object_class)
{
ECellClass *ecc = (ECellClass *) object_class;
ecc->realize = eecb_realize;
ecc->unrealize = eecb_unrealize;
ecc->draw = eecb_draw;
ecc->event = eecb_event;
ecc->height = eecb_height;
ecc->enter_edit = eecb_enter_edit;
ecc->leave_edit = eecb_leave_edit;
parent_class = gtk_type_class (PARENT_TYPE);
}
E_MAKE_TYPE(e_cell_text, "ECellCheckbox", ECellCheckbox, e_cell_checkbox_class_init, NULL, PARENT_TYPE);
ECell *
e_cell_checkbox_new (ETableModel *etm)
{
ECellCheckbox *eccb = gtk_type_new (e_cell_checkbox_get_type ());
E_CELL (eccb)->table_model = etm;
return (ECell *) eccb;
}