Files
evolution/widgets/table/e-table-state.c
Christopher James Lahey 51284ee84a Destroy text and pixbuf if they exist whether or not is_pixbuf is set.
2000-12-23  Christopher James Lahey  <clahey@helixcode.com>

	* e-table-col.c, e-table-col.h (etc_destroy): Destroy text and
	pixbuf if they exist whether or not is_pixbuf is set.
	(e_table_col_new_with_pixbuf): Make new_with_pixbuf take a title
	argument which is for when you can't display pixmaps.

	* e-table-column-specification.c
	(e_table_column_specification_load_from_node): Don't translate the
	pixbuf string attribute.

	* e-table-sort-info.c, e-table-sort-info.h
	(e_table_sort_info_load_from_node): Added a state_version
	parameter to the load_from_node function.  This lets the loader
	specify which version of ETableState is being processed.  If it's
	less than .05, use the old nested version.  If it's greater, use
	the new flat version.
	(e_table_sort_info_save_to_node): Changed this to store a list of
	group and leaf nodes instead of nesting the group nodes and leaf
	nodes one inside the other.  This is much easier to understand and
	requires less typing when creating a new ETableSpecification's
	initial ETableState.

	* e-table-state.c: Changed the state-version parameter to 0.1.
	(e_table_state_load_from_node): Use
	e_xml_get_double_prop_by_name_with_default so that we can specify
	a state-version default of 0.1 for people writing ETableStates by
	hand.  Pass the state-version to e_table_sort_info_load_from_node.

	* e-table.c (et_col_spec_to_col): Pass the title from the
	ETableColumnSpecification to the ETableCol even if it's a pixbuf
	column.

svn path=/trunk/; revision=7138
2000-12-23 05:55:20 +00:00

174 lines
4.0 KiB
C

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* E-table-state.c: Savable 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-state.h"
#define PARENT_TYPE (gtk_object_get_type())
#define STATE_VERSION 0.1
static GtkObjectClass *etst_parent_class;
static void
etst_destroy (GtkObject *object)
{
ETableState *etst = E_TABLE_STATE (object);
if (etst->columns)
g_free (etst->columns);
GTK_OBJECT_CLASS (etst_parent_class)->destroy (object);
}
static void
etst_class_init (GtkObjectClass *klass)
{
etst_parent_class = gtk_type_class (PARENT_TYPE);
klass->destroy = etst_destroy;
}
E_MAKE_TYPE(e_table_state, "ETableState", ETableState, etst_class_init, NULL, PARENT_TYPE);
ETableState *
e_table_state_new (void)
{
ETableState *etst = gtk_type_new (E_TABLE_STATE_TYPE);
return (ETableState *) etst;
}
gboolean
e_table_state_load_from_file (ETableState *state,
const char *filename)
{
xmlDoc *doc;
doc = xmlParseFile (filename);
if (doc) {
xmlNode *node = xmlDocGetRootElement(doc);
e_table_state_load_from_node(state, node);
xmlFreeDoc(doc);
return TRUE;
}
return FALSE;
}
void
e_table_state_load_from_string (ETableState *state,
const char *xml)
{
xmlDoc *doc;
doc = xmlParseMemory ((char *) xml, strlen(xml));
if (doc) {
xmlNode *node = xmlDocGetRootElement(doc);
e_table_state_load_from_node(state, node);
xmlFreeDoc(doc);
}
}
void
e_table_state_load_from_node (ETableState *state,
const xmlNode *node)
{
xmlNode *children;
GList *list = NULL, *iterator;
gdouble state_version;
int i;
state_version = e_xml_get_double_prop_by_name_with_default(node, "state-version", STATE_VERSION);
if (state->sort_info)
gtk_object_unref(GTK_OBJECT(state->sort_info));
state->sort_info = NULL;
for (children = node->xmlChildrenNode; children; children = children->next) {
if (!strcmp(children->name, "column")) {
int *column = g_new(int, 1);
*column = e_xml_get_integer_prop_by_name(children, "source");
list = g_list_append(list, column);
} else if (state->sort_info == NULL && !strcmp(children->name, "grouping")) {
state->sort_info = e_table_sort_info_new();
e_table_sort_info_load_from_node(state->sort_info, children, state_version);
}
}
g_free(state->columns);
state->col_count = g_list_length(list);
state->columns = g_new(int, state->col_count);
for (iterator = list, i = 0; iterator; iterator = g_list_next(iterator), i++) {
state->columns[i] = *(int *)iterator->data;
g_free(iterator->data);
}
g_list_free(list);
}
void
e_table_state_save_to_file (ETableState *state,
const char *filename)
{
xmlDoc *doc;
doc = xmlNewDoc("1.0");
xmlDocSetRootElement(doc, e_table_state_save_to_node(state, NULL));
xmlSaveFile(filename, doc);
xmlFreeDoc(doc);
}
char *
e_table_state_save_to_string (ETableState *state)
{
char *ret_val;
xmlChar *string;
int length;
xmlDoc *doc;
doc = xmlNewDoc(NULL);
xmlDocSetRootElement(doc, e_table_state_save_to_node(state, NULL));
xmlDocDumpMemory(doc, &string, &length);
xmlFreeDoc(doc);
ret_val = g_strdup(string);
xmlFree(string);
return ret_val;
}
xmlNode *
e_table_state_save_to_node (ETableState *state,
xmlNode *parent)
{
int i;
xmlNode *node;
if (parent)
node = xmlNewChild (parent, NULL, "ETableState", NULL);
else
node = xmlNewNode (NULL, "ETableState");
e_xml_set_double_prop_by_name(node, "state-version", STATE_VERSION);
for (i = 0; i < state->col_count; i++) {
int column = state->columns[i];
xmlNode *new_node;
new_node = xmlNewChild(node, NULL, "column", NULL);
e_xml_set_integer_prop_by_name (new_node, "source", column);
}
e_table_sort_info_save_to_node(state->sort_info, node);
return node;
}