/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* E-table-config.c: The ETable config dialog.
*
* Author:
* Chris Lahey <clahey@helixcode.com>
*
* (C) 2000 Helix Code, Inc.
*/
#include <config.h>
#include <stdlib.h>
#include <gnome.h>
#include "e-table-config.h"
#include "e-table-config-field.h"
#include "gal/util/e-util.h"
#define PARENT_TYPE (gnome_dialog_get_type())
static GnomeDialogClass *etco_parent_class;
static void
etco_destroy (GtkObject *object)
{
ETableConfig *etco = E_TABLE_CONFIG (object);
if (etco->state) {
if (etco->sorting_changed_id)
gtk_signal_disconnect(GTK_OBJECT(etco->state->sort_info), etco->sorting_changed_id);
if (etco->grouping_changed_id)
gtk_signal_disconnect(GTK_OBJECT(etco->state->sort_info), etco->grouping_changed_id);
gtk_object_unref(GTK_OBJECT(etco->state));
}
gtk_object_unref(GTK_OBJECT(etco->spec));
GTK_OBJECT_CLASS (etco_parent_class)->destroy (object);
}
static void
etco_class_init (GtkObjectClass *klass)
{
etco_parent_class = gtk_type_class (PARENT_TYPE);
klass->destroy = etco_destroy;
}
static void
etco_clear_sort(GtkWidget *widget, ETableConfig *etco)
{
etco->sort_dialog = NULL;
gtk_object_unref(GTK_OBJECT(etco));
}
static void
etco_clear_group(GtkWidget *widget, ETableConfig *etco)
{
etco->group_dialog = NULL;
gtk_object_unref(GTK_OBJECT(etco));
}
static void
etco_sort_config_show(GtkWidget *widget, ETableConfig *etco)
{
if (etco->sort_dialog)
gdk_window_raise(GTK_WIDGET(etco->sort_dialog)->window);
else {
GtkWidget *etcf;
etco->sort_dialog = gnome_dialog_new(_("Sort"),
GNOME_STOCK_BUTTON_OK,
NULL);
etcf = GTK_WIDGET(e_table_config_field_new(etco->spec,
etco->state->sort_info,
FALSE));
gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(etco->sort_dialog)->vbox), etcf, FALSE, FALSE, 0);
gnome_dialog_set_parent(GNOME_DIALOG(etco->sort_dialog),
GTK_WINDOW(etco));
gtk_signal_connect(GTK_OBJECT(etco->sort_dialog), "destroy",
GTK_SIGNAL_FUNC(etco_clear_sort), etco);
gtk_object_ref(GTK_OBJECT(etco));
gtk_signal_connect(GTK_OBJECT(etco->sort_dialog), "clicked",
GTK_SIGNAL_FUNC(gnome_dialog_close), etco);
gtk_widget_show(GTK_WIDGET(etcf));
gtk_widget_show(GTK_WIDGET(etco->sort_dialog));
}
}
static void
etco_group_config_show(GtkWidget *widget, ETableConfig *etco)
{
if (etco->group_dialog)
gdk_window_raise(GTK_WIDGET(etco->group_dialog)->window);
else {
GtkWidget *etcf;
etco->group_dialog = gnome_dialog_new(_("Group"),
GNOME_STOCK_BUTTON_OK,
NULL);
etcf = GTK_WIDGET(e_table_config_field_new(etco->spec,
etco->state->sort_info,
TRUE));
gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(etco->group_dialog)->vbox), etcf, FALSE, FALSE, 0);
gnome_dialog_set_parent(GNOME_DIALOG(etco->group_dialog),
GTK_WINDOW(etco));
gtk_signal_connect(GTK_OBJECT(etco->group_dialog), "destroy",
GTK_SIGNAL_FUNC(etco_clear_group), etco);
gtk_signal_connect(GTK_OBJECT(etco->group_dialog), "clicked",
GTK_SIGNAL_FUNC(gnome_dialog_close), etco);
gtk_object_ref(GTK_OBJECT(etco));
gtk_widget_show(GTK_WIDGET(etcf));
gtk_widget_show(GTK_WIDGET(etco->group_dialog));
}
}
static void
etco_sort_info_update(ETableSortInfo *info, ETableConfig *etco)
{
int count;
int i;
gchar **strings;
gchar *substrings[3];
int stringcount = 0;
gchar *string;
count = e_table_sort_info_sorting_get_count(info);
strings = g_new(gchar *, count + 1);
for (i = 0; i < count; i++) {
ETableSortColumn col = e_table_sort_info_sorting_get_nth(info, i);
ETableColumnSpecification **column;
substrings[0] = NULL;
for (column = etco->spec->columns; *column; column++) {
if (col.column == (*column)->model_col) {
substrings[0] = (*column)->title_;
break;
}
}
if (substrings[0]) {
substrings[1] = col.ascending ? _("(Ascending)") : _("(Descending)");
substrings[2] = NULL;
strings[stringcount++] = g_strjoinv(" ", substrings);
}
}
strings[stringcount] = NULL;
string = g_strjoinv(", ", strings);
for (i = 0; strings[i]; i++) {
g_free(strings[i]);
}
gtk_label_set_text(GTK_LABEL(etco->sort_label), string);
g_free(string);
}
static void
etco_group_info_update(ETableSortInfo *info, ETableConfig *etco)
{
int count;
int i;
gchar **strings;
gchar *substrings[3];
int stringcount = 0;
gchar *string;
count = e_table_sort_info_grouping_get_count(info);
strings = g_new(gchar *, count + 1);
for (i = 0; i < count; i++) {
ETableSortColumn col = e_table_sort_info_grouping_get_nth(info, i);
ETableColumnSpecification **column;
substrings[0] = NULL;
for (column = etco->spec->columns; *column; column++) {
if (col.column == (*column)->model_col) {
substrings[0] = (*column)->title_;
break;
}
}
if (substrings[0]) {
substrings[1] = col.ascending ? _("(Ascending)") : _("(Descending)");
substrings[2] = NULL;
strings[stringcount++] = g_strjoinv(" ", substrings);
}
}
strings[stringcount] = NULL;
string = g_strjoinv(", ", strings);
for (i = 0; strings[i]; i++) {
g_free(strings[i]);
}
gtk_label_set_text(GTK_LABEL(etco->group_label), string);
g_free(string);
}
static void
etco_init (ETableConfig *etco)
{
GtkWidget *frame;
GtkWidget *table;
GtkWidget *sort_button;
GtkWidget *group_button;
gtk_window_set_title(GTK_WINDOW(etco), _("View Summary"));
gnome_dialog_append_buttons(GNOME_DIALOG(etco),
GNOME_STOCK_BUTTON_OK,
NULL);
gnome_dialog_set_default(GNOME_DIALOG(etco), 0);
frame = gtk_frame_new(_("Description"));
gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(etco)->vbox), frame, FALSE, FALSE, 0);
table = gtk_table_new(2, 2, FALSE);
gtk_table_set_row_spacings(GTK_TABLE(table), 6);
gtk_table_set_col_spacings(GTK_TABLE(table), 6);
gtk_container_add(GTK_CONTAINER(frame), table);
gtk_container_set_border_width(GTK_CONTAINER(table), 6);
sort_button = gtk_button_new_with_label(_("Sort..."));
gtk_table_attach(GTK_TABLE(table),
sort_button,
0, 1, 0, 1,
GTK_FILL,
GTK_FILL,
0, 0);
group_button = gtk_button_new_with_label(_("Group By..."));
gtk_table_attach(GTK_TABLE(table),
group_button,
0, 1, 1, 2,
GTK_FILL,
GTK_FILL,
0, 0);
etco->sort_label = gtk_label_new("");
gtk_table_attach(GTK_TABLE(table),
etco->sort_label,
1, 2, 0, 1,
GTK_FILL | GTK_EXPAND,
GTK_FILL,
0, 0);
etco->group_label = gtk_label_new("");
gtk_table_attach(GTK_TABLE(table),
etco->group_label,
1, 2, 1, 2,
GTK_FILL | GTK_EXPAND,
GTK_FILL,
0, 0);
gtk_signal_connect(GTK_OBJECT(sort_button), "clicked",
GTK_SIGNAL_FUNC(etco_sort_config_show), etco);
gtk_signal_connect(GTK_OBJECT(group_button), "clicked",
GTK_SIGNAL_FUNC(etco_group_config_show), etco);
gtk_widget_show(etco->group_label);
gtk_widget_show(etco->sort_label);
gtk_widget_show(group_button);
gtk_widget_show(sort_button);
gtk_widget_show(table);
gtk_widget_show(frame);
etco->sorting_changed_id = 0;
etco->grouping_changed_id = 0;
}
E_MAKE_TYPE(e_table_config, "ETableConfig", ETableConfig, etco_class_init, etco_init, PARENT_TYPE);
GtkWidget *
e_table_config_new (ETableSpecification *spec,
ETableState *state)
{
ETableConfig *etco = gtk_type_new (E_TABLE_CONFIG_TYPE);
e_table_config_construct(etco, spec, state);
return GTK_WIDGET(etco);
}
GtkWidget *
e_table_config_construct (ETableConfig *etco,
ETableSpecification *spec,
ETableState *state)
{
etco->spec = spec;
etco->state = state;
if (etco->spec)
gtk_object_ref(GTK_OBJECT(etco->spec));
if (etco->state)
gtk_object_ref(GTK_OBJECT(etco->state));
etco->sorting_changed_id = gtk_signal_connect(GTK_OBJECT(etco->state->sort_info), "sort_info_changed",
GTK_SIGNAL_FUNC(etco_sort_info_update), etco);
etco->grouping_changed_id = gtk_signal_connect(GTK_OBJECT(etco->state->sort_info), "group_info_changed",
GTK_SIGNAL_FUNC(etco_group_info_update), etco);
etco_sort_info_update(etco->state->sort_info, etco);
etco_group_info_update(etco->state->sort_info, etco);
return GTK_WIDGET(etco);
}