aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/table')
-rw-r--r--widgets/table/e-cell-tree.c117
-rw-r--r--widgets/table/e-tree-example-1.c41
2 files changed, 129 insertions, 29 deletions
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 <gdk-pixbuf/gdk-pixbuf.h>
@@ -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);