aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/table/e-cell-tree.c17
-rw-r--r--widgets/table/e-tree-example-1.c48
-rw-r--r--widgets/table/e-tree-model.c16
-rw-r--r--widgets/table/tree-expanded.xpm23
-rw-r--r--widgets/table/tree-unexpanded.xpm23
5 files changed, 103 insertions, 24 deletions
diff --git a/widgets/table/e-cell-tree.c b/widgets/table/e-cell-tree.c
index dfeb2c515a..0d159ded19 100644
--- a/widgets/table/e-cell-tree.c
+++ b/widgets/table/e-cell-tree.c
@@ -31,6 +31,9 @@
#include <ctype.h>
#include <math.h>
+#include "tree-expanded.xpm"
+#include "tree-unexpanded.xpm"
+
#define PARENT_TYPE e_cell_get_type ()
typedef struct {
@@ -572,6 +575,9 @@ ect_destroy (GtkObject *object)
/* destroy our subcell */
gtk_object_destroy (GTK_OBJECT (ect->subcell));
+ gdk_pixbuf_unref (ect->open_pixbuf);
+ gdk_pixbuf_unref (ect->closed_pixbuf);
+
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
@@ -609,8 +615,15 @@ e_cell_tree_construct (ECellTree *ect,
ECell *subcell)
{
ect->subcell = subcell;
- ect->open_pixbuf = open_pixbuf;
- ect->closed_pixbuf = closed_pixbuf;
+ if (open_pixbuf)
+ ect->open_pixbuf = open_pixbuf;
+ else
+ ect->open_pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **)tree_expanded_xpm);
+ if (closed_pixbuf)
+ ect->closed_pixbuf = closed_pixbuf;
+ else
+ ect->closed_pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **)tree_unexpanded_xpm);
+
ect->draw_lines = draw_lines;
}
diff --git a/widgets/table/e-tree-example-1.c b/widgets/table/e-tree-example-1.c
index 75e32c0a25..f62b1e0765 100644
--- a/widgets/table/e-tree-example-1.c
+++ b/widgets/table/e-tree-example-1.c
@@ -6,7 +6,6 @@
#include <libgnomeprint/gnome-print.h>
#include <libgnomeprint/gnome-print-preview.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "gal/e-util/e-cursors.h"
#include "e-table-header.h"
#include "e-table-header-item.h"
#include "e-table-item.h"
@@ -16,12 +15,6 @@
#include "e-table.h"
#include "e-tree-simple.h"
-#include "art/tree-expanded.xpm"
-#include "art/tree-unexpanded.xpm"
-
-GdkPixbuf *tree_expanded_pixbuf;
-GdkPixbuf *tree_unexpanded_pixbuf;
-
#define COLS 4
#define IMPORTANCE_COLUMN 4
@@ -268,6 +261,14 @@ print_tree (GtkButton *button, gpointer data)
gnome_print_context_close (gpc);
}
+static void
+save_state (GtkButton *button, gpointer data)
+{
+ ETreeModel *e_tree_model = E_TREE_MODEL (data);
+
+ e_tree_model_save_expanded_state (e_tree_model, "expanded_state");
+}
+
/* We create a window containing our new tree. */
static void
create_tree (void)
@@ -294,6 +295,8 @@ create_tree (void)
my_is_editable,
NULL);
+ e_tree_model_load_expanded_state (e_tree_model, "expanded_state");
+
/* create a root node with 5 children */
root_node = e_tree_model_node_insert (e_tree_model, NULL,
0,
@@ -302,13 +305,18 @@ create_tree (void)
e_tree_model_root_node_set_visible (e_tree_model, FALSE);
for (i = 0; i < 5; i++){
- ETreePath *n = e_tree_model_node_insert (e_tree_model,
- root_node, 0,
- g_strdup("First level of children"));
+ char *id = g_strdup_printf ("First level child %d", i);
+ ETreePath *n = e_tree_model_node_insert_id (e_tree_model,
+ root_node, 0,
+ g_strdup("First level of children"),
+ id);
+ g_free (id);
for (j = 0; j < 5; j ++) {
- e_tree_model_node_insert (e_tree_model,
- n, 0,
- g_strdup("Second level of children"));
+ char *id = g_strdup_printf ("Second level child %d", j);
+ e_tree_model_node_insert_id (e_tree_model,
+ n, 0,
+ g_strdup("Second level of children"), id);
+ g_free (id);
}
}
@@ -339,7 +347,7 @@ create_tree (void)
* text is displayed to the right of the tree pipes.
*/
cell_tree = e_cell_tree_new (E_TABLE_MODEL(e_tree_model),
- tree_expanded_pixbuf, tree_unexpanded_pixbuf,
+ NULL, NULL, /* use the default pixbufs for open/closed */
TRUE, cell_left_just);
/*
@@ -411,6 +419,10 @@ create_tree (void)
gtk_signal_connect (GTK_OBJECT (button), "clicked", print_tree, e_tree_model);
gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ button = gtk_button_new_with_label ("Save State");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked", save_state, e_tree_model);
+ gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
gtk_container_add (GTK_CONTAINER (window), vbox);
/* Size the initial window. */
@@ -428,22 +440,14 @@ int
main (int argc, char *argv [])
{
gnome_init ("TableExample", "TableExample", argc, argv);
- e_cursors_init ();
gtk_widget_push_visual (gdk_rgb_get_visual ());
gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- /*
- * Create our pixbuf for expanding/unexpanding
- */
- 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);
-
create_tree ();
gtk_main ();
- e_cursors_shutdown ();
return 0;
}
diff --git a/widgets/table/e-tree-model.c b/widgets/table/e-tree-model.c
index baf8d40416..c3f727e825 100644
--- a/widgets/table/e-tree-model.c
+++ b/widgets/table/e-tree-model.c
@@ -438,9 +438,14 @@ E_MAKE_TYPE(e_tree_model, "ETreeModel", ETreeModel, e_tree_model_class_init, NUL
void
e_tree_model_node_changed (ETreeModel *tree_model, ETreePath *node)
{
+ int row;
g_return_if_fail (tree_model != NULL);
g_return_if_fail (E_IS_TREE_MODEL (tree_model));
+ row = e_tree_model_row_of_node (tree_model, node);
+ if (row != -1)
+ e_table_model_row_changed (E_TABLE_MODEL (tree_model), row);
+
gtk_signal_emit (GTK_OBJECT (tree_model),
e_tree_model_signals [NODE_CHANGED]);
}
@@ -450,8 +455,13 @@ e_tree_model_node_inserted (ETreeModel *tree_model,
ETreePath *parent_node,
ETreePath *inserted_node)
{
+ int row;
g_return_if_fail (tree_model != NULL);
g_return_if_fail (E_IS_TREE_MODEL (tree_model));
+
+ row = e_tree_model_row_of_node (tree_model, inserted_node);
+ if (row != -1)
+ e_table_model_row_inserted (E_TABLE_MODEL (tree_model), row);
gtk_signal_emit (GTK_OBJECT (tree_model),
e_tree_model_signals [NODE_INSERTED],
@@ -461,8 +471,14 @@ e_tree_model_node_inserted (ETreeModel *tree_model,
void
e_tree_model_node_removed (ETreeModel *tree_model, ETreePath *parent_node, ETreePath *removed_node)
{
+ int row;
+
g_return_if_fail (tree_model != NULL);
g_return_if_fail (E_IS_TREE_MODEL (tree_model));
+
+ row = e_tree_model_row_of_node (tree_model, removed_node);
+ if (row != -1)
+ e_table_model_row_inserted (E_TABLE_MODEL (tree_model), row);
gtk_signal_emit (GTK_OBJECT (tree_model),
e_tree_model_signals [NODE_REMOVED],
diff --git a/widgets/table/tree-expanded.xpm b/widgets/table/tree-expanded.xpm
new file mode 100644
index 0000000000..4a89340cf4
--- /dev/null
+++ b/widgets/table/tree-expanded.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char * tree_expanded_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #FFFFFF",
+"* c #666666",
+"+ c #000000",
+" ",
+" ",
+" ",
+" ",
+" +++++++++ ",
+" +.......+ ",
+" +.......+ ",
+" +.......+ ",
+" +.*****.+ ",
+" +.......+ ",
+" +.......+ ",
+" +.......+ ",
+" +++++++++ ",
+" ",
+" ",
+" "};
diff --git a/widgets/table/tree-unexpanded.xpm b/widgets/table/tree-unexpanded.xpm
new file mode 100644
index 0000000000..3266a67020
--- /dev/null
+++ b/widgets/table/tree-unexpanded.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char * tree_unexpanded_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #FFFFFF",
+"* c #666666",
+"+ c #000000",
+" ",
+" ",
+" ",
+" ",
+" +++++++++ ",
+" +.......+ ",
+" +...*...+ ",
+" +...*...+ ",
+" +.*****.+ ",
+" +...*...+ ",
+" +...*...+ ",
+" +.......+ ",
+" +++++++++ ",
+" ",
+" ",
+" "};