diff options
Diffstat (limited to 'widgets/table/e-table-specification.c')
-rw-r--r-- | widgets/table/e-table-specification.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/widgets/table/e-table-specification.c b/widgets/table/e-table-specification.c new file mode 100644 index 0000000000..d95c5147c8 --- /dev/null +++ b/widgets/table/e-table-specification.c @@ -0,0 +1,196 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * E-table-specification.c: Implements a savable description of the inital state of a table. + * + * Author: + * Chris Lahey <clahey@helixcode.com> + * + * (C) 2000 Helix Code, Inc. + */ +#include <config.h> +#include <stdlib.h> +#include <gtk/gtksignal.h> +#include <gnome-xml/parser.h> +#include <gnome-xml/xmlmemory.h> +#include "gal/util/e-util.h" +#include "gal/util/e-xml-utils.h" +#include "e-table-specification.h" + +#define PARENT_TYPE (gtk_object_get_type()) + +static GtkObjectClass *etsp_parent_class; + +static void +etsp_destroy (GtkObject *object) +{ + ETableSpecification *etsp = E_TABLE_SPECIFICATION (object); + int i; + + if (etsp->columns) { + for (i = 0; etsp->columns[i]; i++) { + gtk_object_unref (GTK_OBJECT (etsp->columns[i])); + } + g_free(etsp->columns); + } + + if (etsp->state) + gtk_object_unref(GTK_OBJECT(etsp->state)); + g_free(etsp->click_to_add_message_); + + etsp->columns = NULL; + etsp->state = NULL; + etsp->click_to_add_message_ = NULL; + + GTK_OBJECT_CLASS (etsp_parent_class)->destroy (object); +} + +static void +etsp_class_init (GtkObjectClass *klass) +{ + etsp_parent_class = gtk_type_class (PARENT_TYPE); + + klass->destroy = etsp_destroy; +} + +static void +etsp_init (ETableSpecification *etsp) +{ + etsp->columns = NULL; + etsp->state = NULL; + + etsp->no_headers = FALSE; + etsp->click_to_add = FALSE; + etsp->draw_grid = FALSE; + etsp->cursor_mode = E_TABLE_CURSOR_SIMPLE; + + etsp->click_to_add_message_ = NULL; +} + +E_MAKE_TYPE(e_table_specification, "ETableSpecification", ETableSpecification, etsp_class_init, etsp_init, PARENT_TYPE); + +ETableSpecification * +e_table_specification_new (void) +{ + ETableSpecification *etsp = gtk_type_new (E_TABLE_SPECIFICATION_TYPE); + + return (ETableSpecification *) etsp; +} + +gboolean +e_table_specification_load_from_file (ETableSpecification *specification, + const char *filename) +{ + xmlDoc *doc; + doc = xmlParseFile (filename); + if (doc) { + xmlNode *node = xmlDocGetRootElement(doc); + e_table_specification_load_from_node(specification, node); + xmlFreeDoc(doc); + return TRUE; + } + return FALSE; +} + +void +e_table_specification_load_from_string (ETableSpecification *specification, + const char *xml) +{ + xmlDoc *doc; + doc = xmlParseMemory ((char *) xml, strlen(xml)); + if (doc) { + xmlNode *node = xmlDocGetRootElement(doc); + e_table_specification_load_from_node(specification, node); + xmlFreeDoc(doc); + } +} + +void +e_table_specification_load_from_node (ETableSpecification *specification, + const xmlNode *node) +{ + char *temp; + xmlNode *children; + GList *list = NULL, *list2; + int i; + + specification->no_headers = e_xml_get_bool_prop_by_name(node, "no-headers"); + specification->click_to_add = e_xml_get_bool_prop_by_name(node, "click-to-add"); + specification->draw_grid = e_xml_get_bool_prop_by_name(node, "draw-grid"); + + specification->cursor_mode = E_TABLE_CURSOR_SIMPLE; + temp = e_xml_get_string_prop_by_name(node, "cursor-mode"); + if (temp && strcasecmp(temp, "line")) { + specification->cursor_mode = E_TABLE_CURSOR_LINE; + } + g_free(temp); + + g_free(specification->click_to_add_message_); + + specification->click_to_add_message_ = e_xml_get_translated_string_prop_by_name(node, "_click-to-add-message"); + + if (specification->state) + gtk_object_unref(GTK_OBJECT(specification->state)); + specification->state = NULL; + if (specification->columns) { + for (i = 0; specification->columns[i]; i++) { + gtk_object_unref(GTK_OBJECT(specification->columns[i])); + } + g_free(specification->columns); + } + specification->columns = NULL; + + for (children = node->xmlChildrenNode; children; children = children->next) { + if (!strcmp(children->name, "ETableColumn")) { + ETableColumnSpecification *col_spec = e_table_column_specification_new(); + + e_table_column_specification_load_from_node(col_spec, children); + list = g_list_append(list, col_spec); + } else if (specification->state == NULL && !strcmp(children->name, "ETableState")) { + specification->state = e_table_state_new(); + e_table_state_load_from_node(specification->state, children); + } + } + + specification->columns = g_new(ETableColumnSpecification *, g_list_length(list) + 1); + for (list2 = list, i = 0; list2; list2 = g_list_next(list2), i++) { + specification->columns[i] = list2->data; + } + specification->columns[i] = NULL; + g_list_free(list); +} + +#if 0 +void +e_table_specification_save_to_file (ETableSpecification *specification, + const char *filename) +{ + xmlDoc *doc; + doc = xmlNewDoc(NULL); + xmlDocSetRootElement(doc, e_table_specification_save_to_node(specification, doc)); + xmlSaveFile(filename, doc); +} + +char * +e_table_specification_save_to_string (ETableSpecification *specification) +{ + char *ret_val; + xmlChar *string; + int length; + xmlDoc *doc; + + doc = xmlNewDoc(NULL); + xmlDocSetRootElement(doc, e_table_specification_save_to_node(specification, doc)); + xmlDocDumpMemory(doc, &string, &length); + + ret_val = g_strdup(string); + xmlFree(string); + return ret_val; +} + +xmlNode * +e_table_specification_save_to_node (ETableSpecification *specification, + xmlDoc *doc) +{ + return NULL; +} +#endif |