diff options
Diffstat (limited to 'widgets/table')
-rw-r--r-- | widgets/table/e-table-item.c | 70 | ||||
-rw-r--r-- | widgets/table/e-table-item.h | 7 | ||||
-rw-r--r-- | widgets/table/e-table-model.c | 2 | ||||
-rw-r--r-- | widgets/table/e-table-simple.c | 13 | ||||
-rw-r--r-- | widgets/table/e-table-simple.h | 1 | ||||
-rw-r--r-- | widgets/table/table-test.c | 18 |
6 files changed, 100 insertions, 11 deletions
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c index 6399f252b2..904848e8c6 100644 --- a/widgets/table/e-table-item.c +++ b/widgets/table/e-table-item.c @@ -110,7 +110,7 @@ eti_add_header_model (ETableItem *eti, ETableHeader *header) GTK_SIGNAL_FUNC (eti_header_dim_changed), eti); eti->header_structure_change_id = gtk_signal_connect ( - GTK_OBJECT (header), "structure_changed", + GTK_OBJECT (header), "structure_change", GTK_SIGNAL_FUNC (eti_header_structure_changed), eti); } @@ -138,12 +138,14 @@ eti_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_TABLE_HEADER: - eti->header = GTK_VALUE_POINTER (*arg); - gtk_object_ref (GTK_OBJECT (eti->header)); + eti_remove_header_model (eti); + eti_add_header_model (eti, GTK_VALUE_POINTER (*arg)); break; case ARG_TABLE_MODEL: eti_remove_table_model (eti); + eti_add_table_model (eti, GTK_VALUE_POINTER (*arg)); + eti->height = e_table_model_height (eti->table_model); break; @@ -176,9 +178,61 @@ eti_unrealize (GnomeCanvasItem *item) } static void -eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x1, int y1, int width, int height) +eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) { + ETableItem *eti = E_TABLE_ITEM (item); + const int rows = e_table_model_row_count (eti->table_model); + const int cols = e_table_header_count (eti->header); + int row, col, y1, y2; + int first_col, last_col, x_offset; + int x1, x2; + + /* + * Clear the background + */ + gdk_draw_rectangle ( + drawable, eti->fill_gc, TRUE, 0, 0, width, height); + + /* + * First column to draw, last column to draw + */ + x1 = x_offset = 0; + first_col = -1; + last_col = 0; + for (col = 0; col < cols; col++, x1 = x2){ + ETableCol *ecol = e_table_header_get_column (eti->header, col); + + x2 = x1 + ecol->width; + + if (x1 > (x + width)) + break; + if (x2 < x) + continue; + if (first_col == -1){ + x_offset = x - x1; + first_col = col; + } + } + last_col = col; + /* + * Draw individual lines + */ + y1 = y2 = 0; + for (row = eti->top_item; row < rows; row++, y1 = y2){ + y2 += e_table_model_row_height (eti->table_model, row) + 1; + + if (y1 > y + height) + break; + + if (y2 < y) + continue; + + if (eti->draw_grid) + gdk_draw_line (drawable, eti->grid_gc, 0, y - y2, width, y - y2); + + + } } static double @@ -213,13 +267,13 @@ eti_class_init (GtkObjectClass *object_class) item_class->point = eti_point; item_class->event = eti_event; - gtk_object_add_arg_type ("ETableHeaderItem::ETableHeader", GTK_TYPE_POINTER, + gtk_object_add_arg_type ("ETableItem::ETableHeader", GTK_TYPE_POINTER, GTK_ARG_WRITABLE, ARG_TABLE_HEADER); - gtk_object_add_arg_type ("ETableHeaderItem::ETableModel", GTK_TYPE_POINTER, + gtk_object_add_arg_type ("ETableItem::ETableModel", GTK_TYPE_POINTER, GTK_ARG_WRITABLE, ARG_TABLE_MODEL); - gtk_object_add_arg_type ("ETableHeaderItem::x", GTK_TYPE_INT, + gtk_object_add_arg_type ("ETableItem::x", GTK_TYPE_INT, GTK_ARG_WRITABLE, ARG_TABLE_X); - gtk_object_add_arg_type ("ETableHeaderItem::y", GTK_TYPE_INT, + gtk_object_add_arg_type ("ETableItem::y", GTK_TYPE_INT, GTK_ARG_WRITABLE, ARG_TABLE_Y); } diff --git a/widgets/table/e-table-item.h b/widgets/table/e-table-item.h index 9b8ab541ae..55893bb9ae 100644 --- a/widgets/table/e-table-item.h +++ b/widgets/table/e-table-item.h @@ -19,12 +19,19 @@ typedef struct { int x1, y1; int height; + int top_item; + /* * Ids for the signals we connect to */ int header_dim_change_id; int header_structure_change_id; int table_model_change_id; + + GdkGC *fill_gc; + GdkGC *grid_gc; + + unsigned int draw_grid:1; } ETableItem; typedef struct { diff --git a/widgets/table/e-table-model.c b/widgets/table/e-table-model.c index e7c591c345..de7bc67c51 100644 --- a/widgets/table/e-table-model.c +++ b/widgets/table/e-table-model.c @@ -126,7 +126,7 @@ e_table_model_height (ETableModel *etable) size = 0; for (i = 0; i < rows; i++) - size += e_table_model_row_height (etable, i); + size += e_table_model_row_height (etable, i) + 1; return size; } diff --git a/widgets/table/e-table-simple.c b/widgets/table/e-table-simple.c index 4d82bbe995..32f7145bc6 100644 --- a/widgets/table/e-table-simple.c +++ b/widgets/table/e-table-simple.c @@ -60,6 +60,14 @@ simple_is_cell_editable (ETableModel *etm, int col, int row) return simple->is_cell_editable (etm, col, row, simple->data); } +static int +simple_row_height (ETableModel *etm, int row) +{ + ETableSimple *simple = (ETableSimple *)etm; + + return simple->row_height (etm, row, simple->data); +} + static void e_table_simple_class_init (GtkObjectClass *object_class) { @@ -71,6 +79,7 @@ e_table_simple_class_init (GtkObjectClass *object_class) model_class->value_at = simple_value_at; model_class->set_value_at = simple_set_value_at; model_class->is_cell_editable = simple_is_cell_editable; + model_class->row_height = simple_row_height; } GtkType @@ -103,6 +112,7 @@ e_table_simple_new (ETableSimpleColumnCountFn col_count, ETableSimpleValueAtFn value_at, ETableSimpleSetValueAtFn set_value_at, ETableSimpleIsCellEditableFn is_cell_editable, + ETableSimpleRowHeightFn row_height, void *data) { ETableSimple *et; @@ -115,6 +125,7 @@ e_table_simple_new (ETableSimpleColumnCountFn col_count, et->value_at = value_at; et->set_value_at = set_value_at; et->is_cell_editable = is_cell_editable; - + et->row_height = row_height; + return (ETableModel *) et; } diff --git a/widgets/table/e-table-simple.h b/widgets/table/e-table-simple.h index d47a1cbe0b..ac34d6045c 100644 --- a/widgets/table/e-table-simple.h +++ b/widgets/table/e-table-simple.h @@ -36,6 +36,7 @@ ETableModel *e_table_simple_new (ETableSimpleColumnCountFn col_count, ETableSimpleValueAtFn value_at, ETableSimpleSetValueAtFn set_value_at, ETableSimpleIsCellEditableFn is_cell_editable, + ETableSimpleRowHeightFn row_height, void *data); #endif /* _E_TABLE_SIMPLE_H_ */ diff --git a/widgets/table/table-test.c b/widgets/table/table-test.c index d67a211094..50fa8a7597 100644 --- a/widgets/table/table-test.c +++ b/widgets/table/table-test.c @@ -12,6 +12,7 @@ #include "e-table-header.h" #include "e-table-header-item.h" #include "e-table-render.h" +#include "e-table-item.h" char buffer [1024]; char **column_labels; @@ -172,6 +173,12 @@ set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc) gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height); } +static int +row_height (ETableModel *etm, int row, void *data) +{ + return row * 2 + 14; +} + int main (int argc, char *argv []) { @@ -190,7 +197,7 @@ main (int argc, char *argv []) */ e_table_model = e_table_simple_new ( col_count, col_name, row_count, value_at, - set_value_at, is_cell_editable, NULL); + set_value_at, is_cell_editable, row_height, NULL); /* * Header @@ -229,6 +236,15 @@ main (int argc, char *argv []) "y2", 10.0, "fill_color", "red", NULL); + + gnome_canvas_item_new ( + gnome_canvas_root (GNOME_CANVAS (canvas)), + e_table_item_get_type (), + "ETableHeader", e_table_header, + "ETableModel", e_table_model, + "x", 0, + "y", 30, + NULL); gtk_main (); e_cursors_shutdown (); |