From da4c37043ecbd7f1c74315f88db36dfa195d6c64 Mon Sep 17 00:00:00 2001 From: Arturo Espinosa Date: Fri, 19 Nov 1999 05:34:23 +0000 Subject: New E-table-item.[ch] -mig svn path=/trunk/; revision=1419 --- widgets/e-table/ChangeLog | 11 ++ widgets/e-table/Makefile.am | 4 +- widgets/e-table/ROADMAP.e-table | 57 ++++++++ widgets/e-table/e-table-col.c | 2 +- widgets/e-table/e-table-column-item.c | 2 +- widgets/e-table/e-table-column.c | 2 +- widgets/e-table/e-table-group.c | 2 +- widgets/e-table/e-table-header-item.c | 3 +- widgets/e-table/e-table-header.c | 2 +- widgets/e-table/e-table-item.c | 248 ++++++++++++++++++++++++++++++++++ widgets/e-table/e-table-item.h | 36 +++++ widgets/e-table/e-table-model.c | 31 ++++- widgets/e-table/e-table-model.h | 6 + widgets/e-table/e-table-render.c | 2 +- widgets/e-table/e-table-simple.c | 2 +- widgets/e-table/e-table.c | 2 +- 16 files changed, 399 insertions(+), 13 deletions(-) create mode 100644 widgets/e-table/ROADMAP.e-table create mode 100644 widgets/e-table/e-table-item.c create mode 100644 widgets/e-table/e-table-item.h (limited to 'widgets/e-table') diff --git a/widgets/e-table/ChangeLog b/widgets/e-table/ChangeLog index 01244d9674..846582f447 100644 --- a/widgets/e-table/ChangeLog +++ b/widgets/e-table/ChangeLog @@ -1,3 +1,14 @@ +1999-11-18 Miguel de Icaza + + * e-table-model.c (e_table_model_class_init): Add model_changed + signal here. + + * e-table-item.c, e-table-item.h: New files. They implement the + view of the ETableModel as Canvas Items. + + * e-table-header-item.c (ethi_set_arg): Ref header here. + (ethi_destroy): Unref it here. + 1999-11-17 Ettore Perazzoli * e-msg-composer-address-dialog.c: Moved to `$(srcdir)/composer'. diff --git a/widgets/e-table/Makefile.am b/widgets/e-table/Makefile.am index f4b3c111cd..c5d1bc51bf 100644 --- a/widgets/e-table/Makefile.am +++ b/widgets/e-table/Makefile.am @@ -17,6 +17,8 @@ libevolutionwidgets_a_SOURCES = \ e-table-header.h \ e-table-header-item.c \ e-table-header-item.h \ + e-table-item.c \ + e-table-item.h \ e-table-model.c \ e-table-model.h \ e-table-render.c \ @@ -34,7 +36,7 @@ table_test_SOURCES = \ table_test_LDADD = \ $(EXTRA_GNOME_LIBS) \ - libevolutionwidgets.la + libevolutionwidgets.a EXTRA_DIST = \ sample.table diff --git a/widgets/e-table/ROADMAP.e-table b/widgets/e-table/ROADMAP.e-table new file mode 100644 index 0000000000..d015faa6a5 --- /dev/null +++ b/widgets/e-table/ROADMAP.e-table @@ -0,0 +1,57 @@ + +The E-Table package implements an editable table that provides +user-defined rendering, user-defined editing, sorting and grouping of +the objects displayed. + +It is inspired by Java's Swing JTable object. There are models for +the actual table contents and for the table headers; they are the +actual repository of information. + +The objects are rendered by various view objects. In the current code +base, we use we use GnomeCanvasItems to do the rendering. One for +each table and one for the headers. + +* The Models + +All of them are GtkObjects. + +e-table-model.h, e-table-model.c: + + These implement the abstract E-Table-Model class. You + can derive this object to create your own data repository. + +e-table-simple.h, e-table-simple.c: + + A simple implementation of e-table-model that uses callback + routines (you provide the callbacks). For lazy people, like + me. + +e-table-header.h, e-table-header.c: + + These implement the ETableHeader model. They describe what + columns are shown in the screen and in which order. + +e-table-col.h, e-table-col.c: + + Describes a single column (the size, the string displayed, the + rendering function for each row, comparission function for + thsi field). + +* The Views + +e-table-item.c, e-table-item.h + + This is a canvas item that renders the contents of a + ETableModel into the screen. + +e-table-header-item.c, e-table-header-item.h + + This canvas item renders the ETableHeader headings. + +* The Filters + +e-table-sorted.c, e-table-sorted.h + + This is an ETableModel that can sort an existing ETableModel. + + diff --git a/widgets/e-table/e-table-col.c b/widgets/e-table/e-table-col.c index 8a2bfe90cf..c75bc6b195 100644 --- a/widgets/e-table/e-table-col.c +++ b/widgets/e-table/e-table-col.c @@ -4,7 +4,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * (C) 1999 International GNOME Support + * (C) 1999 Helix Code, Inc */ #include #include diff --git a/widgets/e-table/e-table-column-item.c b/widgets/e-table/e-table-column-item.c index dc0da16c11..0616327a93 100644 --- a/widgets/e-table/e-table-column-item.c +++ b/widgets/e-table/e-table-column-item.c @@ -4,7 +4,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * Copyright 1999, International GNOME Support. + * Copyright 1999, Helix Code, Inc. */ #include #include "e-table-column.h" diff --git a/widgets/e-table/e-table-column.c b/widgets/e-table/e-table-column.c index 851ebc4532..d17a285321 100644 --- a/widgets/e-table/e-table-column.c +++ b/widgets/e-table/e-table-column.c @@ -4,7 +4,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * (C) 1999 International GNOME Support + * (C) 1999 Helix Code, Inc */ #include #include "e-table-column.h" diff --git a/widgets/e-table/e-table-group.c b/widgets/e-table/e-table-group.c index 07a3fb60f2..bc751229a4 100644 --- a/widgets/e-table/e-table-group.c +++ b/widgets/e-table/e-table-group.c @@ -4,7 +4,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org() * - * Copyright 1999, International GNOME Support. + * Copyright 1999, Helix Code, Inc. */ #include diff --git a/widgets/e-table/e-table-header-item.c b/widgets/e-table/e-table-header-item.c index 50b0b6a677..b46f8511b0 100644 --- a/widgets/e-table/e-table-header-item.c +++ b/widgets/e-table/e-table-header-item.c @@ -36,7 +36,7 @@ ethi_destroy (GtkObject *object) { ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (object); - gtk_object_unref (GTK_OBJECT (ethi)); + gtk_object_unref (GTK_OBJECT (ethi->eth)); if (GTK_OBJECT_CLASS (ethi_parent_class)->destroy) (*GTK_OBJECT_CLASS (ethi_parent_class)->destroy) (object); @@ -84,6 +84,7 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_TABLE_HEADER: ethi->eth = GTK_VALUE_POINTER (*arg); + gtk_object_ref (GTK_OBJECT (ethi->eth)); break; case ARG_TABLE_X: diff --git a/widgets/e-table/e-table-header.c b/widgets/e-table/e-table-header.c index 3edc57a527..2279bf4ba6 100644 --- a/widgets/e-table/e-table-header.c +++ b/widgets/e-table/e-table-header.c @@ -4,7 +4,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * (C) 1999 International GNOME Support + * (C) 1999 Helix Code, Inc */ #include #include diff --git a/widgets/e-table/e-table-item.c b/widgets/e-table/e-table-item.c new file mode 100644 index 0000000000..6399f252b2 --- /dev/null +++ b/widgets/e-table/e-table-item.c @@ -0,0 +1,248 @@ +/* + * E-table-item.c: A view of a Table. + * + * Author: + * Miguel de Icaza (miguel@gnu.org) + * + * Copyright 1999, Helix Code, Inc. + */ +#include +#include "e-table-item.h" + +#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type () + +static GnomeCanvasItemClass *eti_parent_class; + +enum { + ARG_0, + ARG_TABLE_HEADER, + ARG_TABLE_MODEL, + ARG_TABLE_X, + ARG_TABLE_Y, +}; + +static void +eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) +{ + ETableItem *eti = E_TABLE_ITEM (item); + + if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update) + (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags); + + item->x1 = eti->x1; + item->y1 = eti->y1; + item->x2 = INT_MAX; + item->y2 = eti->x1 + eti->height; + + gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item); +} + +static void +eti_remove_table_model (ETableItem *eti) +{ + if (!eti->table_model) + return; + + gtk_signal_disconnect (eti->table_model_change_id); + gtk_object_unref (GTK_OBJECT (eti->table_model)); + + eti->table_model_change_id = 0; + eti->table_model = NULL; +} + +static void +eti_remove_header_model (ETableItem *eti) +{ + if (!eti->header) + return; + + gtk_signal_disconnect (eti->header_structure_change_id); + gtk_signal_disconnect (eti->header_dim_change_id); + gtk_object_unref (GTK_OBJECT (eti->header)); + + eti->header_structure_change_id = 0; + eti->header_dim_change_id = 0; + eti->header = NULL; +} + +static void +eti_table_model_changed (ETableModel *table_model, ETableItem *eti) +{ + eti->height = e_table_model_height (eti->table_model); + + eti_update (GNOME_CANVAS_ITEM (eti), NULL, NULL, 0); +} + +static void +eti_add_table_model (ETableItem *eti, ETableModel *table_model) +{ + g_assert (eti->table_model == NULL); + + eti->table_model = table_model; + gtk_object_ref (GTK_OBJECT (table_model)); + eti->table_model_change_id = gtk_signal_connect ( + GTK_OBJECT (table_model), "model_changed", + GTK_SIGNAL_FUNC (eti_table_model_changed), eti); +} + +static void +eti_header_dim_changed (ETableHeader *eth, int col, ETableItem *eti) +{ + printf ("NOTIFY: Dimension changed"); +} + +static void +eti_header_structure_changed (ETableHeader *eth, ETableItem *eti) +{ + printf ("NOTIFY: Structure changed"); +} + +static void +eti_add_header_model (ETableItem *eti, ETableHeader *header) +{ + g_assert (eti->header == NULL); + + eti->header = header; + gtk_object_ref (GTK_OBJECT (header)); + + eti->header_dim_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "dimension_change", + GTK_SIGNAL_FUNC (eti_header_dim_changed), eti); + + eti->header_structure_change_id = gtk_signal_connect ( + GTK_OBJECT (header), "structure_changed", + GTK_SIGNAL_FUNC (eti_header_structure_changed), eti); +} + +static void +eti_destroy (GtkObject *object) +{ + ETableItem *eti = E_TABLE_ITEM (object); + + eti_remove_header_model (eti); + eti_remove_table_model (eti); + + if (GTK_OBJECT_CLASS (eti_parent_class)->destroy) + (*GTK_OBJECT_CLASS (eti_parent_class)->destroy) (object); +} + +static void +eti_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) +{ + GnomeCanvasItem *item; + ETableItem *eti; + int v; + + item = GNOME_CANVAS_ITEM (o); + eti = E_TABLE_ITEM (o); + + switch (arg_id){ + case ARG_TABLE_HEADER: + eti->header = GTK_VALUE_POINTER (*arg); + gtk_object_ref (GTK_OBJECT (eti->header)); + break; + + case ARG_TABLE_MODEL: + eti_remove_table_model (eti); + eti->height = e_table_model_height (eti->table_model); + break; + + case ARG_TABLE_X: + eti->x1 = GTK_VALUE_INT (*arg); + break; + + case ARG_TABLE_Y: + eti->y1 = GTK_VALUE_INT (*arg); + break; + + } + eti_update (item, NULL, NULL, 0); +} + +static void +eti_init (GnomeCanvasItem *item) +{ + ETableItem *eti = E_TABLE_ITEM (item); +} + +static void +eti_realize (GnomeCanvasItem *item) +{ +} + +static void +eti_unrealize (GnomeCanvasItem *item) +{ +} + +static void +eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int width, int height) +{ + +} + +static double +eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, + GnomeCanvasItem **actual_item) +{ + *actual_item = item; + + return 0.0; +} + +static int +eti_event (GnomeCanvasItem *item, GdkEvent *e) +{ + return FALSE; +} + +static void +eti_class_init (GtkObjectClass *object_class) +{ + GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class; + + eti_parent_class = gtk_type_class (PARENT_OBJECT_TYPE); + + object_class->destroy = eti_destroy; + object_class->set_arg = eti_set_arg; + + item_class->update = eti_update; + item_class->realize = eti_realize; + item_class->unrealize = eti_unrealize; + item_class->draw = eti_draw; + item_class->point = eti_point; + item_class->event = eti_event; + + gtk_object_add_arg_type ("ETableHeaderItem::ETableHeader", GTK_TYPE_POINTER, + GTK_ARG_WRITABLE, ARG_TABLE_HEADER); + gtk_object_add_arg_type ("ETableHeaderItem::ETableModel", GTK_TYPE_POINTER, + GTK_ARG_WRITABLE, ARG_TABLE_MODEL); + gtk_object_add_arg_type ("ETableHeaderItem::x", GTK_TYPE_INT, + GTK_ARG_WRITABLE, ARG_TABLE_X); + gtk_object_add_arg_type ("ETableHeaderItem::y", GTK_TYPE_INT, + GTK_ARG_WRITABLE, ARG_TABLE_Y); +} + +GtkType +e_table_item_get_type (void) +{ + static GtkType type = 0; + + if (!type){ + GtkTypeInfo info = { + "ETableItem", + sizeof (ETableItem), + sizeof (ETableItemClass), + (GtkClassInitFunc) eti_class_init, + (GtkObjectInitFunc) eti_init, + NULL, /* reserved 1 */ + NULL, /* reserved 2 */ + (GtkClassInitFunc) NULL + }; + + type = gtk_type_unique (PARENT_OBJECT_TYPE, &info); + } + + return type; +} + diff --git a/widgets/e-table/e-table-item.h b/widgets/e-table/e-table-item.h new file mode 100644 index 0000000000..9b8ab541ae --- /dev/null +++ b/widgets/e-table/e-table-item.h @@ -0,0 +1,36 @@ +#ifndef _E_TABLE_ITEM_H_ +#define _E_TABLE_ITEM_H_ + +#include +#include "e-table-model.h" +#include "e-table-header.h" + +#define E_TABLE_ITEM_TYPE (e_table_item_get_type ()) +#define E_TABLE_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_ITEM_TYPE, ETableItem)) +#define E_TABLE_ITEM_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_ITEM_TYPE, ETableItemClass)) +#define E_IS_TABLE_ITEM(o) (GTK_CHECK_TYPE ((o), E_TABLE_ITEM_TYPE)) +#define E_IS_TABLE_ITEM_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_ITEM_TYPE)) + +typedef struct { + GnomeCanvasItem parent; + ETableModel *table_model; + ETableHeader *header; + + int x1, y1; + int height; + + /* + * Ids for the signals we connect to + */ + int header_dim_change_id; + int header_structure_change_id; + int table_model_change_id; +} ETableItem; + +typedef struct { + GnomeCanvasItemClass parent_class; +} ETableItemClass; + +GtkType e_table_item_get_type (void); + +#endif /* _E_TABLE_ITEM_H_ */ diff --git a/widgets/e-table/e-table-model.c b/widgets/e-table/e-table-model.c index c3b6674130..e7c591c345 100644 --- a/widgets/e-table/e-table-model.c +++ b/widgets/e-table/e-table-model.c @@ -4,15 +4,23 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * (C) 1999 International GNOME Support. + * (C) 1999 Helix Code, Inc. */ #include +#include #include "e-table-model.h" #define ETM_CLASS(e) ((ETableModelClass *)((GtkObject *)e)->klass) static GtkObjectClass *e_table_model_parent_class; +enum { + MODEL_CHANGED, + LAST_SIGNAL +}; + +static guint etm_signals [LAST_SIGNAL] = { 0, }; + int e_table_model_column_count (ETableModel *etable) { @@ -67,11 +75,21 @@ e_table_model_destroy (GtkObject *object) } static void -e_table_model_class_init (GtkObjectClass *class) +e_table_model_class_init (GtkObjectClass *object_class) { e_table_model_parent_class = gtk_type_class (gtk_object_get_type ()); - class->destroy = e_table_model_destroy; + object_class->destroy = e_table_model_destroy; + + etm_signals [MODEL_CHANGED] = + gtk_signal_new ("model_changed", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (ETableModelClass, model_changed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, etm_signals, LAST_SIGNAL); } GtkType @@ -113,6 +131,13 @@ e_table_model_height (ETableModel *etable) return size; } +void +e_table_model_changed (ETableModel *e_table_model) +{ + gtk_signal_emit (GTK_OBJECT (e_table_model), + etm_signals [MODEL_CHANGED]); +} + #if 0 int e_table_model_max_col_width (ETableModel *etm, int col) diff --git a/widgets/e-table/e-table-model.h b/widgets/e-table/e-table-model.h index ce57f73e7a..d12a465c0b 100644 --- a/widgets/e-table/e-table-model.h +++ b/widgets/e-table/e-table-model.h @@ -26,6 +26,11 @@ typedef struct { void (*set_value_at) (ETableModel *etm, int col, int row, void *value); gboolean (*is_cell_editable) (ETableModel *etm, int col, int row); int (*row_height) (ETableModel *etm, int row); + + /* + * Signals + */ + void (*model_changed) (ETableModel *etm, int row); } ETableModelClass; GtkType e_table_model_get_type (void); @@ -42,6 +47,7 @@ gboolean e_table_model_is_cell_editable (ETableModel *e_table_model, int col, /* * Routines for emitting signals on the e_table */ +void e_table_model_changed (ETableModel *e_table_model); #endif /* _E_TABLE_MODEL_H_ */ diff --git a/widgets/e-table/e-table-render.c b/widgets/e-table/e-table-render.c index 8e9f1bf285..49d742132b 100644 --- a/widgets/e-table/e-table-render.c +++ b/widgets/e-table/e-table-render.c @@ -4,7 +4,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * Copyright 1999, International GNOME Support. + * Copyright 1999, Helix Code, Inc. */ #include #include "e-table-header.h" diff --git a/widgets/e-table/e-table-simple.c b/widgets/e-table/e-table-simple.c index 6532d6e542..4d82bbe995 100644 --- a/widgets/e-table/e-table-simple.c +++ b/widgets/e-table/e-table-simple.c @@ -6,7 +6,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * (C) 1999 International GNOME Support. + * (C) 1999 Helix Code, Inc. */ #include diff --git a/widgets/e-table/e-table.c b/widgets/e-table/e-table.c index 427f527185..795c737b36 100644 --- a/widgets/e-table/e-table.c +++ b/widgets/e-table/e-table.c @@ -4,7 +4,7 @@ * Author: * Miguel de Icaza (miguel@gnu.org) * - * Copyright 1999, International GNOME Support + * Copyright 1999, Helix Code, Inc */ #include #include -- cgit v1.2.3