diff options
Diffstat (limited to 'widgets/table/e-table-config.c')
-rw-r--r-- | widgets/table/e-table-config.c | 440 |
1 files changed, 251 insertions, 189 deletions
diff --git a/widgets/table/e-table-config.c b/widgets/table/e-table-config.c index a2831da73a..679c2d5b63 100644 --- a/widgets/table/e-table-config.c +++ b/widgets/table/e-table-config.c @@ -1,250 +1,312 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * E-table.c: A graphical view of a Table. + * E-table-config.c: The ETable config dialog. * * Author: - * Miguel de Icaza (miguel@gnu.org) + * Chris Lahey <clahey@helixcode.com> * - * Copyright 1999, Helix Code, Inc + * (C) 2000 Helix Code, Inc. */ + #include <config.h> +#include <stdlib.h> #include <gnome.h> -#include <glade/glade.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 "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" +#include "e-table-config-field.h" +#include "gal/util/e-util.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)); +#define PARENT_TYPE (gnome_dialog_get_type()) - gtk_label_set_text (label, content); -} +static GnomeDialogClass *etco_parent_class; -static char * -get_fields (ETable *etable, xmlNode *xmlRoot) +static void +etco_destroy (GtkObject *object) { - 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, ", "); + 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)); } - 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); + gtk_object_unref(GTK_OBJECT(etco->spec)); - return s; -} - -static char * -get_sort (ETable *etable) -{ - return g_strdup ("None"); -} - -static char * -get_filter (ETable *etable) -{ - return g_strdup ("None"); + GTK_OBJECT_CLASS (etco_parent_class)->destroy (object); } -/* - * 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) +etco_class_init (GtkObjectClass *klass) { - /* FIXME: Set this to the right value. */ - xmlNode *xmlRoot = NULL; - char *s; + etco_parent_class = gtk_type_class (PARENT_TYPE); -/* 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); + klass->destroy = etco_destroy; } static void -cb_button_fields (GtkWidget *widget, ETable *etable) +etco_clear_sort(GtkWidget *widget, ETableConfig *etco) { + etco->sort_dialog = NULL; + gtk_object_unref(GTK_OBJECT(etco)); } static void -cb_button_grouping (GtkWidget *widget, ETable *etable) +etco_clear_group(GtkWidget *widget, ETableConfig *etco) { + etco->group_dialog = NULL; + gtk_object_unref(GTK_OBJECT(etco)); } static void -cb_button_sort (GtkWidget *widget, ETable *etable) +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 -cb_button_filter (GtkWidget *widget, ETable *etable) +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)); + } } -GnomeDialog * -e_table_gui_config (ETable *etable) +static void +etco_sort_info_update(ETableSortInfo *info, ETableConfig *etco) { - GladeXML *gui; - GnomeDialog *dialog; - ConfigData *config_data; - - g_return_val_if_fail(etable != NULL, NULL); - g_return_val_if_fail(E_IS_TABLE(etable), NULL); - - 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_state (etable); - - gtk_object_set_data ( - GTK_OBJECT (dialog), "config-data", - config_data); - - return dialog; + 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 -e_table_gui_destroy_config_data (GtkWidget *widget) +etco_group_info_update(ETableSortInfo *info, ETableConfig *etco) { - ConfigData *cd = gtk_object_get_data (GTK_OBJECT (widget), "config-data"); + 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); - 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) +static void +etco_init (ETableConfig *etco) { - g_return_if_fail(etable != NULL); - g_return_if_fail(E_IS_TABLE(etable)); - g_return_if_fail(widget != NULL); - g_return_if_fail(GTK_IS_WIDGET(widget)); - - e_table_gui_destroy_config_data (widget); + 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; } -void -e_table_gui_config_cancel (GtkWidget *widget, ETable *etable) +E_MAKE_TYPE(e_table_config, "ETableConfig", ETableConfig, etco_class_init, etco_init, PARENT_TYPE); + +GtkWidget * +e_table_config_new (ETableSpecification *spec, + ETableState *state) { - g_return_if_fail(etable != NULL); - g_return_if_fail(E_IS_TABLE(etable)); - g_return_if_fail(widget != NULL); - g_return_if_fail(GTK_IS_WIDGET(widget)); + ETableConfig *etco = gtk_type_new (E_TABLE_CONFIG_TYPE); - e_table_gui_destroy_config_data (widget); + e_table_config_construct(etco, spec, state); + + return GTK_WIDGET(etco); } -void -e_table_do_gui_config (GtkWidget *parent, ETable *etable) +GtkWidget * +e_table_config_construct (ETableConfig *etco, + ETableSpecification *spec, + ETableState *state) { - GnomeDialog *dialog; - int r; - - g_return_if_fail(etable != NULL); - g_return_if_fail(E_IS_TABLE(etable)); - g_return_if_fail(parent == NULL || GTK_IS_WINDOW(parent)); + etco->spec = spec; + etco->state = state; - dialog = GNOME_DIALOG (e_table_gui_config (etable)); - if (!dialog) - return; + if (etco->spec) + gtk_object_ref(GTK_OBJECT(etco->spec)); + if (etco->state) + gtk_object_ref(GTK_OBJECT(etco->state)); - if (parent) - gnome_dialog_set_parent (dialog, GTK_WINDOW (parent)); - - r = gnome_dialog_run (GNOME_DIALOG (dialog)); + 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); - if (r == -1 || r == 1) - e_table_gui_config_cancel (GTK_WIDGET (dialog), etable); - else - e_table_gui_config_accept (GTK_WIDGET (dialog), etable); + etco_sort_info_update(etco->state->sort_info, etco); + etco_group_info_update(etco->state->sort_info, etco); - if (r != -1) - gtk_object_destroy (GTK_OBJECT (dialog)); + return GTK_WIDGET(etco); } - |