aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/e-table-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/e-table-item.c')
-rw-r--r--widgets/e-table-item.c248
1 files changed, 248 insertions, 0 deletions
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;
+}
+