2001-01-11 Christopher James Lahey <clahey@helixcode.com> * e-table-selection-model.c, e-table-selection-model.h: Added selection_mode argument. * e-table-specification.c, e-table-specification.h: Added a selection_mode field that is set based on the selection-mode attribute in the ETableSpecification element. * e-table.c (et_real_construct): Set the selection model's selection mode based on the ETableSpecification. svn path=/trunk/; revision=7427
209 lines
5.6 KiB
C
209 lines
5.6 KiB
C
/* -*- 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->selection_mode = GTK_SELECTION_MULTIPLE;
|
|
|
|
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->selection_mode = GTK_SELECTION_MULTIPLE;
|
|
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")) {
|
|
specification->selection_mode = GTK_SELECTION_BROWSE;
|
|
} else if (temp && !strcasecmp(temp, "extended")) {
|
|
specification->selection_mode = GTK_SELECTION_EXTENDED;
|
|
}
|
|
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")) {
|
|
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
|