aboutsummaryrefslogblamecommitdiffstats
path: root/widgets/table/e-table-config.c
blob: 679c2d5b63927b87b957e686d842f66612a3f6ec (plain) (tree)
1
2
3
4
5
6
7
8
9

                                                                           
                                              

          
                                       
  
                            
   
 
                   
                   
                  
                           

                                 
 
                                             
 
                                           
 

                                
 







                                                                                                             
         
 
                                                 
 
                                                               

 
           
                                       
 
                                                         
        
                                      


           
                                                      
 

                                           


           
                                                       
 

                                           


           
                                                            
 























                                                                                                          


           
                                                             
 






















                                                                                                           

 

                                                               
 





































                                                                                             


           
                                                                
 




































                                                                                             
 
 
 

                              
 

































































                                                                                      

 




                                                                                                   
 
                                                                
 


                                                    
 
 



                                                     
 

                            
 



                                                        
 



                                                                                                                
 

                                                             
 
                                

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