aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table-config-field.c
diff options
context:
space:
mode:
authorChristopher James Lahey <clahey@helixcode.com>2000-10-14 02:53:51 +0800
committerChris Lahey <clahey@src.gnome.org>2000-10-14 02:53:51 +0800
commitc144d2091888813efe3b7ae4414b356fd080b610 (patch)
tree727511bf87a68e794081e42191009a5a67b440ea /widgets/table/e-table-config-field.c
parent9704f5dbf64e9f34d4ef7b4c0844b82319d4a2cf (diff)
downloadgsoc2013-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.c279
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);
+}