diff options
Diffstat (limited to 'widgets/table/e-tree-scrolled.c')
-rw-r--r-- | widgets/table/e-tree-scrolled.c | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/widgets/table/e-tree-scrolled.c b/widgets/table/e-tree-scrolled.c new file mode 100644 index 0000000000..35a5be3729 --- /dev/null +++ b/widgets/table/e-tree-scrolled.c @@ -0,0 +1,207 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * E-tree-scrolled.c: A graphical view of a Tree. + * + * Author: + * Chris Lahey <clahey@ximian.com> + * Miguel de Icaza (miguel@ximian.com) + * + * Copyright 2000, 1999, Ximian, Inc + */ +#include <config.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdio.h> +#include <libgnomeui/gnome-canvas.h> +#include <gtk/gtksignal.h> +#include <gnome-xml/parser.h> +#include <gnome-xml/xmlmemory.h> + +#include "e-tree-scrolled.h" + +#define COLUMN_HEADER_HEIGHT 16 + +#define PARENT_TYPE e_scroll_frame_get_type () + +static GtkObjectClass *parent_class; + +enum { + ARG_0, + ARG_TREE, +}; + +static void +e_tree_scrolled_init (GtkObject *object) +{ + ETreeScrolled *ets; + EScrollFrame *scroll_frame; + + ets = E_TREE_SCROLLED (object); + scroll_frame = E_SCROLL_FRAME (object); + + GTK_WIDGET_SET_FLAGS (ets, GTK_CAN_FOCUS); + + ets->tree = gtk_type_new(e_tree_get_type()); + + e_scroll_frame_set_policy (scroll_frame, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + e_scroll_frame_set_shadow_type (scroll_frame, GTK_SHADOW_IN); +} + +static void +e_tree_scrolled_real_construct (ETreeScrolled *ets) +{ + gtk_container_add(GTK_CONTAINER(ets), GTK_WIDGET(ets->tree)); + + gtk_widget_show(GTK_WIDGET(ets->tree)); +} + +ETreeScrolled *e_tree_scrolled_construct (ETreeScrolled *ets, + ETreeModel *etm, + ETableExtras *ete, + const char *spec, + const char *state) +{ + g_return_val_if_fail(ets != NULL, NULL); + g_return_val_if_fail(E_IS_TREE_SCROLLED(ets), NULL); + g_return_val_if_fail(etm != NULL, NULL); + g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL); + g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL); + g_return_val_if_fail(spec != NULL, NULL); + + e_tree_construct(ets->tree, etm, ete, spec, state); + + e_tree_scrolled_real_construct(ets); + + return ets; +} + +GtkWidget *e_tree_scrolled_new (ETreeModel *etm, + ETableExtras *ete, + const char *spec, + const char *state) +{ + ETreeScrolled *ets; + + g_return_val_if_fail(etm != NULL, NULL); + g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL); + g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL); + g_return_val_if_fail(spec != NULL, NULL); + + ets = E_TREE_SCROLLED (gtk_widget_new (e_tree_scrolled_get_type (), + "hadjustment", NULL, + "vadjustment", NULL, + NULL)); + + ets = e_tree_scrolled_construct (ets, etm, ete, spec, state); + + return GTK_WIDGET (ets); +} + +ETreeScrolled *e_tree_scrolled_construct_from_spec_file (ETreeScrolled *ets, + ETreeModel *etm, + ETableExtras *ete, + const char *spec_fn, + const char *state_fn) +{ + g_return_val_if_fail(ets != NULL, NULL); + g_return_val_if_fail(E_IS_TREE_SCROLLED(ets), NULL); + g_return_val_if_fail(etm != NULL, NULL); + g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL); + g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL); + g_return_val_if_fail(spec_fn != NULL, NULL); + + e_tree_construct_from_spec_file(ets->tree, etm, ete, spec_fn, state_fn); + + e_tree_scrolled_real_construct(ets); + + return ets; +} + +GtkWidget *e_tree_scrolled_new_from_spec_file (ETreeModel *etm, + ETableExtras *ete, + const char *spec_fn, + const char *state_fn) +{ + ETreeScrolled *ets; + + g_return_val_if_fail(etm != NULL, NULL); + g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL); + g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL); + g_return_val_if_fail(spec_fn != NULL, NULL); + + ets = gtk_type_new (e_tree_scrolled_get_type ()); + + ets = e_tree_scrolled_construct_from_spec_file (ets, etm, ete, spec_fn, state_fn); + + return GTK_WIDGET (ets); +} + +ETree * +e_tree_scrolled_get_tree (ETreeScrolled *ets) +{ + return ets->tree; +} + +static void +ets_get_arg (GtkObject *o, GtkArg *arg, guint arg_id) +{ + ETreeScrolled *ets = E_TREE_SCROLLED (o); + + switch (arg_id){ + case ARG_TREE: + if (ets->tree) + GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(ets->tree); + else + GTK_VALUE_OBJECT (*arg) = NULL; + break; + } +} + +/* Grab_focus handler for the scrolled ETree */ +static void +ets_grab_focus (GtkWidget *widget) +{ + ETreeScrolled *ets; + + ets = E_TREE_SCROLLED (widget); + + gtk_widget_grab_focus (GTK_WIDGET (ets->tree)); +} + +/* Focus handler for the scrolled ETree */ +static gint +ets_focus (GtkContainer *container, GtkDirectionType direction) +{ + ETreeScrolled *ets; + + ets = E_TREE_SCROLLED (container); + + return gtk_container_focus (GTK_CONTAINER (ets->tree), direction); +} + +static void +e_tree_scrolled_class_init (ETreeScrolledClass *class) +{ + GtkObjectClass *object_class; + GtkWidgetClass *widget_class; + GtkContainerClass *container_class; + + object_class = (GtkObjectClass *) class; + widget_class = (GtkWidgetClass *) class; + container_class = (GtkContainerClass *) class; + + parent_class = gtk_type_class (PARENT_TYPE); + + object_class->get_arg = ets_get_arg; + + widget_class->grab_focus = ets_grab_focus; + + container_class->focus = ets_focus; + + gtk_object_add_arg_type ("ETreeScrolled::tree", GTK_TYPE_OBJECT, + GTK_ARG_READABLE, ARG_TREE); +} + +E_MAKE_TYPE(e_tree_scrolled, "ETreeScrolled", ETreeScrolled, e_tree_scrolled_class_init, e_tree_scrolled_init, PARENT_TYPE); + |