From 5ae693645f49b1beb1b21adfc1e50c06aa130278 Mon Sep 17 00:00:00 2001 From: Chris Toshok Date: Wed, 14 Jun 2000 07:07:38 +0000 Subject: new function, to generate postscript so i can test tree printing. 2000-06-14 Chris Toshok * e-tree-example-1.c (print_tree): new function, to generate postscript so i can test tree printing. (create_tree): add print button. * e-cell-tree.c (ect_print_height): implement function (in a broken way for the time being, heh). (ect_print): implement function to draw tree controls and offset the subcell's printing. icons aren't printed yet, just lines. (ect_draw): remove old unnecessary comments. only draw the horizontal line in specific instances (well, add a test so a lone root node doesn't get the horizontal line.) (e_cell_tree_class_init): add print/print_height methods. svn path=/trunk/; revision=3565 --- widgets/table/e-cell-tree.c | 117 +++++++++++++++++++++++++++++++++++---- widgets/table/e-tree-example-1.c | 41 ++++++++------ 2 files changed, 129 insertions(+), 29 deletions(-) (limited to 'widgets/table') diff --git a/widgets/table/e-cell-tree.c b/widgets/table/e-cell-tree.c index 28de6ff5bb..508d39e60f 100644 --- a/widgets/table/e-cell-tree.c +++ b/widgets/table/e-cell-tree.c @@ -167,13 +167,6 @@ ect_draw (ECellView *ecell_view, GdkDrawable *drawable, /* only draw the tree effects if we're the active sort */ if (/* XXX */ TRUE) { - /* - * need to get the following things from the model - * 1. depth of item. - * 2. whether or not it has any children. - * 3. whether the item is a toplevel item. - * 3. ... anything else? - */ node = e_cell_tree_get_node (tree_model, row); offset = offset_of_node (tree_model, node); @@ -208,11 +201,13 @@ ect_draw (ECellView *ecell_view, GdkDrawable *drawable, /* draw our lines */ if (E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) { - gdk_draw_line (drawable, tree_view->gc, - rect.x + offset - INDENT_AMOUNT / 2 + 1, - rect.y + rect.height / 2, - rect.x + offset, - rect.y + rect.height / 2); + if (!e_tree_model_node_is_root (tree_model, node) + || e_tree_model_node_get_children (tree_model, node, NULL) > 0) + gdk_draw_line (drawable, tree_view->gc, + rect.x + offset - INDENT_AMOUNT / 2 + 1, + rect.y + rect.height / 2, + rect.x + offset, + rect.y + rect.height / 2); if (visible_depth_of_node (tree_model, node) != 0) { gdk_draw_line (drawable, tree_view->gc, @@ -355,6 +350,102 @@ ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, voi e_cell_leave_edit (tree_view->subcell_view, model_col, view_col, row, edit_context); } +static void +ect_print (ECellView *ecell_view, GnomePrintContext *context, + int model_col, int view_col, int row, + double width, double height) +{ + ECellTreeView *tree_view = (ECellTreeView *) ecell_view; + + if (/* XXX only if we're the active sort */ TRUE) { + ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row); + ETreePath *node = e_cell_tree_get_node (tree_model, row); + int offset = offset_of_node (tree_model, node); + int subcell_offset = offset; + + /* draw our lines */ + if (E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) { + gnome_print_moveto (context, + offset - INDENT_AMOUNT / 2, + height / 2); + + gnome_print_lineto (context, + offset, + height / 2); + + if (visible_depth_of_node (tree_model, node) != 0) { + gnome_print_moveto (context, + offset - INDENT_AMOUNT / 2, + height); + gnome_print_lineto (context, + offset - INDENT_AMOUNT / 2, + (e_tree_model_node_get_next (tree_model, node) + ? 0 + : height / 2)); + } + + /* now traverse back up to the root of the tree, checking at + each level if the node has siblings, and drawing the + correct vertical pipe for it's configuration. */ + node = e_tree_model_node_get_parent (tree_model, node); + offset -= INDENT_AMOUNT; + while (node && visible_depth_of_node (tree_model, node) != 0) { + if (e_tree_model_node_get_next(tree_model, node)) { + gnome_print_moveto (context, + offset - INDENT_AMOUNT / 2, + height); + gnome_print_lineto (context, + offset - INDENT_AMOUNT / 2, + 0); + } + node = e_tree_model_node_get_parent (tree_model, node); + offset -= INDENT_AMOUNT; + } + } + +#if 0 + /* now draw our icon if we're expandable */ + if (expandable) { + GdkPixbuf *image = (expanded + ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf + : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf); + int width, height; + + width = gdk_pixbuf_get_width(image); + height = gdk_pixbuf_get_height(image); + + gdk_pixbuf_render_to_drawable_alpha (image, + drawable, + 0, 0, + x1 + subcell_offset - INDENT_AMOUNT / 2 - width / 2, + y1 + (y2 - y1) / 2 - height / 2, + width, height, + GDK_PIXBUF_ALPHA_BILEVEL, + 128, + GDK_RGB_DITHER_NORMAL, + width, 0); + } +#endif + + gnome_print_stroke (context); + + if (gnome_print_translate(context, subcell_offset, 0) == -1) + /* FIXME */; + width -= subcell_offset; + } + + + e_cell_print (tree_view->subcell_view, context, model_col, view_col, row, width, height); +} + +static gdouble +ect_print_height (ECellView *ecell_view, GnomePrintContext *context, + int model_col, int view_col, int row, + double width) +{ + return 12; /* XXX */ +} + /* * GtkObject::destroy method */ @@ -385,6 +476,8 @@ e_cell_tree_class_init (GtkObjectClass *object_class) ecc->height = ect_height; ecc->enter_edit = ect_enter_edit; ecc->leave_edit = ect_leave_edit; + ecc->print = ect_print; + ecc->print_height = ect_print_height; parent_class = gtk_type_class (PARENT_TYPE); } diff --git a/widgets/table/e-tree-example-1.c b/widgets/table/e-tree-example-1.c index e2ba566a99..688bc735b1 100644 --- a/widgets/table/e-tree-example-1.c +++ b/widgets/table/e-tree-example-1.c @@ -12,6 +12,8 @@ #include "e-cell-checkbox.h" #include "e-table.h" #include "e-tree-simple.h" +#include "libgnomeprint/gnome-print.h" +#include "libgnomeprint/gnome-print-preview.h" #include @@ -62,22 +64,10 @@ char *headers [COLS] = { GtkWidget *e_table; /* - * ETableSimple callbacks + * ETreeSimple callbacks * These are the callbacks that define the behavior of our custom model. */ -/* - * Since our model is a constant size, we can just return its size in - * the column and row count fields. - */ - -/* This function returns the number of columns in our ETableModel. */ -static int -my_col_count (ETableModel *etc, void *data) -{ - return COLS; -} - /* This function returns the value at a particular point in our ETreeModel. */ static void * my_value_at (ETreeModel *etm, ETreePath *path, int col, void *model_data) @@ -137,7 +127,7 @@ add_sibling (GtkButton *button, gpointer data) parent_node = e_tree_model_node_get_parent (e_tree_model, selected_node); e_tree_model_node_insert_before (e_tree_model, parent_node, - selected_node, "User added sibling"); + selected_node, g_strdup("User added sibling")); } @@ -156,7 +146,7 @@ add_child (GtkButton *button, gpointer data) g_assert (selected_node); e_tree_model_node_insert (e_tree_model, selected_node, - 0, "User added child"); + 0, g_strdup("User added child")); } static void @@ -216,6 +206,19 @@ collapse_all (GtkButton *button, gpointer data) e_tree_model_node_set_expanded_recurse (e_tree_model, selected_node, FALSE); } +static void +print_tree (GtkButton *button, gpointer data) +{ + EPrintable *printable = e_table_get_printable (E_TABLE (e_table)); + GnomePrintContext *gpc; + + gpc = gnome_print_context_new (gnome_printer_new_generic_ps ("tree-out.ps")); + + e_printable_print_page (printable, gpc, 8*72, 10*72, FALSE); + + gnome_print_context_close (gpc); +} + /* We create a window containing our new tree. */ static void create_tree (void) @@ -273,8 +276,8 @@ create_tree (void) /* * Create our pixbuf for expanding/unexpanding */ - tree_expanded_pixbuf = gdk_pixbuf_new_from_xpm_data(tree_expanded_xpm); - tree_unexpanded_pixbuf = gdk_pixbuf_new_from_xpm_data(tree_unexpanded_xpm); + tree_expanded_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)tree_expanded_xpm); + tree_unexpanded_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)tree_unexpanded_xpm); /* * This renderer is used for the tree column (the leftmost one), and @@ -348,6 +351,10 @@ create_tree (void) button = gtk_button_new_with_label ("Collapse All Below"); gtk_signal_connect (GTK_OBJECT (button), "clicked", collapse_all, e_tree_model); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + button = gtk_button_new_with_label ("Print Tree"); + gtk_signal_connect (GTK_OBJECT (button), "clicked", print_tree, e_tree_model); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); -- cgit