aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/table/e-table.c')
-rw-r--r--widgets/table/e-table.c317
1 files changed, 194 insertions, 123 deletions
diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c
index a9598c214f..2e14d0374c 100644
--- a/widgets/table/e-table.c
+++ b/widgets/table/e-table.c
@@ -18,11 +18,8 @@
#include <stdio.h>
#include <libgnomeui/gnome-canvas.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 "gal/widgets/e-canvas.h"
#include "gal/widgets/e-canvas-vbox.h"
#include "e-table.h"
@@ -32,6 +29,9 @@
#include "e-table-group.h"
#include "e-table-group-leaf.h"
#include "e-table-click-to-add.h"
+#include "e-table-specification.h"
+#include "e-table-state.h"
+#include "e-table-column-specification.h"
#define COLUMN_HEADER_HEIGHT 16
@@ -594,26 +594,74 @@ e_table_fill_table (ETable *e_table, ETableModel *model)
e_table_group_add_all (e_table->group);
}
+static ETableCol *
+et_col_spec_to_col (ETable *e_table, ETableColumnSpecification *col_spec, ETableExtras *ete)
+{
+ ETableCol *col = NULL;
+ ECell *cell;
+ GCompareFunc compare;
+
+ cell = e_table_extras_get_cell(ete, col_spec->cell);
+ compare = e_table_extras_get_compare(ete, col_spec->compare);
+
+ if (cell && compare) {
+ if (col_spec->title_ && *col_spec->title_) {
+ col = e_table_col_new (col_spec->model_col, col_spec->title_,
+ col_spec->expansion, col_spec->minimum_width,
+ cell, compare, col_spec->resizable);
+ } else if (col_spec->pixbuf && *col_spec->pixbuf) {
+ GdkPixbuf *pixbuf;
+
+ pixbuf = e_table_extras_get_pixbuf(ete, col_spec->pixbuf);
+ if (pixbuf) {
+ col = e_table_col_new_with_pixbuf (col_spec->model_col, pixbuf,
+ col_spec->expansion, col_spec->minimum_width,
+ cell, compare, col_spec->resizable);
+ }
+ }
+ }
+ return col;
+}
+
static ETableHeader *
-et_xml_to_header (ETable *e_table, ETableHeader *full_header, xmlNode *xmlColumns)
+et_spec_to_full_header (ETable *e_table, ETableSpecification *spec, ETableExtras *ete)
+{
+ ETableHeader *nh;
+ int column;
+
+ g_return_val_if_fail (e_table, NULL);
+ g_return_val_if_fail (spec, NULL);
+ g_return_val_if_fail (ete, NULL);
+
+ nh = e_table_header_new ();
+
+ for (column = 0; spec->columns[column]; column++) {
+ ETableCol *col = et_col_spec_to_col(e_table, spec->columns[column], ete);
+
+ if (col)
+ e_table_header_add_column (nh, col, -1);
+ }
+
+ return nh;
+}
+
+static ETableHeader *
+et_state_to_header (ETable *e_table, ETableHeader *full_header, ETableState *state)
{
ETableHeader *nh;
- xmlNode *column;
const int max_cols = e_table_header_count (full_header);
+ int column;
g_return_val_if_fail (e_table, NULL);
g_return_val_if_fail (full_header, NULL);
- g_return_val_if_fail (xmlColumns, NULL);
+ g_return_val_if_fail (state, NULL);
nh = e_table_header_new ();
- for (column = xmlColumns->childs; column; column = column->next) {
- gchar *content;
+ for (column = 0; column < state->col_count; column++) {
int col;
- content = xmlNodeListGetString (column->doc, column->childs, 1);
- col = atoi (content);
- xmlFree (content);
+ col = state->columns[column];
if (col >= max_cols)
continue;
@@ -625,105 +673,93 @@ et_xml_to_header (ETable *e_table, ETableHeader *full_header, xmlNode *xmlColumn
}
static void
-et_xml_config_header (ETable *e_table, xmlNode *xmlColumns)
+et_set_state(ETable *e_table, ETableState *state)
{
- xmlNode *column;
- const int max_cols = e_table_header_count(e_table->full_header);
- int i;
-
- for (i=e_table_header_count(e_table->header)-1;i>=0;i--) {
- e_table_header_remove(e_table->header, i);
- }
-
- for (column = xmlColumns->childs; column; column = column->next) {
- char *content;
- int col;
+ if (e_table->header)
+ gtk_object_unref(GTK_OBJECT(e_table->header));
+ e_table->header = et_state_to_header (e_table, e_table->full_header, state);
+ if (e_table->header)
+ gtk_object_ref(GTK_OBJECT(e_table->header));
- content = xmlNodeListGetString (column->doc, column->childs, 1);
- col = atoi (content);
- xmlFree (content);
+ if (e_table->sort_info)
+ gtk_object_unref(GTK_OBJECT(e_table->sort_info));
+ e_table->sort_info = state->sort_info;
+ if (e_table->sort_info)
+ gtk_object_ref(GTK_OBJECT(e_table->sort_info));
- if (col >= max_cols)
- continue;
+ if (e_table->header_item)
+ gtk_object_set(GTK_OBJECT(e_table->header_item),
+ "ETableHeader", e_table->header,
+ "sort_info", e_table->sort_info,
+ NULL);
+ if (e_table->click_to_add)
+ gtk_object_set(GTK_OBJECT(e_table->click_to_add),
+ "header", e_table->header,
+ NULL);
- e_table_header_add_column (e_table->header, e_table_header_get_column (e_table->full_header, col), -1);
- }
+ e_table->need_rebuild = TRUE;
+ if (!e_table->rebuild_idle_id)
+ e_table->rebuild_idle_id = g_idle_add_full (20, changed_idle, e_table, NULL);
}
-static void
-et_grouping_xml_to_sort_info (ETable *table, xmlNode *grouping)
+void e_table_set_state (ETable *e_table,
+ const gchar *state_str)
{
- int i;
+ ETableState *state;
- g_return_if_fail (table!=NULL);
- g_return_if_fail (grouping!=NULL);
-
- table->sort_info = e_table_sort_info_new ();
-
- gtk_object_ref (GTK_OBJECT (table->sort_info));
- gtk_object_sink (GTK_OBJECT (table->sort_info));
-
- i = 0;
- for (grouping = grouping->childs; grouping && !strcmp (grouping->name, "group"); grouping = grouping->childs) {
- ETableSortColumn column;
- column.column = e_xml_get_integer_prop_by_name (grouping, "column");
- column.ascending = e_xml_get_integer_prop_by_name (grouping, "ascending");
- e_table_sort_info_grouping_set_nth(table->sort_info, i++, column);
- }
- i = 0;
- for (; grouping && !strcmp (grouping->name, "leaf"); grouping = grouping->childs) {
- ETableSortColumn column;
- column.column = e_xml_get_integer_prop_by_name (grouping, "column");
- column.ascending = e_xml_get_integer_prop_by_name (grouping, "ascending");
- e_table_sort_info_sorting_set_nth(table->sort_info, i++, column);
- }
+ g_return_if_fail(e_table != NULL);
+ g_return_if_fail(E_IS_TABLE(e_table));
+ g_return_if_fail(state_str != NULL);
- table->group_info_change_id =
- gtk_signal_connect (GTK_OBJECT (table->sort_info), "group_info_changed",
- GTK_SIGNAL_FUNC (sort_info_changed), table);
+ state = e_table_state_new();
+ e_table_state_load_from_string(state, state_str);
+
+ et_set_state(e_table, state);
+
+ gtk_object_sink(GTK_OBJECT(state));
}
-static int
-et_real_set_specification (ETable *e_table, xmlDoc *xmlSpec)
+void e_table_load_state (ETable *e_table,
+ const gchar *filename)
{
- xmlNode *xmlRoot;
- xmlNode *xmlColumns;
- xmlNode *xmlGrouping;
+ ETableState *state;
+
+ g_return_if_fail(e_table != NULL);
+ g_return_if_fail(E_IS_TABLE(e_table));
+ g_return_if_fail(filename != NULL);
+
+ state = e_table_state_new();
+ e_table_state_load_from_file(state, filename);
- xmlRoot = xmlDocGetRootElement (xmlSpec);
- xmlColumns = e_xml_get_child_by_name (xmlRoot, "columns-shown");
- xmlGrouping = e_xml_get_child_by_name (xmlRoot, "grouping");
+ et_set_state(e_table, state);
- if ((xmlColumns == NULL) || (xmlGrouping == NULL))
- return -1;
+ gtk_object_sink(GTK_OBJECT(state));
+}
- et_xml_config_header(e_table, xmlColumns);
+gchar *e_table_get_state (ETable *e_table)
+{
+ return NULL;
+}
- return 0;
+void e_table_save_state (ETable *e_table,
+ const gchar *filename)
+{
}
+
static ETable *
-et_real_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- xmlDoc *xmlSpec)
+et_real_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete,
+ ETableSpecification *specification, ETableState *state)
{
- xmlNode *xmlRoot;
- xmlNode *xmlColumns;
- xmlNode *xmlGrouping;
- gboolean no_header;
int row = 0;
- xmlRoot = xmlDocGetRootElement (xmlSpec);
- xmlColumns = e_xml_get_child_by_name (xmlRoot, "columns-shown");
- xmlGrouping = e_xml_get_child_by_name (xmlRoot, "grouping");
-
- if ((xmlColumns == NULL) || (xmlGrouping == NULL))
- return NULL;
+ if (ete)
+ gtk_object_ref(GTK_OBJECT(ete));
+ else
+ ete = e_table_extras_new();
- no_header = e_xml_get_integer_prop_by_name(xmlRoot, "no-header");
- e_table->use_click_to_add = e_xml_get_integer_prop_by_name(xmlRoot, "click-to-add");
-
- e_table->full_header = full_header;
- gtk_object_ref (GTK_OBJECT (full_header));
+ e_table->use_click_to_add = specification->click_to_add;
+ e_table->full_header = et_spec_to_full_header(e_table, specification, ete);
e_table->model = etm;
gtk_object_ref (GTK_OBJECT (etm));
@@ -731,8 +767,13 @@ et_real_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
gtk_widget_push_visual (gdk_rgb_get_visual ());
gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- e_table->header = et_xml_to_header (e_table, full_header, xmlColumns);
- et_grouping_xml_to_sort_info (e_table, xmlGrouping);
+ e_table->header = et_state_to_header (e_table, e_table->full_header, state);
+ e_table->sort_info = state->sort_info;
+
+ e_table->group_info_change_id =
+ gtk_signal_connect (GTK_OBJECT (e_table->sort_info), "group_info_changed",
+ GTK_SIGNAL_FUNC (sort_info_changed), e_table);
+
gtk_object_set(GTK_OBJECT(e_table->header),
"sort_info", e_table->sort_info,
@@ -745,16 +786,16 @@ et_real_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
"sorter", e_table->sorter,
NULL);
- if (!no_header) {
+ if (!specification->no_headers) {
e_table_setup_header (e_table);
}
- e_table_setup_table (e_table, full_header, e_table->header, etm);
+ e_table_setup_table (e_table, e_table->full_header, e_table->header, etm);
e_table_fill_table (e_table, etm);
gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas))->step_increment = 20;
gtk_adjustment_changed(gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas)));
- if (!no_header) {
+ if (!specification->no_headers) {
/*
* The header
*/
@@ -773,91 +814,120 @@ et_real_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
gtk_widget_pop_colormap ();
gtk_widget_pop_visual ();
+ gtk_object_unref(GTK_OBJECT(ete));
+
return e_table;
}
ETable *
-e_table_construct (ETable *e_table, ETableHeader *full_header,
- ETableModel *etm, const char *spec)
+e_table_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete,
+ const char *spec_str, const char *state_str)
{
- xmlDoc *xmlSpec;
- char *copy;
+ ETableSpecification *specification;
+ ETableState *state;
g_return_val_if_fail(e_table != NULL, NULL);
g_return_val_if_fail(E_IS_TABLE(e_table), NULL);
- g_return_val_if_fail(full_header != NULL, NULL);
- g_return_val_if_fail(E_IS_TABLE_HEADER(full_header), NULL);
g_return_val_if_fail(etm != NULL, NULL);
g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
- g_return_val_if_fail(spec != NULL, NULL);
+ g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
+ g_return_val_if_fail(spec_str != NULL, NULL);
+
+ specification = e_table_specification_new();
+ e_table_specification_load_from_string(specification, spec_str);
+ if (state_str) {
+ state = e_table_state_new();
+ e_table_state_load_from_string(state, state_str);
+ } else {
+ state = specification->state;
+ gtk_object_ref(GTK_OBJECT(state));
+ }
- copy = g_strdup (spec);
+ e_table = et_real_construct (e_table, etm, ete, specification, state);
- xmlSpec = xmlParseMemory (copy, strlen(copy));
- e_table = et_real_construct (e_table, full_header, etm, xmlSpec);
- xmlFreeDoc (xmlSpec);
- g_free (copy);
+ gtk_object_unref(GTK_OBJECT(specification));
+ gtk_object_unref(GTK_OBJECT(state));
return e_table;
}
ETable *
-e_table_construct_from_spec_file (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
- const char *filename)
+e_table_construct_from_spec_file (ETable *e_table, ETableModel *etm, ETableExtras *ete,
+ const char *spec_fn, const char *state_fn)
{
- xmlDoc *xmlSpec;
+ ETableSpecification *specification;
+ ETableState *state;
g_return_val_if_fail(e_table != NULL, NULL);
g_return_val_if_fail(E_IS_TABLE(e_table), NULL);
- g_return_val_if_fail(full_header != NULL, NULL);
- g_return_val_if_fail(E_IS_TABLE_HEADER(full_header), NULL);
g_return_val_if_fail(etm != NULL, NULL);
g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
- g_return_val_if_fail(filename != NULL, NULL);
+ g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
+ g_return_val_if_fail(spec_fn != NULL, NULL);
- xmlSpec = xmlParseFile (filename);
- e_table = et_real_construct (e_table, full_header, etm, xmlSpec);
- xmlFreeDoc (xmlSpec);
+ specification = e_table_specification_new();
+ if (!e_table_specification_load_from_file(specification, spec_fn)) {
+ gtk_object_unref(GTK_OBJECT(specification));
+ return NULL;
+ }
+
+ if (state_fn) {
+ state = e_table_state_new();
+ if (!e_table_state_load_from_file(state, state_fn)) {
+ gtk_object_unref(GTK_OBJECT(state));
+ state = specification->state;
+ gtk_object_ref(GTK_OBJECT(state));
+ }
+ } else {
+ state = specification->state;
+ gtk_object_ref(GTK_OBJECT(state));
+ }
+
+ e_table = et_real_construct (e_table, etm, ete, specification, state);
+
+ gtk_object_unref(GTK_OBJECT(specification));
+ gtk_object_unref(GTK_OBJECT(state));
return e_table;
}
GtkWidget *
-e_table_new (ETableHeader *full_header, ETableModel *etm, const char *spec)
+e_table_new (ETableModel *etm, ETableExtras *ete, const char *spec, const char *state)
{
ETable *e_table;
- g_return_val_if_fail(full_header != NULL, NULL);
- g_return_val_if_fail(E_IS_TABLE_HEADER(full_header), NULL);
g_return_val_if_fail(etm != NULL, NULL);
g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
+ g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
g_return_val_if_fail(spec != NULL, NULL);
e_table = gtk_type_new (e_table_get_type ());
- e_table = e_table_construct (e_table, full_header, etm, spec);
+ e_table = e_table_construct (e_table, etm, ete, spec, state);
return GTK_WIDGET (e_table);
}
GtkWidget *
-e_table_new_from_spec_file (ETableHeader *full_header, ETableModel *etm, const char *filename)
+e_table_new_from_spec_file (ETableModel *etm, ETableExtras *ete, const char *spec_fn, const char *state_fn)
{
ETable *e_table;
- g_return_val_if_fail(full_header != NULL, NULL);
- g_return_val_if_fail(E_IS_TABLE_HEADER(full_header), NULL);
g_return_val_if_fail(etm != NULL, NULL);
g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
- g_return_val_if_fail(filename != NULL, NULL);
+ g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
+ g_return_val_if_fail(spec_fn != NULL, NULL);
e_table = gtk_type_new (e_table_get_type ());
- e_table = e_table_construct_from_spec_file (e_table, full_header, etm, filename);
+ e_table = e_table_construct_from_spec_file (e_table, etm, ete, spec_fn, state_fn);
- return (GtkWidget *) e_table;
+ return GTK_WIDGET (e_table);
}
+
+
+#if 0
static xmlNode *
et_build_column_spec (ETable *e_table)
{
@@ -993,6 +1063,7 @@ e_table_load_specification (ETable *e_table, gchar *filename)
return ret;
}
+#endif
void
e_table_set_cursor_row (ETable *e_table, int row)