From feccdbccfbf9fa1c4d2f8b4d50da3a764d475089 Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Mon, 15 Jan 2001 23:25:42 +0000 Subject: Document all entry points. (e_table_specification_save_to_file): Change 2001-01-15 Miguel de Icaza * e-table-specification.c: Document all entry points. (e_table_specification_save_to_file): Change prototype to return the number of bytes written. (e_table_specification_duplicate): Implement a function to duplicate nodes. (e_table_specification_save_to_node): Implement missing function. (e_table_specification_save_to_file): Enable. (e_table_specification_save_to_string): Enable. (e_table_specification_load_from_node): Just load the normal version of the click-to-add-message version, let other code translate it. (e_table_specification_load_from_string): Alter prototype to return success code. * e-table-specification.h: Do not store the translated version, store the plain version, so we can restore this later during the saving routines. * e-table.c (et_real_construct): Translate click to add message here. * e-table-header-item.c: Destroy config object if we are destroyed. svn path=/trunk/; revision=7518 --- widgets/table/e-table-config.c | 99 +++++++------ widgets/table/e-table-header-item.c | 3 + widgets/table/e-table-specification.c | 272 +++++++++++++++++++++++++--------- widgets/table/e-table-specification.h | 10 +- widgets/table/e-table.c | 2 +- 5 files changed, 265 insertions(+), 121 deletions(-) diff --git a/widgets/table/e-table-config.c b/widgets/table/e-table-config.c index 1745c181ed..a2cb56ae56 100644 --- a/widgets/table/e-table-config.c +++ b/widgets/table/e-table-config.c @@ -28,13 +28,17 @@ config_destroy (GtkObject *object) if (config->state) { if (config->sorting_changed_id) - gtk_signal_disconnect(GTK_OBJECT(config->state->sort_info), config->sorting_changed_id); + gtk_signal_disconnect ( + GTK_OBJECT (config->state->sort_info), + config->sorting_changed_id); if (config->grouping_changed_id) - gtk_signal_disconnect(GTK_OBJECT(config->state->sort_info), config->grouping_changed_id); - gtk_object_unref(GTK_OBJECT(config->state)); + gtk_signal_disconnect ( + GTK_OBJECT(config->state->sort_info), + config->grouping_changed_id); + gtk_object_unref (GTK_OBJECT (config->state)); } - gtk_object_unref(GTK_OBJECT(config->spec)); + gtk_object_unref (GTK_OBJECT (config->spec)); GTK_OBJECT_CLASS (config_parent_class)->destroy (object); } @@ -51,14 +55,14 @@ static void config_clear_sort (GtkWidget *widget, ETableConfig *config) { config->sort_dialog = NULL; - gtk_object_unref(GTK_OBJECT(config)); + gtk_object_unref (GTK_OBJECT(config)); } static void config_clear_group (GtkWidget *widget, ETableConfig *config) { config->group_dialog = NULL; - gtk_object_unref(GTK_OBJECT(config)); + gtk_object_unref (GTK_OBJECT (config)); } static void @@ -68,30 +72,37 @@ config_sort_config_show (GtkWidget *widget, ETableConfig *config) gdk_window_raise (GTK_WIDGET (config->sort_dialog)->window); else { GtkWidget *etcf; - config->sort_dialog = gnome_dialog_new(_("Sort"), - GNOME_STOCK_BUTTON_OK, - NULL); - etcf = GTK_WIDGET(e_table_config_field_new(config->spec, - config->state->sort_info, - FALSE)); - gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(config->sort_dialog)->vbox), etcf, FALSE, FALSE, 0); - gnome_dialog_set_parent(GNOME_DIALOG(config->sort_dialog), - GTK_WINDOW(config)); - - gtk_signal_connect(GTK_OBJECT(config->sort_dialog), "destroy", - GTK_SIGNAL_FUNC(config_clear_sort), config); - gtk_object_ref(GTK_OBJECT(config)); - - gtk_signal_connect(GTK_OBJECT(config->sort_dialog), "clicked", - GTK_SIGNAL_FUNC(gnome_dialog_close), config); - - gtk_widget_show(GTK_WIDGET(etcf)); - gtk_widget_show(GTK_WIDGET(config->sort_dialog)); + config->sort_dialog = gnome_dialog_new ( + _("Sort"), + GNOME_STOCK_BUTTON_OK, + NULL); + etcf = GTK_WIDGET (e_table_config_field_new + (config->spec, + config->state->sort_info, + FALSE)); + gtk_box_pack_start ( + GTK_BOX (GNOME_DIALOG (config->sort_dialog)->vbox), + etcf, FALSE, FALSE, 0); + gnome_dialog_set_parent ( + GNOME_DIALOG (config->sort_dialog), + GTK_WINDOW(config)); + + gtk_signal_connect ( + GTK_OBJECT (config->sort_dialog), "destroy", + GTK_SIGNAL_FUNC (config_clear_sort), config); + gtk_object_ref (GTK_OBJECT (config)); + + gtk_signal_connect ( + GTK_OBJECT (config->sort_dialog), "clicked", + GTK_SIGNAL_FUNC(gnome_dialog_close), config); + + gtk_widget_show (GTK_WIDGET (etcf)); + gtk_widget_show (GTK_WIDGET (config->sort_dialog)); } } static void -config_group_config_show(GtkWidget *widget, ETableConfig *config) +config_group_config_show (GtkWidget *widget, ETableConfig *config) { if (config->group_dialog) gdk_window_raise(GTK_WIDGET(config->group_dialog)->window); @@ -292,24 +303,6 @@ config_init (ETableConfig *config) config->grouping_changed_id = 0; } -E_MAKE_TYPE(e_table_config, "ETableConfig", ETableConfig, config_class_init, config_init, PARENT_TYPE); - -ETableConfig * -e_table_config_new (const char *header, - ETableSpecification *spec, - ETableState *state) -{ - ETableConfig *config = gtk_type_new (E_TABLE_CONFIG_TYPE); - - if (e_table_config_construct (config, config, spec, state) == NULL){ - gtk_object_destroy (GTK_OBJECT (config)); - return NULL; - } - - gtk_widget_show (config->dialog_toplevel); - return E_TABLE_CONFIG (config); -} - ETableConfig * e_table_config_construct (ETableConfig *config, const char *header, @@ -345,8 +338,26 @@ e_table_config_construct (ETableConfig *config, return E_TABLE_CONFIG (config); } +ETableConfig * +e_table_config_new (const char *header, + ETableSpecification *spec, + ETableState *state) +{ + ETableConfig *config = gtk_type_new (E_TABLE_CONFIG_TYPE); + + if (e_table_config_construct (config, header, spec, state) == NULL){ + gtk_object_destroy (GTK_OBJECT (config)); + return NULL; + } + + gtk_widget_show (config->dialog_toplevel); + return E_TABLE_CONFIG (config); +} + void e_table_config_raise (ETableConfig *config) { gdk_window_raise (GTK_WIDGET (config->dialog_toplevel)->window); } + +E_MAKE_TYPE(e_table_config, "ETableConfig", ETableConfig, config_class_init, config_init, PARENT_TYPE); diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c index e67b83edb5..839cb5bce2 100644 --- a/widgets/table/e-table-header-item.c +++ b/widgets/table/e-table-header-item.c @@ -102,6 +102,9 @@ ethi_destroy (GtkObject *object){ if (ethi->full_header) gtk_object_unref (GTK_OBJECT(ethi->full_header)); + if (ethi->config) + gtk_object_destroy (GTK_OBJECT (ethi->config)); + if (GTK_OBJECT_CLASS (ethi_parent_class)->destroy) (*GTK_OBJECT_CLASS (ethi_parent_class)->destroy) (object); } 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 + * Authors: + * Chris Lahey + * Miguel de Icaza (miguel@ximian.com) * - * (C) 2000 Helix Code, Inc. + * (C) 2000, 2001 Ximian, Inc. */ #include #include @@ -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 diff --git a/widgets/table/e-table-specification.h b/widgets/table/e-table-specification.h index 64e784733a..3434c51088 100644 --- a/widgets/table/e-table-specification.h +++ b/widgets/table/e-table-specification.h @@ -25,7 +25,8 @@ typedef struct { guint draw_grid : 1; GtkSelectionMode selection_mode; ETableCursorMode cursor_mode; - char *click_to_add_message_; + + char *click_to_add_message; } ETableSpecification; typedef struct { @@ -37,17 +38,16 @@ ETableSpecification *e_table_specification_new (void); gboolean e_table_specification_load_from_file (ETableSpecification *specification, const char *filename); -void e_table_specification_load_from_string (ETableSpecification *specification, +gboolean e_table_specification_load_from_string (ETableSpecification *specification, const char *xml); void e_table_specification_load_from_node (ETableSpecification *specification, const xmlNode *node); -#if 0 -void e_table_specification_save_to_file (ETableSpecification *specification, +int e_table_specification_save_to_file (ETableSpecification *specification, const char *filename); char *e_table_specification_save_to_string (ETableSpecification *specification); xmlNode *e_table_specification_save_to_node (ETableSpecification *specification, xmlDoc *doc); -#endif +ETableSpecification *e_table_specification_duplicate (ETableSpecification *spec); #endif /* _E_TABLE_SPECIFICATION_H_ */ diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c index eec3f44735..f2b301db29 100644 --- a/widgets/table/e-table.c +++ b/widgets/table/e-table.c @@ -888,7 +888,7 @@ et_real_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete, ete = e_table_extras_new(); e_table->use_click_to_add = specification->click_to_add; - e_table->click_to_add_message = g_strdup(specification->click_to_add_message_); + e_table->click_to_add_message = g_strdup (_(specification->click_to_add_message)); e_table->draw_grid = specification->draw_grid; e_table->cursor_mode = specification->cursor_mode; e_table->full_header = et_spec_to_full_header(e_table, specification, ete); -- cgit v1.2.3