diff options
author | Christopher James Lahey <clahey@helixcode.com> | 2000-10-14 02:53:51 +0800 |
---|---|---|
committer | Chris Lahey <clahey@src.gnome.org> | 2000-10-14 02:53:51 +0800 |
commit | c144d2091888813efe3b7ae4414b356fd080b610 (patch) | |
tree | 727511bf87a68e794081e42191009a5a67b440ea /widgets/table/e-table-config-field.c | |
parent | 9704f5dbf64e9f34d4ef7b4c0844b82319d4a2cf (diff) | |
download | gsoc2013-evolution-c144d2091888813efe3b7ae4414b356fd080b610.tar.gz gsoc2013-evolution-c144d2091888813efe3b7ae4414b356fd080b610.tar.zst gsoc2013-evolution-c144d2091888813efe3b7ae4414b356fd080b610.zip |
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
Diffstat (limited to 'widgets/table/e-table-config-field.c')
-rw-r--r-- | widgets/table/e-table-config-field.c | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/widgets/table/e-table-config-field.c b/widgets/table/e-table-config-field.c new file mode 100644 index 0000000000..09ec4184e8 --- /dev/null +++ b/widgets/table/e-table-config-field.c @@ -0,0 +1,279 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * E-table-config-field.c: One field of either the sort or group dialog. + * + * Author: + * Chris Lahey <clahey@helixcode.com> + * + * (C) 2000 Helix Code, Inc. + */ +#include <config.h> +#include <stdlib.h> +#include <gnome.h> +#include "gal/util/e-util.h" +#include "e-table-config-field.h" + +#define PARENT_TYPE (gtk_vbox_get_type()) + +static GtkVBoxClass *etcf_parent_class; + +static void +etcf_destroy (GtkObject *object) +{ + ETableConfigField *etcf = E_TABLE_CONFIG_FIELD (object); + + gtk_object_unref(GTK_OBJECT(etcf->spec)); + gtk_object_unref(GTK_OBJECT(etcf->sort_info)); + + GTK_OBJECT_CLASS (etcf_parent_class)->destroy (object); +} + +static void +etcf_class_init (GtkObjectClass *klass) +{ + etcf_parent_class = gtk_type_class (PARENT_TYPE); + + klass->destroy = etcf_destroy; +} + +static void +etcf_init (ETableConfigField *etcf) +{ + etcf->spec = NULL; + etcf->sort_info = NULL; + + etcf->combo = NULL; + etcf->radio_ascending = NULL; + etcf->radio_descending = NULL; + etcf->child_fields = NULL; +} + +E_MAKE_TYPE(e_table_config_field, "ETableConfigField", ETableConfigField, etcf_class_init, etcf_init, PARENT_TYPE); + +ETableConfigField * +e_table_config_field_new (ETableSpecification *spec, + ETableSortInfo *sort_info, + gboolean grouping) +{ + ETableConfigField *etcf = gtk_type_new (E_TABLE_CONFIG_FIELD_TYPE); + + e_table_config_field_construct (etcf, spec, sort_info, grouping); + + return (ETableConfigField *) etcf; +} + +inline static int +etcf_get_count (ETableConfigField *etcf) +{ + if (etcf->grouping) + return e_table_sort_info_grouping_get_count(etcf->sort_info); + else + return e_table_sort_info_sorting_get_count(etcf->sort_info); +} + +inline static ETableSortColumn +etcf_get_nth (ETableConfigField *etcf) +{ + if (etcf->grouping) + return e_table_sort_info_grouping_get_nth(etcf->sort_info, etcf->n); + else + return e_table_sort_info_sorting_get_nth(etcf->sort_info, etcf->n); +} + +inline static void +etcf_set_nth (ETableConfigField *etcf, ETableSortColumn column) +{ + if (etcf->grouping) + e_table_sort_info_grouping_set_nth(etcf->sort_info, etcf->n, column); + else + e_table_sort_info_sorting_set_nth(etcf->sort_info, etcf->n, column); +} + +inline static void +etcf_truncate (ETableConfigField *etcf) +{ + if (etcf->grouping) + e_table_sort_info_grouping_truncate(etcf->sort_info, etcf->n); + else + e_table_sort_info_sorting_truncate(etcf->sort_info, etcf->n); +} + +static void +etcf_set_sensitivity(ETableConfigField *etcf) +{ + int count = etcf_get_count(etcf); + + if (etcf->n >= count) { + gtk_widget_set_sensitive(etcf->radio_ascending, FALSE); + gtk_widget_set_sensitive(etcf->radio_descending, FALSE); + if (etcf->child_fields) + gtk_widget_set_sensitive(etcf->child_fields, FALSE); + } else { + gtk_widget_set_sensitive(etcf->radio_ascending, TRUE); + gtk_widget_set_sensitive(etcf->radio_descending, TRUE); + if (etcf->child_fields) + gtk_widget_set_sensitive(etcf->child_fields, TRUE); + } +} + +static void +toggled(GtkWidget *widget, ETableConfigField *etcf) +{ + int count; + + count = etcf_get_count(etcf); + if (count > etcf->n) { + ETableSortColumn sort_column; + + sort_column = etcf_get_nth(etcf); + sort_column.ascending = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(etcf->radio_ascending)); + etcf_set_nth(etcf, sort_column); + } +} + +static void +changed(GtkWidget *widget, ETableConfigField *etcf) +{ + ETableColumnSpecification **column; + gchar *text; + + text = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(etcf->combo)->entry)); + for (column = etcf->spec->columns; *column; column++) { + if (!strcmp((*column)->title_, text)) { + ETableSortColumn sort_column; + + sort_column.ascending = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(etcf->radio_ascending)); + sort_column.column = (*column)->model_col; + + etcf_set_nth(etcf, sort_column); + etcf_set_sensitivity(etcf); + return; + } + } + etcf_truncate(etcf); + etcf_set_sensitivity(etcf); +} + +static void +etcf_setup(ETableConfigField *etcf) +{ + int count; + GList *list = NULL; + ETableColumnSpecification **column; + ETableColumnSpecification *chosen_column = NULL; + int model_col = -1; + + etcf_set_sensitivity(etcf); + + count = etcf_get_count(etcf); + + if (count > etcf->n) { + ETableSortColumn sort_column; + + sort_column = etcf_get_nth(etcf); + model_col = sort_column.column; + if (sort_column.ascending) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(etcf->radio_ascending), TRUE); + else + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(etcf->radio_descending), TRUE); + } + + for (column = etcf->spec->columns; *column; column++) { + list = g_list_prepend(list, (*column)->title_); + if (count > etcf->n && chosen_column == NULL && (*column)->model_col == model_col) { + chosen_column = *column; + } + } + list = g_list_reverse(list); + list = g_list_prepend(list, "None"); + + gtk_combo_set_popdown_strings(GTK_COMBO(etcf->combo), list); + g_list_free(list); + + if (chosen_column) { + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(etcf->combo)->entry), chosen_column->title_); + } else { + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(etcf->combo)->entry), "None"); + } + + gtk_signal_connect(GTK_OBJECT(GTK_COMBO(etcf->combo)->entry), "changed", + GTK_SIGNAL_FUNC(changed), etcf); + gtk_signal_connect(GTK_OBJECT(etcf->radio_ascending), "toggled", + GTK_SIGNAL_FUNC(toggled), etcf); + gtk_signal_connect(GTK_OBJECT(etcf->radio_descending), "toggled", + GTK_SIGNAL_FUNC(toggled), etcf); +} + +static ETableConfigField * +e_table_config_field_construct_nth (ETableConfigField *etcf, + ETableSpecification *spec, + ETableSortInfo *sort_info, + gboolean grouping, + int n) +{ + GtkWidget *frame; + GtkWidget *internal_hbox; + GtkWidget *internal_vbox1; + GtkWidget *internal_vbox2; + + etcf->spec = spec; + gtk_object_ref(GTK_OBJECT(spec)); + + etcf->sort_info = sort_info; + gtk_object_ref(GTK_OBJECT(sort_info)); + + etcf->grouping = grouping; + etcf->n = n; + + gtk_box_set_spacing(GTK_BOX(etcf), 6); + + frame = gtk_frame_new(n > 0 ? _("Then By") : (grouping ? _("Group By") : _("Sort By"))); + gtk_box_pack_start(GTK_BOX(etcf), frame, FALSE, FALSE, 0); + + internal_hbox = gtk_hbox_new(FALSE, 6); + gtk_container_add(GTK_CONTAINER(frame), internal_hbox); + gtk_container_set_border_width(GTK_CONTAINER(internal_hbox), 6); + + internal_vbox1 = gtk_vbox_new(FALSE, 6); + gtk_box_pack_start(GTK_BOX(internal_hbox), internal_vbox1, FALSE, FALSE, 0); + + etcf->combo = gtk_combo_new(); + gtk_box_pack_start(GTK_BOX(internal_vbox1), etcf->combo, FALSE, FALSE, 0); + + internal_vbox2 = gtk_vbox_new(FALSE, 6); + gtk_box_pack_start(GTK_BOX(internal_hbox), internal_vbox2, FALSE, FALSE, 0); + + etcf->radio_ascending = gtk_radio_button_new_with_label (NULL, _("Ascending")); + gtk_box_pack_start(GTK_BOX(internal_vbox2), etcf->radio_ascending, FALSE, FALSE, 0); + + etcf->radio_descending = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(etcf->radio_ascending), _("Descending")); + gtk_box_pack_start(GTK_BOX(internal_vbox2), etcf->radio_descending, FALSE, FALSE, 0); + + if (n < 3) { + etcf->child_fields = GTK_WIDGET(gtk_type_new (E_TABLE_CONFIG_FIELD_TYPE)); + e_table_config_field_construct_nth(E_TABLE_CONFIG_FIELD(etcf->child_fields), spec, sort_info, grouping, n + 1); + gtk_box_pack_start(GTK_BOX(etcf), etcf->child_fields, FALSE, FALSE, 0); + gtk_widget_show(etcf->child_fields); + } else + etcf->child_fields = NULL; + + etcf_setup(etcf); + + gtk_widget_show(etcf->radio_descending); + gtk_widget_show(etcf->radio_ascending); + gtk_widget_show(internal_vbox2); + gtk_widget_show(etcf->combo); + gtk_widget_show(internal_vbox1); + gtk_widget_show(internal_hbox); + gtk_widget_show(frame); + return etcf; +} + +ETableConfigField * +e_table_config_field_construct (ETableConfigField *etcf, + ETableSpecification *spec, + ETableSortInfo *sort_info, + gboolean grouping) +{ + return e_table_config_field_construct_nth(etcf, spec, sort_info, grouping, 0); +} |