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
This commit is contained in:
committed by
Chris Lahey
parent
9704f5dbf6
commit
c144d20918
@ -21,14 +21,20 @@
|
||||
static GtkObjectClass *etcs_parent_class;
|
||||
|
||||
static void
|
||||
etcs_destroy (GtkObject *object)
|
||||
free_strings (ETableColumnSpecification *etcs)
|
||||
{
|
||||
ETableColumnSpecification *etcs = E_TABLE_COLUMN_SPECIFICATION (object);
|
||||
|
||||
g_free(etcs->title_);
|
||||
g_free(etcs->pixbuf);
|
||||
g_free(etcs->cell);
|
||||
g_free(etcs->compare);
|
||||
}
|
||||
|
||||
static void
|
||||
etcs_destroy (GtkObject *object)
|
||||
{
|
||||
ETableColumnSpecification *etcs = E_TABLE_COLUMN_SPECIFICATION (object);
|
||||
|
||||
free_strings(etcs);
|
||||
|
||||
GTK_OBJECT_CLASS (etcs_parent_class)->destroy (object);
|
||||
}
|
||||
@ -45,7 +51,7 @@ static void
|
||||
etcs_init (ETableColumnSpecification *specification)
|
||||
{
|
||||
specification->model_col = 0;
|
||||
specification->title_ = NULL;
|
||||
specification->title_ = g_strdup("");
|
||||
specification->pixbuf = NULL;
|
||||
|
||||
specification->expansion = 0;
|
||||
@ -67,19 +73,24 @@ e_table_column_specification_new (void)
|
||||
}
|
||||
|
||||
void
|
||||
e_table_column_specification_load_from_node (ETableColumnSpecification *specification,
|
||||
e_table_column_specification_load_from_node (ETableColumnSpecification *etcs,
|
||||
const xmlNode *node)
|
||||
{
|
||||
specification->model_col = e_xml_get_integer_prop_by_name(node, "model_col");
|
||||
specification->title_ = e_xml_get_translated_string_prop_by_name(node, "_title");
|
||||
specification->pixbuf = e_xml_get_translated_string_prop_by_name(node, "pixbuf");
|
||||
free_strings(etcs);
|
||||
|
||||
specification->expansion = e_xml_get_double_prop_by_name(node, "expansion");
|
||||
specification->minimum_width = e_xml_get_integer_prop_by_name(node, "minimum_width");
|
||||
specification->resizable = e_xml_get_bool_prop_by_name(node, "resizable");
|
||||
etcs->model_col = e_xml_get_integer_prop_by_name(node, "model_col");
|
||||
etcs->title_ = e_xml_get_translated_string_prop_by_name(node, "_title");
|
||||
etcs->pixbuf = e_xml_get_translated_string_prop_by_name(node, "pixbuf");
|
||||
|
||||
specification->cell = e_xml_get_string_prop_by_name(node, "cell");
|
||||
specification->compare = e_xml_get_string_prop_by_name(node, "compare");
|
||||
etcs->expansion = e_xml_get_double_prop_by_name(node, "expansion");
|
||||
etcs->minimum_width = e_xml_get_integer_prop_by_name(node, "minimum_width");
|
||||
etcs->resizable = e_xml_get_bool_prop_by_name(node, "resizable");
|
||||
|
||||
etcs->cell = e_xml_get_string_prop_by_name(node, "cell");
|
||||
etcs->compare = e_xml_get_string_prop_by_name(node, "compare");
|
||||
|
||||
if (etcs->title_ == NULL)
|
||||
etcs->title_ = g_strdup("");
|
||||
}
|
||||
|
||||
xmlNode *
|
||||
|
||||
279
widgets/table/e-table-config-field.c
Normal file
279
widgets/table/e-table-config-field.c
Normal file
@ -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);
|
||||
}
|
||||
43
widgets/table/e-table-config-field.h
Normal file
43
widgets/table/e-table-config-field.h
Normal file
@ -0,0 +1,43 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
#ifndef _E_TABLE_CONFIG_FIELD_H_
|
||||
#define _E_TABLE_CONFIG_FIELD_H_
|
||||
|
||||
#include <gtk/gtkvbox.h>
|
||||
#include <gal/e-table/e-table-sort-info.h>
|
||||
#include <gal/e-table/e-table-specification.h>
|
||||
|
||||
#define E_TABLE_CONFIG_FIELD_TYPE (e_table_config_field_get_type ())
|
||||
#define E_TABLE_CONFIG_FIELD(o) (GTK_CHECK_CAST ((o), E_TABLE_CONFIG_FIELD_TYPE, ETableConfigField))
|
||||
#define E_TABLE_CONFIG_FIELD_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_CONFIG_FIELD_TYPE, ETableConfigFieldClass))
|
||||
#define E_IS_TABLE_CONFIG_FIELD(o) (GTK_CHECK_TYPE ((o), E_TABLE_CONFIG_FIELD_TYPE))
|
||||
#define E_IS_TABLE_CONFIG_FIELD_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_CONFIG_FIELD_TYPE))
|
||||
|
||||
typedef struct {
|
||||
GtkVBox base;
|
||||
|
||||
ETableSpecification *spec;
|
||||
ETableSortInfo *sort_info;
|
||||
guint grouping : 1;
|
||||
int n;
|
||||
|
||||
GtkWidget *combo;
|
||||
GtkWidget *radio_ascending;
|
||||
GtkWidget *radio_descending;
|
||||
|
||||
GtkWidget *child_fields;
|
||||
} ETableConfigField;
|
||||
|
||||
typedef struct {
|
||||
GtkVBoxClass parent_class;
|
||||
} ETableConfigFieldClass;
|
||||
|
||||
GtkType e_table_config_field_get_type (void);
|
||||
ETableConfigField *e_table_config_field_new (ETableSpecification *spec,
|
||||
ETableSortInfo *sort_info,
|
||||
gboolean grouping);
|
||||
ETableConfigField *e_table_config_field_construct (ETableConfigField *field,
|
||||
ETableSpecification *spec,
|
||||
ETableSortInfo *sort_info,
|
||||
gboolean grouping);
|
||||
|
||||
#endif /* _E_TABLE_CONFIG_FIELD_H_ */
|
||||
@ -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;
|
||||
#define PARENT_TYPE (gnome_dialog_get_type())
|
||||
|
||||
static GnomeDialogClass *etco_parent_class;
|
||||
|
||||
static void
|
||||
load_data (GladeXML *xml, char *label_widget, const char *content)
|
||||
etco_destroy (GtkObject *object)
|
||||
{
|
||||
GtkLabel *label = GTK_LABEL (glade_xml_get_widget (xml, label_widget));
|
||||
ETableConfig *etco = E_TABLE_CONFIG (object);
|
||||
|
||||
gtk_label_set_text (label, content);
|
||||
}
|
||||
|
||||
static char *
|
||||
get_fields (ETable *etable, xmlNode *xmlRoot)
|
||||
{
|
||||
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, ", ");
|
||||
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;
|
||||
}
|
||||
gtk_object_unref(GTK_OBJECT(etco->spec));
|
||||
|
||||
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);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_sort (ETable *etable)
|
||||
{
|
||||
return g_strdup ("None");
|
||||
}
|
||||
|
||||
static char *
|
||||
get_filter (ETable *etable)
|
||||
{
|
||||
return g_strdup ("None");
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
/* FIXME: Set this to the right value. */
|
||||
xmlNode *xmlRoot = NULL;
|
||||
char *s;
|
||||
|
||||
/* 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);
|
||||
GTK_OBJECT_CLASS (etco_parent_class)->destroy (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cb_button_fields (GtkWidget *widget, ETable *etable)
|
||||
etco_class_init (GtkObjectClass *klass)
|
||||
{
|
||||
etco_parent_class = gtk_type_class (PARENT_TYPE);
|
||||
|
||||
klass->destroy = etco_destroy;
|
||||
}
|
||||
|
||||
static void
|
||||
cb_button_grouping (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_sort (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_filter (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));
|
||||
|
||||
GnomeDialog *
|
||||
e_table_gui_config (ETable *etable)
|
||||
{
|
||||
GladeXML *gui;
|
||||
GnomeDialog *dialog;
|
||||
ConfigData *config_data;
|
||||
gtk_signal_connect(GTK_OBJECT(etco->sort_dialog), "destroy",
|
||||
GTK_SIGNAL_FUNC(etco_clear_sort), etco);
|
||||
gtk_object_ref(GTK_OBJECT(etco));
|
||||
|
||||
g_return_val_if_fail(etable != NULL, NULL);
|
||||
g_return_val_if_fail(E_IS_TABLE(etable), NULL);
|
||||
gtk_signal_connect(GTK_OBJECT(etco->sort_dialog), "clicked",
|
||||
GTK_SIGNAL_FUNC(gnome_dialog_close), etco);
|
||||
|
||||
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;
|
||||
gtk_widget_show(GTK_WIDGET(etcf));
|
||||
gtk_widget_show(GTK_WIDGET(etco->sort_dialog));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
e_table_gui_destroy_config_data (GtkWidget *widget)
|
||||
etco_group_config_show(GtkWidget *widget, ETableConfig *etco)
|
||||
{
|
||||
ConfigData *cd = gtk_object_get_data (GTK_OBJECT (widget), "config-data");
|
||||
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));
|
||||
|
||||
g_free (cd->old_spec);
|
||||
gtk_object_destroy (GTK_OBJECT (cd->gui));
|
||||
g_free (cd);
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
e_table_gui_config_accept (GtkWidget *widget, ETable *etable)
|
||||
static void
|
||||
etco_sort_info_update(ETableSortInfo *info, 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));
|
||||
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);
|
||||
|
||||
e_table_gui_destroy_config_data (widget);
|
||||
}
|
||||
|
||||
void
|
||||
e_table_gui_config_cancel (GtkWidget *widget, ETable *etable)
|
||||
static void
|
||||
etco_group_info_update(ETableSortInfo *info, 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));
|
||||
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);
|
||||
|
||||
e_table_gui_destroy_config_data (widget);
|
||||
}
|
||||
|
||||
void
|
||||
e_table_do_gui_config (GtkWidget *parent, ETable *etable)
|
||||
static void
|
||||
etco_init (ETableConfig *etco)
|
||||
{
|
||||
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));
|
||||
GtkWidget *frame;
|
||||
GtkWidget *table;
|
||||
GtkWidget *sort_button;
|
||||
GtkWidget *group_button;
|
||||
|
||||
dialog = GNOME_DIALOG (e_table_gui_config (etable));
|
||||
if (!dialog)
|
||||
return;
|
||||
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);
|
||||
|
||||
if (parent)
|
||||
gnome_dialog_set_parent (dialog, GTK_WINDOW (parent));
|
||||
|
||||
r = gnome_dialog_run (GNOME_DIALOG (dialog));
|
||||
frame = gtk_frame_new(_("Description"));
|
||||
gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(etco)->vbox), frame, FALSE, FALSE, 0);
|
||||
|
||||
if (r == -1 || r == 1)
|
||||
e_table_gui_config_cancel (GTK_WIDGET (dialog), etable);
|
||||
else
|
||||
e_table_gui_config_accept (GTK_WIDGET (dialog), etable);
|
||||
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);
|
||||
|
||||
if (r != -1)
|
||||
gtk_object_destroy (GTK_OBJECT (dialog));
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -268,6 +268,7 @@ Full Name, Company, </label>
|
||||
<last_modification_time>Tue, 03 Oct 2000 22:11:12 GMT</last_modification_time>
|
||||
</signal>
|
||||
<label>_Fields...</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<left_attach>0</left_attach>
|
||||
<right_attach>1</right_attach>
|
||||
@ -295,6 +296,7 @@ Full Name, Company, </label>
|
||||
<last_modification_time>Tue, 03 Oct 2000 22:10:58 GMT</last_modification_time>
|
||||
</signal>
|
||||
<label>_Sort...</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<left_attach>0</left_attach>
|
||||
<right_attach>1</right_attach>
|
||||
@ -322,6 +324,7 @@ Full Name, Company, </label>
|
||||
<last_modification_time>Tue, 03 Oct 2000 22:10:50 GMT</last_modification_time>
|
||||
</signal>
|
||||
<label>_Group By...</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<left_attach>0</left_attach>
|
||||
<right_attach>1</right_attach>
|
||||
@ -539,6 +542,7 @@ Full Name, Company, </label>
|
||||
<name>table-1</name>
|
||||
<can_focus>True</can_focus>
|
||||
<label>Table HERE</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
@ -587,6 +591,7 @@ Full Name, Company, </label>
|
||||
<name>table-2</name>
|
||||
<can_focus>True</can_focus>
|
||||
<label>Table HERE</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
@ -607,6 +612,7 @@ Full Name, Company, </label>
|
||||
<name>button-up</name>
|
||||
<can_focus>True</can_focus>
|
||||
<label>Move _Up</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
@ -619,6 +625,7 @@ Full Name, Company, </label>
|
||||
<name>button-down</name>
|
||||
<can_focus>True</can_focus>
|
||||
<label>Move _Down</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
@ -653,6 +660,7 @@ Full Name, Company, </label>
|
||||
<name>button-add</name>
|
||||
<can_focus>True</can_focus>
|
||||
<label>_Add -></label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
@ -665,6 +673,7 @@ Full Name, Company, </label>
|
||||
<name>button-remove</name>
|
||||
<can_focus>True</can_focus>
|
||||
<label><- _Remove</label>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
@ -685,7 +694,7 @@ Full Name, Company, </label>
|
||||
<class>GnomeDialog</class>
|
||||
<name>dialog-group-by</name>
|
||||
<visible>False</visible>
|
||||
<title>Group By</title>
|
||||
<title>Group</title>
|
||||
<type>GTK_WINDOW_TOPLEVEL</type>
|
||||
<position>GTK_WIN_POS_NONE</position>
|
||||
<modal>False</modal>
|
||||
|
||||
@ -22,7 +22,7 @@ gchar *s = N_("Move _Up");
|
||||
gchar *s = N_("Move _Down");
|
||||
gchar *s = N_("_Add ->");
|
||||
gchar *s = N_("<- _Remove");
|
||||
gchar *s = N_("Group By");
|
||||
gchar *s = N_("Group");
|
||||
gchar *s = N_("_Clear All");
|
||||
gchar *s = N_("Group Items By");
|
||||
gchar *s = N_("Show field in View");
|
||||
|
||||
@ -1,11 +1,42 @@
|
||||
#ifndef _E_TABLE_CONFIG_H
|
||||
#define _E_TABLE_CONFIG_H
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
#ifndef _E_TABLE_CONFIG_H_
|
||||
#define _E_TABLE_CONFIG_H_
|
||||
|
||||
GnomeDialog *e_table_gui_config (ETable *etable);
|
||||
void e_table_do_gui_config (GtkWidget *, ETable *etable);
|
||||
#include <gnome.h>
|
||||
#include <gal/e-table/e-table-sort-info.h>
|
||||
#include <gal/e-table/e-table-specification.h>
|
||||
|
||||
void e_table_gui_config_accept (GtkWidget *widget, ETable *etable);
|
||||
void e_table_gui_config_cancel (GtkWidget *widget, ETable *etable);
|
||||
#define E_TABLE_CONFIG_TYPE (e_table_config_get_type ())
|
||||
#define E_TABLE_CONFIG(o) (GTK_CHECK_CAST ((o), E_TABLE_CONFIG_TYPE, ETableConfig))
|
||||
#define E_TABLE_CONFIG_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_TABLE_CONFIG_TYPE, ETableConfigClass))
|
||||
#define E_IS_TABLE_CONFIG(o) (GTK_CHECK_TYPE ((o), E_TABLE_CONFIG_TYPE))
|
||||
#define E_IS_TABLE_CONFIG_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_CONFIG_TYPE))
|
||||
|
||||
typedef struct {
|
||||
GnomeDialog base;
|
||||
|
||||
ETableSpecification *spec;
|
||||
ETableState *state;
|
||||
|
||||
GtkWidget *sort_label;
|
||||
GtkWidget *group_label;
|
||||
|
||||
GtkWidget *sort_dialog;
|
||||
GtkWidget *group_dialog;
|
||||
|
||||
int sorting_changed_id;
|
||||
int grouping_changed_id;
|
||||
} ETableConfig;
|
||||
|
||||
typedef struct {
|
||||
GnomeDialogClass parent_class;
|
||||
} ETableConfigClass;
|
||||
|
||||
GtkType e_table_config_get_type (void);
|
||||
GtkWidget *e_table_config_new (ETableSpecification *spec,
|
||||
ETableState *state);
|
||||
GtkWidget *e_table_config_construct (ETableConfig *etco,
|
||||
ETableSpecification *spec,
|
||||
ETableState *state);
|
||||
|
||||
#endif /* _E_TABLE_CONFIG_H */
|
||||
|
||||
@ -23,6 +23,8 @@
|
||||
#include "e-table-col-dnd.h"
|
||||
#include "e-table-defines.h"
|
||||
#include "e-table-field-chooser-dialog.h"
|
||||
#include "e-table-config.h"
|
||||
#include "e-table.h"
|
||||
|
||||
#include "add-col.xpm"
|
||||
#include "remove-col.xpm"
|
||||
@ -71,7 +73,8 @@ enum {
|
||||
ARG_FULL_HEADER,
|
||||
ARG_DND_CODE,
|
||||
ARG_TABLE_FONTSET,
|
||||
ARG_SORT_INFO
|
||||
ARG_SORT_INFO,
|
||||
ARG_TABLE,
|
||||
};
|
||||
|
||||
static void
|
||||
@ -266,7 +269,12 @@ ethi_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
|
||||
GTK_OBJECT(ethi->sort_info), "group_info_changed",
|
||||
GTK_SIGNAL_FUNC(ethi_sort_info_changed), ethi);
|
||||
break;
|
||||
|
||||
case ARG_TABLE:
|
||||
if (GTK_VALUE_OBJECT(*arg))
|
||||
ethi->table = E_TABLE(GTK_VALUE_OBJECT(*arg));
|
||||
else
|
||||
ethi->table = NULL;
|
||||
break;
|
||||
}
|
||||
gnome_canvas_item_request_update(item);
|
||||
}
|
||||
@ -1263,10 +1271,25 @@ ethi_popup_format_columns(GtkWidget *widget, EthiHeaderInfo *info)
|
||||
static void
|
||||
ethi_popup_customize_view(GtkWidget *widget, EthiHeaderInfo *info)
|
||||
{
|
||||
ETableHeaderItem *ethi = info->ethi;
|
||||
ETableState *state;
|
||||
|
||||
if (ethi->config)
|
||||
gdk_window_raise(GTK_WIDGET(ethi->config)->window);
|
||||
else {
|
||||
state = e_table_get_state_object(ethi->table);
|
||||
|
||||
ethi->config = e_table_config_new(ethi->table->spec,
|
||||
state);
|
||||
gtk_signal_connect(GTK_OBJECT(ethi->config), "clicked",
|
||||
GTK_SIGNAL_FUNC(gnome_dialog_close), ethi);
|
||||
gtk_widget_show(ethi->config);
|
||||
}
|
||||
}
|
||||
|
||||
/* Bit 1 is always disabled. */
|
||||
/* Bit 2 is disabled if not "sortable". */
|
||||
/* Bit 4 is disabled if we don't have a pointer to our table object. */
|
||||
static EPopupMenu ethi_context_menu [] = {
|
||||
{ N_("Sort Ascending"), NULL, GTK_SIGNAL_FUNC(ethi_popup_sort_ascending), 2},
|
||||
{ N_("Sort Descending"), NULL, GTK_SIGNAL_FUNC(ethi_popup_sort_descending), 2},
|
||||
@ -1282,7 +1305,7 @@ static EPopupMenu ethi_context_menu [] = {
|
||||
{ N_("Best Fit"), NULL, GTK_SIGNAL_FUNC(ethi_popup_best_fit), 2},
|
||||
{ N_("Format Columns..."), NULL, GTK_SIGNAL_FUNC(ethi_popup_format_columns), 1},
|
||||
{ "", NULL, GTK_SIGNAL_FUNC(NULL), 1},
|
||||
{ N_("Customize Current View..."), NULL, GTK_SIGNAL_FUNC(ethi_popup_customize_view), 1},
|
||||
{ N_("Customize Current View..."), NULL, GTK_SIGNAL_FUNC(ethi_popup_customize_view), 4},
|
||||
{ NULL, NULL, NULL, 0 }
|
||||
};
|
||||
|
||||
@ -1294,7 +1317,10 @@ ethi_header_context_menu (ETableHeaderItem *ethi, GdkEventButton *event)
|
||||
info->ethi = ethi;
|
||||
info->col = ethi_find_col_by_x (ethi, event->x);
|
||||
col = e_table_header_get_column (ethi->eth, info->col);
|
||||
e_popup_menu_run (ethi_context_menu, event, 1 + (col->sortable ? 0 : 2), 0, info);
|
||||
e_popup_menu_run (ethi_context_menu, event,
|
||||
1 +
|
||||
(col->sortable ? 0 : 2) +
|
||||
(ethi->table ? 0 : 4), 0, info);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1505,6 +1531,8 @@ ethi_class_init (GtkObjectClass *object_class)
|
||||
GTK_ARG_WRITABLE, ARG_TABLE_FONTSET);
|
||||
gtk_object_add_arg_type ("ETableHeaderItem::sort_info", GTK_TYPE_OBJECT,
|
||||
GTK_ARG_WRITABLE, ARG_SORT_INFO);
|
||||
gtk_object_add_arg_type ("ETableHeaderItem::table", GTK_TYPE_OBJECT,
|
||||
GTK_ARG_WRITABLE, ARG_TABLE);
|
||||
|
||||
/*
|
||||
* Create our pixmaps for DnD
|
||||
@ -1550,6 +1578,7 @@ ethi_init (GnomeCanvasItem *item)
|
||||
ethi->group_info_changed_id = 0;
|
||||
|
||||
ethi->group_indent_width = 0;
|
||||
ethi->table = NULL;
|
||||
}
|
||||
|
||||
GtkType
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
#ifndef _E_TABLE_HEADER_ITEM_H_
|
||||
#define _E_TABLE_HEADER_ITEM_H_
|
||||
|
||||
#include <gal/e-table/e-table.h>
|
||||
#include <libgnomeui/gnome-canvas.h>
|
||||
#include <gnome-xml/tree.h>
|
||||
#include <gal/e-table/e-table-header.h>
|
||||
@ -60,6 +61,8 @@ typedef struct {
|
||||
|
||||
/* For adding fields. */
|
||||
ETableHeader *full_header;
|
||||
ETable *table;
|
||||
GtkWidget *config;
|
||||
} ETableHeaderItem;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@ -144,6 +144,8 @@ et_destroy (GtkObject *object)
|
||||
gtk_object_unref (GTK_OBJECT (et->sort_info));
|
||||
gtk_object_unref (GTK_OBJECT (et->sorter));
|
||||
gtk_object_unref (GTK_OBJECT (et->selection));
|
||||
if (et->spec)
|
||||
gtk_object_unref (GTK_OBJECT (et->spec));
|
||||
|
||||
if (et->header_canvas != NULL)
|
||||
gtk_widget_destroy (GTK_WIDGET (et->header_canvas));
|
||||
@ -193,6 +195,7 @@ e_table_init (GtkObject *object)
|
||||
e_table->sorter = NULL;
|
||||
e_table->selection = e_table_selection_model_new();
|
||||
e_table->cursor_loc = E_TABLE_CURSOR_LOC_NONE;
|
||||
e_table->spec = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -235,6 +238,7 @@ e_table_setup_header (ETable *e_table)
|
||||
"full_header", e_table->full_header,
|
||||
"sort_info", e_table->sort_info,
|
||||
"dnd_code", "(unset)",
|
||||
"table", e_table,
|
||||
NULL);
|
||||
|
||||
gtk_signal_connect (
|
||||
@ -602,19 +606,20 @@ et_col_spec_to_col (ETable *e_table, ETableColumnSpecification *col_spec, ETable
|
||||
compare = e_table_extras_get_compare(ete, col_spec->compare);
|
||||
|
||||
if (cell && compare) {
|
||||
if (col_spec->title_ && *col_spec->title_) {
|
||||
col = e_table_col_new (col_spec->model_col, col_spec->title_,
|
||||
col_spec->expansion, col_spec->minimum_width,
|
||||
cell, compare, col_spec->resizable);
|
||||
} else if (col_spec->pixbuf && *col_spec->pixbuf) {
|
||||
if (col_spec->pixbuf && *col_spec->pixbuf) {
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
|
||||
pixbuf = e_table_extras_get_pixbuf(ete, col_spec->pixbuf);
|
||||
if (pixbuf) {
|
||||
col = e_table_col_new_with_pixbuf (col_spec->model_col, pixbuf,
|
||||
col_spec->expansion, col_spec->minimum_width,
|
||||
cell, compare, col_spec->resizable);
|
||||
}
|
||||
}
|
||||
if (col == NULL && col_spec->title_ && *col_spec->title_) {
|
||||
col = e_table_col_new (col_spec->model_col, col_spec->title_,
|
||||
col_spec->expansion, col_spec->minimum_width,
|
||||
cell, compare, col_spec->resizable);
|
||||
}
|
||||
}
|
||||
return col;
|
||||
@ -733,8 +738,8 @@ void e_table_load_state (ETable *e_table
|
||||
gtk_object_sink(GTK_OBJECT(state));
|
||||
}
|
||||
|
||||
static ETableState *
|
||||
et_get_state (ETable *e_table)
|
||||
ETableState *
|
||||
e_table_get_state_object (ETable *e_table)
|
||||
{
|
||||
ETableState *state;
|
||||
int full_col_count;
|
||||
@ -767,9 +772,9 @@ gchar *e_table_get_state (ETable *e_table
|
||||
ETableState *state;
|
||||
gchar *string;
|
||||
|
||||
state = et_get_state(e_table);
|
||||
state = e_table_get_state_object(e_table);
|
||||
string = e_table_state_save_to_string(state);
|
||||
gtk_object_sink(state);
|
||||
gtk_object_sink(GTK_OBJECT(state));
|
||||
return string;
|
||||
}
|
||||
|
||||
@ -778,9 +783,9 @@ void e_table_save_state (ETable *e_table
|
||||
{
|
||||
ETableState *state;
|
||||
|
||||
state = et_get_state(e_table);
|
||||
state = e_table_get_state_object(e_table);
|
||||
e_table_state_save_to_file(state, filename);
|
||||
gtk_object_sink(state);
|
||||
gtk_object_sink(GTK_OBJECT(state));
|
||||
}
|
||||
|
||||
|
||||
@ -885,7 +890,7 @@ e_table_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete,
|
||||
|
||||
e_table = et_real_construct (e_table, etm, ete, specification, state);
|
||||
|
||||
gtk_object_unref(GTK_OBJECT(specification));
|
||||
e_table->spec = specification;
|
||||
gtk_object_unref(GTK_OBJECT(state));
|
||||
|
||||
return e_table;
|
||||
@ -925,7 +930,7 @@ e_table_construct_from_spec_file (ETable *e_table, ETableModel *etm, ETableExtra
|
||||
|
||||
e_table = et_real_construct (e_table, etm, ete, specification, state);
|
||||
|
||||
gtk_object_unref(GTK_OBJECT(specification));
|
||||
e_table->spec = specification;
|
||||
gtk_object_unref(GTK_OBJECT(state));
|
||||
|
||||
return e_table;
|
||||
|
||||
@ -12,7 +12,9 @@
|
||||
#include <gal/e-table/e-table-item.h>
|
||||
#include <gal/e-table/e-table-selection-model.h>
|
||||
#include <gal/e-table/e-table-extras.h>
|
||||
#include <gal/e-table/e-table-specification.h>
|
||||
#include <gal/widgets/e-printable.h>
|
||||
#include <gal/e-table/e-table-state.h>
|
||||
|
||||
BEGIN_GNOME_DECLS
|
||||
|
||||
@ -45,6 +47,7 @@ typedef struct {
|
||||
|
||||
ETableSelectionModel *selection;
|
||||
ETableCursorLoc cursor_loc;
|
||||
ETableSpecification *spec;
|
||||
|
||||
int table_model_change_id;
|
||||
int table_row_change_id;
|
||||
@ -184,6 +187,7 @@ GtkWidget *e_table_new_from_spec_file (ETableModel *etm,
|
||||
gchar *e_table_get_state (ETable *e_table);
|
||||
void e_table_save_state (ETable *e_table,
|
||||
const gchar *filename);
|
||||
ETableState *e_table_get_state_object (ETable *e_table);
|
||||
|
||||
/* note that it is more efficient to provide the state at creation time */
|
||||
void e_table_set_state (ETable *e_table,
|
||||
|
||||
Reference in New Issue
Block a user