aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
authorArturo Espinosa <unammx@src.gnome.org>1999-11-19 13:34:23 +0800
committerArturo Espinosa <unammx@src.gnome.org>1999-11-19 13:34:23 +0800
commitda4c37043ecbd7f1c74315f88db36dfa195d6c64 (patch)
tree231eb0410c8455218665f6913361c46ef61fdc00 /widgets
parenta4fe6af80877ae299217e74d2ca859189bbb4bb3 (diff)
downloadgsoc2013-evolution-da4c37043ecbd7f1c74315f88db36dfa195d6c64.tar
gsoc2013-evolution-da4c37043ecbd7f1c74315f88db36dfa195d6c64.tar.gz
gsoc2013-evolution-da4c37043ecbd7f1c74315f88db36dfa195d6c64.tar.bz2
gsoc2013-evolution-da4c37043ecbd7f1c74315f88db36dfa195d6c64.tar.lz
gsoc2013-evolution-da4c37043ecbd7f1c74315f88db36dfa195d6c64.tar.xz
gsoc2013-evolution-da4c37043ecbd7f1c74315f88db36dfa195d6c64.tar.zst
gsoc2013-evolution-da4c37043ecbd7f1c74315f88db36dfa195d6c64.zip
New E-table-item.[ch] -mig
svn path=/trunk/; revision=1419
Diffstat (limited to 'widgets')
-rw-r--r--widgets/ChangeLog11
-rw-r--r--widgets/Makefile.am4
-rw-r--r--widgets/ROADMAP.e-table57
-rw-r--r--widgets/e-table-col.c2
-rw-r--r--widgets/e-table-column-item.c2
-rw-r--r--widgets/e-table-column.c2
-rw-r--r--widgets/e-table-group.c2
-rw-r--r--widgets/e-table-header-item.c3
-rw-r--r--widgets/e-table-header.c2
-rw-r--r--widgets/e-table-item.c248
-rw-r--r--widgets/e-table-item.h36
-rw-r--r--widgets/e-table-model.c31
-rw-r--r--widgets/e-table-model.h6
-rw-r--r--widgets/e-table-render.c2
-rw-r--r--widgets/e-table-simple.c2
-rw-r--r--widgets/e-table.c2
-rw-r--r--widgets/e-table/ChangeLog11
-rw-r--r--widgets/e-table/Makefile.am4
-rw-r--r--widgets/e-table/ROADMAP.e-table57
-rw-r--r--widgets/e-table/e-table-col.c2
-rw-r--r--widgets/e-table/e-table-column-item.c2
-rw-r--r--widgets/e-table/e-table-column.c2
-rw-r--r--widgets/e-table/e-table-group.c2
-rw-r--r--widgets/e-table/e-table-header-item.c3
-rw-r--r--widgets/e-table/e-table-header.c2
-rw-r--r--widgets/e-table/e-table-item.c248
-rw-r--r--widgets/e-table/e-table-item.h36
-rw-r--r--widgets/e-table/e-table-model.c31
-rw-r--r--widgets/e-table/e-table-model.h6
-rw-r--r--widgets/e-table/e-table-render.c2
-rw-r--r--widgets/e-table/e-table-simple.c2
-rw-r--r--widgets/e-table/e-table.c2
-rw-r--r--widgets/table/e-table-col.c2
-rw-r--r--widgets/table/e-table-column-item.c2
-rw-r--r--widgets/table/e-table-column.c2
-rw-r--r--widgets/table/e-table-group.c2
-rw-r--r--widgets/table/e-table-header-item.c3
-rw-r--r--widgets/table/e-table-header.c2
-rw-r--r--widgets/table/e-table-item.c248
-rw-r--r--widgets/table/e-table-item.h36
-rw-r--r--widgets/table/e-table-model.c31
-rw-r--r--widgets/table/e-table-model.h6
-rw-r--r--widgets/table/e-table-render.c2
-rw-r--r--widgets/table/e-table-simple.c2
-rw-r--r--widgets/table/e-table.c2
45 files changed, 1126 insertions, 38 deletions
diff --git a/widgets/ChangeLog b/widgets/ChangeLog
index 01244d9674..846582f447 100644
--- a/widgets/ChangeLog
+++ b/widgets/ChangeLog
@@ -1,3 +1,14 @@
+1999-11-18 Miguel de Icaza <miguel@gnu.org>
+
+ * 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 <ettore@gnu.org>
* e-msg-composer-address-dialog.c: Moved to `$(srcdir)/composer'.
diff --git a/widgets/Makefile.am b/widgets/Makefile.am
index f4b3c111cd..c5d1bc51bf 100644
--- a/widgets/Makefile.am
+++ b/widgets/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/ROADMAP.e-table b/widgets/ROADMAP.e-table
new file mode 100644
index 0000000000..d015faa6a5
--- /dev/null
+++ b/widgets/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-col.c b/widgets/e-table-col.c
index 8a2bfe90cf..c75bc6b195 100644
--- a/widgets/e-table-col.c
+++ b/widgets/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 <config.h>
#include <gtk/gtkobject.h>
diff --git a/widgets/e-table-column-item.c b/widgets/e-table-column-item.c
index dc0da16c11..0616327a93 100644
--- a/widgets/e-table-column-item.c
+++ b/widgets/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 <config.h>
#include "e-table-column.h"
diff --git a/widgets/e-table-column.c b/widgets/e-table-column.c
index 851ebc4532..d17a285321 100644
--- a/widgets/e-table-column.c
+++ b/widgets/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 <config.h>
#include "e-table-column.h"
diff --git a/widgets/e-table-group.c b/widgets/e-table-group.c
index 07a3fb60f2..bc751229a4 100644
--- a/widgets/e-table-group.c
+++ b/widgets/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 <config.h>
diff --git a/widgets/e-table-header-item.c b/widgets/e-table-header-item.c
index 50b0b6a677..b46f8511b0 100644
--- a/widgets/e-table-header-item.c
+++ b/widgets/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-header.c b/widgets/e-table-header.c
index 3edc57a527..2279bf4ba6 100644
--- a/widgets/e-table-header.c
+++ b/widgets/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 <config.h>
#include <gtk/gtkobject.h>
diff --git a/widgets/e-table-item.c b/widgets/e-table-item.c
new file mode 100644
index 0000000000..6399f252b2
--- /dev/null
+++ b/widgets/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 <config.h>
+#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-item.h b/widgets/e-table-item.h
new file mode 100644
index 0000000000..9b8ab541ae
--- /dev/null
+++ b/widgets/e-table-item.h
@@ -0,0 +1,36 @@
+#ifndef _E_TABLE_ITEM_H_
+#define _E_TABLE_ITEM_H_
+
+#include <libgnomeui/gnome-canvas.h>
+#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-model.c b/widgets/e-table-model.c
index c3b6674130..e7c591c345 100644
--- a/widgets/e-table-model.c
+++ b/widgets/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 <config.h>
+#include <gtk/gtksignal.h>
#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-model.h b/widgets/e-table-model.h
index ce57f73e7a..d12a465c0b 100644
--- a/widgets/e-table-model.h
+++ b/widgets/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-render.c b/widgets/e-table-render.c
index 8e9f1bf285..49d742132b 100644
--- a/widgets/e-table-render.c
+++ b/widgets/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 <config.h>
#include "e-table-header.h"
diff --git a/widgets/e-table-simple.c b/widgets/e-table-simple.c
index 6532d6e542..4d82bbe995 100644
--- a/widgets/e-table-simple.c
+++ b/widgets/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 <config.h>
diff --git a/widgets/e-table.c b/widgets/e-table.c
index 427f527185..795c737b36 100644
--- a/widgets/e-table.c
+++ b/widgets/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 <config.h>
#include <libgnomeui/gnome-canvas.h>
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 <miguel@gnu.org>
+
+ * 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 <ettore@gnu.org>
* 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 <config.h>
#include <gtk/gtkobject.h>
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 <config.h>
#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 <config.h>
#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 <config.h>
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 <config.h>
#include <gtk/gtkobject.h>
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 <config.h>
+#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 <libgnomeui/gnome-canvas.h>
+#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 <config.h>
+#include <gtk/gtksignal.h>
#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 <config.h>
#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 <config.h>
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 <config.h>
#include <libgnomeui/gnome-canvas.h>
diff --git a/widgets/table/e-table-col.c b/widgets/table/e-table-col.c
index 8a2bfe90cf..c75bc6b195 100644
--- a/widgets/table/e-table-col.c
+++ b/widgets/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 <config.h>
#include <gtk/gtkobject.h>
diff --git a/widgets/table/e-table-column-item.c b/widgets/table/e-table-column-item.c
index dc0da16c11..0616327a93 100644
--- a/widgets/table/e-table-column-item.c
+++ b/widgets/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 <config.h>
#include "e-table-column.h"
diff --git a/widgets/table/e-table-column.c b/widgets/table/e-table-column.c
index 851ebc4532..d17a285321 100644
--- a/widgets/table/e-table-column.c
+++ b/widgets/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 <config.h>
#include "e-table-column.h"
diff --git a/widgets/table/e-table-group.c b/widgets/table/e-table-group.c
index 07a3fb60f2..bc751229a4 100644
--- a/widgets/table/e-table-group.c
+++ b/widgets/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 <config.h>
diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c
index 50b0b6a677..b46f8511b0 100644
--- a/widgets/table/e-table-header-item.c
+++ b/widgets/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/table/e-table-header.c b/widgets/table/e-table-header.c
index 3edc57a527..2279bf4ba6 100644
--- a/widgets/table/e-table-header.c
+++ b/widgets/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 <config.h>
#include <gtk/gtkobject.h>
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
new file mode 100644
index 0000000000..6399f252b2
--- /dev/null
+++ b/widgets/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 <config.h>
+#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/table/e-table-item.h b/widgets/table/e-table-item.h
new file mode 100644
index 0000000000..9b8ab541ae
--- /dev/null
+++ b/widgets/table/e-table-item.h
@@ -0,0 +1,36 @@
+#ifndef _E_TABLE_ITEM_H_
+#define _E_TABLE_ITEM_H_
+
+#include <libgnomeui/gnome-canvas.h>
+#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/table/e-table-model.c b/widgets/table/e-table-model.c
index c3b6674130..e7c591c345 100644
--- a/widgets/table/e-table-model.c
+++ b/widgets/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 <config.h>
+#include <gtk/gtksignal.h>
#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/table/e-table-model.h b/widgets/table/e-table-model.h
index ce57f73e7a..d12a465c0b 100644
--- a/widgets/table/e-table-model.h
+++ b/widgets/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/table/e-table-render.c b/widgets/table/e-table-render.c
index 8e9f1bf285..49d742132b 100644
--- a/widgets/table/e-table-render.c
+++ b/widgets/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 <config.h>
#include "e-table-header.h"
diff --git a/widgets/table/e-table-simple.c b/widgets/table/e-table-simple.c
index 6532d6e542..4d82bbe995 100644
--- a/widgets/table/e-table-simple.c
+++ b/widgets/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 <config.h>
diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c
index 427f527185..795c737b36 100644
--- a/widgets/table/e-table.c
+++ b/widgets/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 <config.h>
#include <libgnomeui/gnome-canvas.h>