aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table-specification.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/table/e-table-specification.c')
-rw-r--r--widgets/table/e-table-specification.c196
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