Files
evolution/widgets/table/e-table-config.c
Christopher James Lahey c144d20918 Added e-table-config-field.lo.
2000-10-13  Christopher James Lahey  <clahey@helixcode.com>

	* gal/Makefile.am: Added e-table-config-field.lo.

	* tests/test-tree-2.c: Changed this to use cursor-mode in the xml
	instead of the no longer existing gtk argument.

From gal/e-table/ChangeLog:

2000-10-13  Christopher James Lahey  <clahey@helixcode.com>

	* Makefile.am: Added e-table-config-field.c and
	e-table-config-field.h.

	* e-table-column-specification.c: Cleaned this up a bit.  Made it
	leak less memory.

	* e-table-config-field.c, e-table-config-field.h: New files.
	This is the configuration widgets for sorting or grouping.

	* e-table-config.c, e-table-config.h: Nuked these and replaced
	them with a widget that handles all the ETable configuration.

	* e-table-config.glade, e-table-config.glade.h: Updated this a bit
	to match what's actually being used better.  This isn't used in
	actual code.

	* e-table-header-item.c, e-table-header-item.h: Added a pointer to
	the table in the header item structure so that we can launch the
	configuration from the header item right click menu.  Made the
	header item launch the ETable configuration dialog.

	* e-table.c, e-table.h: Keep the spec given to us around.  Added a
	get_state_object function which returns an ETableState *.  Set the
	"table" argument on the header item.

svn path=/trunk/; revision=5901
2000-10-13 18:53:51 +00:00

313 lines
8.0 KiB
C

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