/* * e-cell-checkbox.c: Checkbox cell renderer * * Author: * Miguel de Icaza (miguel@kernel.org) * * (C) 1999 Helix Code, Inc */ #include #include #include #include #include #include #include #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; }