/* -*- 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));
}