/* * E-Table-Group.c: Implements the grouping objects for elements on a table * * Author: * Miguel de Icaza (miguel@gnu.org() * * Copyright 1999, Helix Code, Inc. */ #include #include #include "e-table-group.h" #include #include "e-util.h" #define TITLE_HEIGHT 16 #define GROUP_INDENT 10 #define PARENT_TYPE gnome_canvas_group_get_type () static GnomeCanvasGroupClass *etg_parent_class; static void etg_destroy (GtkObject *object) { ETableGroup *etg = E_TABLE_GROUP (object); gtk_object_unref (GTK_OBJECT (etg->ecol)); GTK_OBJECT_CLASS (etg_parent_class)->destroy (object); } static int etg_width (ETableGroup *etg) { return e_table_header_total_width (etg->header) + GROUP_INDENT; } static int etg_height (ETableGroup *etg) { GnomeCanvasItem *child = etg->child; return TITLE_HEIGHT + (child->y2 - child->y1); } static void etg_header_changed (ETableHeader *header, ETableGroup *etg) { gnome_canvas_item_set ( etg->rect, "x2", (double) etg_width (etg), NULL); } void e_table_group_construct (GnomeCanvasGroup *parent, ETableGroup *etg, ETableHeader *header, int col, GnomeCanvasItem *child, int open) { gnome_canvas_item_constructv (GNOME_CANVAS_ITEM (etg), parent, 0, NULL); gtk_object_ref (GTK_OBJECT (header)); etg->header = header; etg->col = col; etg->ecol = e_table_header_get_column (header, col); etg->open = open; gtk_signal_connect ( GTK_OBJECT (header), "dimension_change", GTK_SIGNAL_FUNC (etg_header_changed), etg); etg->child = child; etg->rect = gnome_canvas_item_new ( GNOME_CANVAS_GROUP (etg), gnome_canvas_rect_get_type (), "fill_color", "gray", "outline_color", "gray20", "x1", 0.0, "y1", 0.0, "x2", (double) etg_width (etg), "y2", (double) etg_height (etg), NULL); /* * Reparent the child into our space. */ gnome_canvas_item_reparent (child, GNOME_CANVAS_GROUP (etg)); gnome_canvas_item_set ( child, "x", (double) GROUP_INDENT, "y", (double) TITLE_HEIGHT, NULL); } GnomeCanvasItem * e_table_group_new (GnomeCanvasGroup *parent, ETableHeader *header, int col, GnomeCanvasItem *child, int open) { ETableGroup *etg; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (header != NULL, NULL); g_return_val_if_fail (child != NULL, NULL); etg = gtk_type_new (e_table_group_get_type ()); e_table_group_construct (parent, etg, header, col, child, open); return GNOME_CANVAS_ITEM (etg); } static void etg_realize (GnomeCanvasItem *item) { ETableGroup *etg = E_TABLE_GROUP (item); GNOME_CANVAS_ITEM_CLASS (etg_parent_class)->realize (item); } static void etg_class_init (GtkObjectClass *object_class) { GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class; object_class->destroy = etg_destroy; item_class->realize = etg_realize; etg_parent_class = gtk_type_class (PARENT_TYPE); } E_MAKE_TYPE (e_table_group, "ETableGroup", ETableGroup, etg_class_init, NULL, PARENT_TYPE);