/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* E-table.c: A graphical view of a Table.
*
* Author:
* Miguel de Icaza (miguel@gnu.org)
*
* Copyright 1999, Helix Code, Inc
*/
#include <config.h>
#include <gnome.h>
#include <glade/glade.h>
#include <gnome-xml/xmlmemory.h>
#include "e-util/e-util.h"
#include "e-util/e-xml-utils.h"
#include "e-util/e-canvas.h"
#include "e-table.h"
#include "e-table-header-item.h"
#include "e-table-subset.h"
#include "e-table-item.h"
#include "e-table-group.h"
#include "e-table-config.h"
typedef struct {
GladeXML *gui;
char *old_spec;
} ConfigData;
static void
load_data (GladeXML *xml, char *label_widget, const char *content)
{
GtkLabel *label = GTK_LABEL (glade_xml_get_widget (xml, label_widget));
gtk_label_set_text (label, content);
}
static char *
get_fields (ETable *etable, xmlNode *xmlRoot)
{
xmlNode *xmlColumns;
xmlNode *column;
GString *res;
char *s;
res = g_string_new ("");
xmlColumns = e_xml_get_child_by_name (xmlRoot, "columns-shown");
for (column = xmlColumns->childs; column; column = column->next){
ETableCol *ecol;
char *content;
int col;
content = xmlNodeListGetString (column->doc, column->childs, 1);
col = atoi (content);
xmlFree (content);
ecol = e_table_header_get_column (etable->header, col);
g_string_append (res, ecol->text);
if (column->next)
g_string_append (res, ", ");
}
s = res->str;
g_string_free (res, FALSE);
return s;
}
static char *
get_grouping (ETable *etable, xmlNode *xmlRoot)
{
xmlNode *xmlGrouping;
GString *res;
char *s;
res = g_string_new ("");
xmlGrouping = e_xml_get_child_by_name (xmlRoot, "grouping");
s = res->str;
g_string_free (res, FALSE);
return s;
}
static char *
get_sort (ETable *etable)
{
return g_strdup ("None");
}
static char *
get_filter (ETable *etable)
{
return g_strdup ("None");
}
/*
* Loads a user-readable definition of the various e-table parameters
* into the dialog for configuring it
*/
static void
load_label_data (GladeXML *gui, ETable *etable)
{
/* FIXME: Set this to the right value. */
xmlNode *xmlRoot = NULL;
char *s;
/* xmlRoot = xmlDocGetRootElement (etable->specification); */
s = get_fields (etable, xmlRoot);
load_data (gui, "label1", s);
g_free (s);
s = get_grouping (etable, xmlRoot);
load_data (gui, "label2", s);
g_free (s);
s = get_sort (etable);
load_data (gui, "label3", s);
g_free (s);
s = get_filter (etable);
load_data (gui, "label4", s);
g_free (s);
}
static void
cb_button_fields (GtkWidget *widget, ETable *etable)
{
}
static void
cb_button_grouping (GtkWidget *widget, ETable *etable)
{
}
static void
cb_button_sort (GtkWidget *widget, ETable *etable)
{
}
static void
cb_button_filter (GtkWidget *widget, ETable *etable)
{
}
GnomeDialog *
e_table_gui_config (ETable *etable)
{
GladeXML *gui;
GnomeDialog *dialog;
ConfigData *config_data;
glade_gnome_init ();
gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-config.glade", NULL);
if (!gui)
return NULL;
dialog = GNOME_DIALOG (glade_xml_get_widget (gui, "e-table-config"));
gtk_signal_connect (
GTK_OBJECT (glade_xml_get_widget (gui, "button-fields")),
"clicked", GTK_SIGNAL_FUNC (cb_button_fields), etable);
gtk_signal_connect (
GTK_OBJECT (glade_xml_get_widget (gui, "button-grouping")),
"clicked", GTK_SIGNAL_FUNC (cb_button_grouping), etable);
gtk_signal_connect (
GTK_OBJECT (glade_xml_get_widget (gui, "button-sort")),
"clicked", GTK_SIGNAL_FUNC (cb_button_sort), etable);
gtk_signal_connect (
GTK_OBJECT (glade_xml_get_widget (gui, "button-filter")),
"clicked", GTK_SIGNAL_FUNC (cb_button_filter), etable);
load_label_data (gui, etable);
config_data = g_new (ConfigData, 1);
config_data->gui = gui;
config_data->old_spec = e_table_get_specification (etable);
gtk_object_set_data (
GTK_OBJECT (dialog), "config-data",
config_data);
return dialog;
}
static void
e_table_gui_destroy_config_data (GtkWidget *widget)
{
ConfigData *cd = gtk_object_get_data (GTK_OBJECT (widget), "config-data");
g_free (cd->old_spec);
gtk_object_destroy (GTK_OBJECT (cd->gui));
g_free (cd);
}
void
e_table_gui_config_accept (GtkWidget *widget, ETable *etable)
{
e_table_gui_destroy_config_data (widget);
}
void
e_table_gui_config_cancel (GtkWidget *widget, ETable *etable)
{
e_table_gui_destroy_config_data (widget);
}
void
e_table_do_gui_config (GtkWidget *parent, ETable *etable)
{
GnomeDialog *dialog;
int r;
dialog = GNOME_DIALOG (e_table_gui_config (etable));
if (!dialog)
return;
if (parent)
gnome_dialog_set_parent (dialog, GTK_WINDOW (parent));
r = gnome_dialog_run (GNOME_DIALOG (dialog));
if (r == -1 || r == 1)
e_table_gui_config_cancel (GTK_WIDGET (dialog), etable);
else
e_table_gui_config_accept (GTK_WIDGET (dialog), etable);
if (r != -1)
gtk_object_destroy (GTK_OBJECT (dialog));
}