aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
authorMiguel de Icaza <miguel@gnu.org>2001-01-16 07:25:42 +0800
committerMiguel de Icaza <miguel@src.gnome.org>2001-01-16 07:25:42 +0800
commitfeccdbccfbf9fa1c4d2f8b4d50da3a764d475089 (patch)
tree3363907f161a30cf7ea9160e288c529396559d6d /widgets
parentc152134378a6567dd69d6570017fc2ab1cb37f52 (diff)
downloadgsoc2013-evolution-feccdbccfbf9fa1c4d2f8b4d50da3a764d475089.tar.gz
gsoc2013-evolution-feccdbccfbf9fa1c4d2f8b4d50da3a764d475089.tar.zst
gsoc2013-evolution-feccdbccfbf9fa1c4d2f8b4d50da3a764d475089.zip
Document all entry points. (e_table_specification_save_to_file): Change
2001-01-15 Miguel de Icaza <miguel@gnu.org> * 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
Diffstat (limited to 'widgets')
-rw-r--r--widgets/table/e-table-config.c99
-rw-r--r--widgets/table/e-table-header-item.c3
-rw-r--r--widgets/table/e-table-specification.c272
-rw-r--r--widgets/table/e-table-specification.h10
-rw-r--r--widgets/table/e-table.c2
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 <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
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);