diff options
Diffstat (limited to 'widgets/table/e-table-specification.c')
-rw-r--r-- | widgets/table/e-table-specification.c | 272 |
1 files changed, 201 insertions, 71 deletions
diff --git a/widgets/table/e-table-specification.c b/widgets/table/e-table-specification.c index e562f85ccb..1a630e7c5c 100644 --- a/widgets/table/e-table-specification.c +++ b/widgets/table/e-table-specification.c @@ -2,10 +2,11 @@ /* * E-table-specification.c: Implements a savable description of the inital state of a table. * - * Author: - * Chris Lahey <clahey@helixcode.com> + * Authors: + * Chris Lahey <clahey@ximian.com> + * Miguel de Icaza (miguel@ximian.com) * - * (C) 2000 Helix Code, Inc. + * (C) 2000, 2001 Ximian, Inc. */ #include <config.h> #include <stdlib.h> @@ -16,7 +17,7 @@ #include "gal/util/e-xml-utils.h" #include "e-table-specification.h" -#define PARENT_TYPE (gtk_object_get_type()) +#define PARENT_TYPE (gtk_object_get_type ()) static GtkObjectClass *etsp_parent_class; @@ -30,16 +31,16 @@ etsp_destroy (GtkObject *object) for (i = 0; etsp->columns[i]; i++) { gtk_object_unref (GTK_OBJECT (etsp->columns[i])); } - g_free(etsp->columns); + g_free (etsp->columns); } if (etsp->state) - gtk_object_unref(GTK_OBJECT(etsp->state)); - g_free(etsp->click_to_add_message_); + 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; + etsp->columns = NULL; + etsp->state = NULL; + etsp->click_to_add_message = NULL; GTK_OBJECT_CLASS (etsp_parent_class)->destroy (object); } @@ -64,11 +65,19 @@ etsp_init (ETableSpecification *etsp) etsp->cursor_mode = E_TABLE_CURSOR_SIMPLE; etsp->selection_mode = GTK_SELECTION_MULTIPLE; - etsp->click_to_add_message_ = NULL; + etsp->click_to_add_message = NULL; } -E_MAKE_TYPE(e_table_specification, "ETableSpecification", ETableSpecification, etsp_class_init, etsp_init, PARENT_TYPE); +E_MAKE_TYPE (e_table_specification, "ETableSpecification", ETableSpecification, etsp_class_init, etsp_init, PARENT_TYPE); +/** + * e_table_specification_new: + * + * Creates a new %ETableSpecification object. This object is used to hold the + * information about the rendering information for ETable. + * + * Returns: a newly created %ETableSpecification object. + */ ETableSpecification * e_table_specification_new (void) { @@ -77,132 +86,253 @@ e_table_specification_new (void) return (ETableSpecification *) etsp; } +/** + * e_table_specification_load_from_file: + * @specification: An ETableSpecification that you want to modify + * @filename: a filename that contains an ETableSpecification + * + * This routine modifies @specification to reflect the state described + * by the file @filename. + * + * Returns: TRUE on success, FALSE on failure. + */ gboolean -e_table_specification_load_from_file (ETableSpecification *specification, - const char *filename) +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); + 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) +/** + * e_table_specification_load_from_string: + * @specification: An ETableSpecification that you want to modify + * @xml: a stringified representation of an ETableSpecification description. + * + * This routine modifies @specification to reflect the state described + * by @xml. @xml is typically returned by e_table_specification_save_to_string + * or it can be embedded in your source code. + * + * Returns: TRUE on success, FALSE on failure. + */ +gboolean +e_table_specification_load_from_string (ETableSpecification *specification, + const char *xml) { xmlDoc *doc; - doc = xmlParseMemory ((char *) xml, strlen(xml)); + doc = xmlParseMemory ( (char *) xml, strlen (xml)); if (doc) { - xmlNode *node = xmlDocGetRootElement(doc); - e_table_specification_load_from_node(specification, node); - xmlFreeDoc(doc); + xmlNode *node = xmlDocGetRootElement (doc); + e_table_specification_load_from_node (specification, node); + xmlFreeDoc (doc); + return TRUE; } + + return FALSE; } +/** + * e_table_specification_load_from_node: + * @specification: An ETableSpecification that you want to modify + * @node: an xmlNode with an XML ETableSpecification description. + * + * This routine modifies @specification to reflect the state described + * by @node. + */ void -e_table_specification_load_from_node (ETableSpecification *specification, - const xmlNode *node) +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->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->selection_mode = GTK_SELECTION_MULTIPLE; - temp = e_xml_get_string_prop_by_name(node, "selection-mode"); - if (temp && !strcasecmp(temp, "single")) { + temp = e_xml_get_string_prop_by_name (node, "selection-mode"); + if (temp && !strcasecmp (temp, "single")) { specification->selection_mode = GTK_SELECTION_SINGLE; - } else if (temp && !strcasecmp(temp, "browse")) { + } else if (temp && !strcasecmp (temp, "browse")) { specification->selection_mode = GTK_SELECTION_BROWSE; - } else if (temp && !strcasecmp(temp, "extended")) { + } else if (temp && !strcasecmp (temp, "extended")) { specification->selection_mode = GTK_SELECTION_EXTENDED; } - g_free(temp); + g_free (temp); specification->cursor_mode = E_TABLE_CURSOR_SIMPLE; - temp = e_xml_get_string_prop_by_name(node, "cursor-mode"); - if (temp && !strcasecmp(temp, "line")) { + 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_); + 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"); + specification->click_to_add_message = + e_xml_get_string_prop_by_name ( + node, "_click-to-add-message"); if (specification->state) - gtk_object_unref(GTK_OBJECT(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])); + gtk_object_unref (GTK_OBJECT (specification->columns[i])); } - g_free(specification->columns); + 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); + 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 = 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); + g_list_free (list); } -#if 0 -void -e_table_specification_save_to_file (ETableSpecification *specification, - const char *filename) +/** + * e_table_specification_save_to_file: + * @specification: An %ETableSpecification that you want to save + * @filename: a file name to store the specification. + * + * This routine stores the @specification into @filename. + * + * Returns: the number of bytes written or -1 on error. + */ +int +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); + + doc = xmlNewDoc (NULL); + xmlDocSetRootElement (doc, e_table_specification_save_to_node (specification, doc)); + return xmlSaveFile (filename, doc); } +/** + * e_table_specification_save_to_string: + * @specification: An %ETableSpecification that you want to stringify + * + * Saves the state of @specification to a string. + * + * Returns: an g_alloc() allocated string containing the stringified + * representation of @specification. This stringified representation + * uses XML as a convenience. + */ char * -e_table_specification_save_to_string (ETableSpecification *specification) +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); + doc = xmlNewDoc (NULL); + xmlDocSetRootElement (doc, e_table_specification_save_to_node (specification, doc)); + xmlDocDumpMemory (doc, &string, &length); - ret_val = g_strdup(string); - xmlFree(string); + ret_val = g_strdup (string); + xmlFree (string); return ret_val; } +/** + * e_table_specification_save_to_node: + * @specification: An ETableSpecification that you want to store. + * @doc: Node where the specification is saved + * + * This routine saves the %ETableSpecification state in the object @specification + * into the xmlDoc represented by @doc. + * + * Returns: The node that has been attached to @doc with the contents + * of the ETableSpecification. + */ xmlNode * -e_table_specification_save_to_node (ETableSpecification *specification, - xmlDoc *doc) +e_table_specification_save_to_node (ETableSpecification *specification, + xmlDoc *doc) { - return NULL; + xmlNode *node = xmlDocGetRootElement (doc); + char *s; + + e_xml_set_bool_prop_by_name (node, "no-headers", specification->no_headers); + e_xml_set_bool_prop_by_name (node, "click-to-add", specification->click_to_add); + e_xml_set_bool_prop_by_name (node, "draw-grid", specification->draw_grid); + + switch (specification->selection_mode){ + case GTK_SELECTION_SINGLE: + s = "single"; + break; + case GTK_SELECTION_BROWSE: + s = "browse"; + break; + default: + case GTK_SELECTION_EXTENDED: + s = "extended"; + } + xmlSetProp (node, "selection-mode", s); + if (specification->cursor_mode == E_TABLE_CURSOR_LINE) + s = "line"; + else + s = "cell"; + xmlSetProp (node, "cursor-mode", s); + + xmlSetProp (node, "_click-to-add-message", specification->click_to_add_message); + + if (specification->columns){ + int i; + + for (i = 0; specification->columns [i]; i++) + e_table_column_specification_save_to_node ( + specification->columns [i], + node); + } + + if (specification->state) + e_table_state_save_to_node (specification->state, node); + + return node; +} + +/** + * e_table_specification_duplicate: + * @spec: specification to duplicate + * + * This creates a copy of the %ETableSpecification @spec + * + * Returns: The duplicated %ETableSpecification. + */ +ETableSpecification * +e_table_specification_duplicate (ETableSpecification *spec) +{ + ETableSpecification *new_spec = e_table_specification_new (); + char *spec_str = e_table_specification_save_to_string (spec); + + printf ("This is the spec: \n%s\n", spec_str); + e_table_specification_load_from_string (new_spec, spec_str); + + return new_spec; } -#endif |