diff options
Diffstat (limited to 'widgets/misc/e-send-options.c')
-rw-r--r-- | widgets/misc/e-send-options.c | 636 |
1 files changed, 636 insertions, 0 deletions
diff --git a/widgets/misc/e-send-options.c b/widgets/misc/e-send-options.c new file mode 100644 index 0000000000..f8aad5c94b --- /dev/null +++ b/widgets/misc/e-send-options.c @@ -0,0 +1,636 @@ +/* Evolution calendar - Main page of the Groupwise send options Dialog + * + * Copyright (C) 2004 Novell, Inc. + * + * Authors: Chenthill Palanisamy <pchenthill@novell.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Bangalore, MA 02111-1307, India. + */ + +#include <string.h> +#include <glib.h> +#include <gtk/gtksignal.h> +#include <gtk/gtktogglebutton.h> +#include <gtk/gtk.h> +#include <libgnome/gnome-i18n.h> +#include <glade/glade.h> +#include <time.h> +#include "e-dateedit.h" +#include "e-send-options.h" + + +struct _ESendOptionsDialogPrivate { + /* Glade XML data */ + GladeXML *xml; + + gboolean gopts_needed; + + /* Widgets */ + + GtkWidget *main; + + /* Noteboook to add options page and status tracking page*/ + GtkNotebook *notebook; + + /* priority */ + GtkWidget *priority; + + /* Classification */ + GtkWidget *classification; + + /* Widgets for Reply Requestion options */ + GtkWidget *reply_request; + GtkWidget *reply_convenient; + GtkWidget *reply_within; + GtkWidget *within_days; + + /* Widgets for delay delivery Option */ + GtkWidget *delay_delivery; + GtkWidget *delay_until; + + /* Widgets for Choosing expiration date */ + GtkWidget *expiration; + GtkWidget *expire_after; + + /* Widgets to for tracking information through sent Item */ + GtkWidget *create_sent; + GtkWidget *delivered; + GtkWidget *delivered_opened; + GtkWidget *all_info; + GtkWidget *autodelete; + + /* Widgets for setting the Return Notification */ + GtkWidget *when_opened; + GtkWidget *when_declined; + GtkWidget *when_accepted; + GtkWidget *when_completed; + + /* label widgets */ + GtkWidget *classification_label; + GtkWidget *priority_label; + GtkWidget *gopts_label; + GtkWidget *sopts_label; + GtkWidget *opened_label; + GtkWidget *declined_label; + GtkWidget *accepted_label; + GtkWidget *completed_label; + GtkWidget *until_label; +}; + +static void e_sendoptions_dialog_class_init (GObjectClass *object_class); +static void e_sendoptions_dialog_finalize (GObject *object); +static void e_sendoptions_dialog_init (GObject *object); +static void e_sendoptions_dialog_dispose (GObject *object); + + +static void +e_send_options_get_widgets_data (ESendOptionsDialog *sod) +{ + ESendOptionsDialogPrivate *priv; + ESendOptionsGeneral *gopts; + ESendOptionsStatusTracking *sopts; + + priv = sod->priv; + gopts = sod->data->gopts; + sopts = sod->data->sopts; + + gopts->priority = gtk_combo_box_get_active ((GtkComboBox *) priv->priority); + + gopts->reply_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->reply_request)); + gopts->reply_convenient = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->reply_convenient)); + gopts->reply_within = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (priv->within_days)); + + gopts->expiration_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->expiration)); + gopts->expire_after = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (priv->expire_after)); + gopts->delay_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->delay_delivery)); + + if (e_date_edit_date_is_valid (E_DATE_EDIT (priv->delay_until)) && + e_date_edit_time_is_valid (E_DATE_EDIT(priv->delay_until))) + gopts->delay_until = e_date_edit_get_time (E_DATE_EDIT (priv->delay_until)); + + sopts->tracking_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->create_sent)); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->delivered))) + sopts->track_when = E_DELIVERED; + else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->delivered_opened))) + sopts->track_when = E_DELIVERED_OPENED; + else + sopts->track_when = E_ALL; + + sopts->opened = gtk_combo_box_get_active ((GtkComboBox *) priv->when_opened); + sopts->accepted = gtk_combo_box_get_active ((GtkComboBox *) priv->when_accepted); + sopts->declined = gtk_combo_box_get_active ((GtkComboBox *) priv->when_declined); + sopts->completed = gtk_combo_box_get_active ((GtkComboBox *) priv->when_completed); +} + +static void +e_send_options_fill_widgets_with_data (ESendOptionsDialog *sod) +{ + ESendOptionsDialogPrivate *priv; + ESendOptionsGeneral *gopts; + ESendOptionsStatusTracking *sopts; + time_t tmp; + + priv = sod->priv; + gopts = sod->data->gopts; + sopts = sod->data->sopts; + tmp = time (NULL); + + gtk_combo_box_set_active ((GtkComboBox *) priv->priority, gopts->priority); + + if (gopts->reply_enabled) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->reply_request), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->reply_request), FALSE); + + if (gopts->reply_convenient) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->reply_convenient), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->reply_within), TRUE); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->within_days), (gdouble) gopts->reply_within); + + if (gopts->expiration_enabled) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->expiration), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->expiration), FALSE); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->expire_after), (gdouble) gopts->expire_after); + + if (gopts->delay_enabled) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->delay_delivery), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->delay_delivery), FALSE); + + if (!gopts->delay_until || (!difftime (gopts->delay_until, tmp) < 0)) + e_date_edit_set_time (E_DATE_EDIT (priv->delay_until), 0); + else + e_date_edit_set_time (E_DATE_EDIT (priv->delay_until), gopts->delay_until); + + if (sopts->tracking_enabled) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->create_sent), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->create_sent), FALSE); + + switch (sopts->track_when) { + case E_DELIVERED: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->delivered), TRUE); + break; + case E_DELIVERED_OPENED: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->delivered_opened), TRUE); + break; + case E_ALL: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->all_info), TRUE); + } + + gtk_combo_box_set_active ((GtkComboBox *) priv->when_opened, sopts->opened); + gtk_combo_box_set_active ((GtkComboBox *) priv->when_declined, sopts->declined); + gtk_combo_box_set_active ((GtkComboBox *) priv->when_accepted, sopts->accepted); + gtk_combo_box_set_active ((GtkComboBox *) priv->when_completed, sopts->completed); + +} + +static void +sensitize_widgets (ESendOptionsDialog *sod) +{ + ESendOptionsDialogPrivate *priv; + ESendOptionsGeneral *gopts; + ESendOptionsStatusTracking *sopts; + + priv = sod->priv; + gopts = sod->data->gopts; + sopts = sod->data->sopts; + + if (!gopts->reply_enabled) { + gtk_widget_set_sensitive (priv->reply_convenient, FALSE); + gtk_widget_set_sensitive (priv->reply_within, FALSE); + gtk_widget_set_sensitive (priv->within_days, FALSE); + } + + if (!gopts->expiration_enabled) + gtk_widget_set_sensitive (priv->expire_after, FALSE); + + if (!gopts->delay_enabled){ + gtk_widget_set_sensitive (priv->delay_until, FALSE); + } + + if (!sopts->tracking_enabled) { + gtk_widget_set_sensitive (priv->delivered, FALSE); + gtk_widget_set_sensitive (priv->delivered_opened, FALSE); + gtk_widget_set_sensitive (priv->all_info, FALSE); + } +} + +static void +expiration_toggled_cb (GtkWidget *toggle, gpointer data) +{ + gboolean active; + ESendOptionsDialog *sod; + ESendOptionsDialogPrivate *priv; + + sod = data; + priv = sod->priv; + + active = GTK_TOGGLE_BUTTON (toggle)->active; + + gtk_widget_set_sensitive (priv->expire_after, active); +} + +static void +reply_request_toggled_cb (GtkWidget *toggle, gpointer data) +{ + gboolean active; + ESendOptionsDialog *sod; + ESendOptionsDialogPrivate *priv; + + sod = data; + priv = sod->priv; + active = GTK_TOGGLE_BUTTON (toggle)->active; + + gtk_widget_set_sensitive (priv->reply_convenient, active); + gtk_widget_set_sensitive (priv->reply_within, active); + gtk_widget_set_sensitive (priv->within_days, active); + +} + +static void +delay_delivery_toggled_cb (GtkWidget *toggle, gpointer data) +{ + gboolean active; + ESendOptionsDialog *sod; + ESendOptionsDialogPrivate *priv; + + sod = data; + priv = sod->priv; + active = GTK_TOGGLE_BUTTON (toggle)->active; + + gtk_widget_set_sensitive (priv->delay_until, active); +} + +static void +sent_item_toggled_cb (GtkWidget *toggle, gpointer data) +{ + gboolean active; + ESendOptionsDialog *sod; + ESendOptionsDialogPrivate *priv; + + sod = data; + priv = sod->priv; + active = GTK_TOGGLE_BUTTON (toggle)->active; + + gtk_widget_set_sensitive (priv->delivered, active); + gtk_widget_set_sensitive (priv->delivered_opened, active); + gtk_widget_set_sensitive (priv->all_info, active); + +} + +static void +delay_until_date_changed_cb (GtkWidget *dedit, gpointer data) +{ + ESendOptionsDialog *sod; + ESendOptionsDialogPrivate *priv; + ESendOptionsGeneral *gopts; + time_t tmp, current; + + sod = data; + priv = sod->priv; + gopts = sod->data->gopts; + + current = time (NULL); + tmp = e_date_edit_get_time (E_DATE_EDIT (priv->delay_until)); + + if ((difftime (tmp, current) < 0) || !e_date_edit_time_is_valid (E_DATE_EDIT (priv->delay_until)) + || !e_date_edit_date_is_valid (E_DATE_EDIT (priv->delay_until))) + e_date_edit_set_time (E_DATE_EDIT (priv->delay_until), 0); + +} + +static void +init_widgets (ESendOptionsDialog *sod) +{ + ESendOptionsDialogPrivate *priv; + + priv = sod->priv; + + g_signal_connect (priv->expiration, "toggled", G_CALLBACK (expiration_toggled_cb), sod); + g_signal_connect (priv->reply_request, "toggled", G_CALLBACK (reply_request_toggled_cb), sod); + g_signal_connect (priv->delay_delivery, "toggled", G_CALLBACK (delay_delivery_toggled_cb), sod); + g_signal_connect (priv->create_sent, "toggled", G_CALLBACK (sent_item_toggled_cb), sod); + + g_signal_connect (priv->delay_until, "changed", G_CALLBACK (delay_until_date_changed_cb), sod); + +} + +static gboolean +get_widgets (ESendOptionsDialog *sod) +{ + ESendOptionsDialogPrivate *priv; + + priv = sod->priv; + +#define GW(name) glade_xml_get_widget (priv->xml, name) + + priv->main = GW ("send-options-dialog"); + if (!priv->main) + return FALSE; + + priv->priority = GW ("combo-priority"); + priv->classification = GW ("classification-combo"); + priv->notebook = GW ("notebook"); + priv->reply_request = GW ("reply-request-button"); + priv->reply_convenient = GW ("reply-convinient"); + priv->reply_within = GW ("reply-within"); + priv->within_days = GW ("within-days"); + priv->delay_delivery = GW ("delay-delivery-button"); + priv->delay_until = GW ("until-date"); + gtk_widget_show (priv->delay_until); + priv->expiration = GW ("expiration-button"); + priv->expire_after = GW ("expire-after"); + priv->create_sent = GW ("create-sent-button"); + priv->delivered = GW ("delivered"); + priv->delivered_opened = GW ("delivered-opened"); + priv->all_info = GW ("all-info"); + priv->autodelete = GW ("autodelete"); + priv->when_opened = GW ("open-combo"); + priv->when_declined = GW ("delete-combo"); + priv->when_accepted = GW ("accept-combo"); + priv->when_completed = GW ("complete-combo"); + priv->classification_label = GW ("classification-label"); + priv->gopts_label = GW ("gopts-label"); + priv->sopts_label = GW ("sopts-label"); + priv->priority_label = GW ("priority-label"); + priv->until_label = GW ("until-label"); + priv->opened_label = GW ("opened-label"); + priv->declined_label = GW ("declined-label"); + priv->accepted_label = GW ("accepted-label"); + priv->completed_label = GW ("completed-label"); + +#undef GW + + return (priv->priority + && priv->classification + && priv->reply_request + && priv->reply_convenient + && priv->reply_within + && priv->within_days + && priv->delay_delivery + && priv->delay_until + && priv->expiration + && priv->expire_after + && priv->create_sent + && priv->delivered + && priv->delivered_opened + && priv->autodelete + && priv->all_info + && priv->when_opened + && priv->when_declined + && priv->when_accepted + && priv->when_completed + && priv->classification_label + && priv->priority_label + && priv->opened_label + && priv->gopts_label + && priv->sopts_label + && priv->declined_label + && priv->accepted_label + && priv->completed_label); + +} + +static void +setup_widgets (ESendOptionsDialog *sod, Item_type type) +{ + ESendOptionsDialogPrivate *priv; + + priv = sod->priv; + + if (!priv->gopts_needed) { + gtk_notebook_set_current_page (priv->notebook, 1); + gtk_widget_hide (priv->delay_until); + } else + gtk_notebook_set_show_tabs (priv->notebook, TRUE); + + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->priority_label), priv->priority); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->classification_label), priv->classification); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->accepted_label), priv->when_accepted); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->declined_label), priv->when_declined); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->opened_label), priv->when_opened); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->completed_label), priv->when_completed); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->until_label), priv->delay_until); + + switch (type) { + case E_ITEM_MAIL: + gtk_widget_hide (priv->accepted_label); + gtk_widget_hide (priv->when_accepted); + gtk_widget_hide (priv->completed_label); + gtk_widget_hide (priv->when_completed); + gtk_label_set_text_with_mnemonic (GTK_LABEL (priv->declined_label), (_("When de_leted:"))); + break; + case E_ITEM_CALENDAR: + gtk_widget_hide (priv->completed_label); + gtk_widget_hide (priv->when_completed); + case E_ITEM_TASK: + gtk_widget_hide (priv->classification_label); + gtk_widget_hide (priv->classification); + gtk_widget_set_sensitive (priv->autodelete, FALSE); + break; + default: + break; + } +} + +ESendOptionsDialog * +e_sendoptions_dialog_new (void) { + ESendOptionsDialog *sod; + + sod = g_object_new (E_TYPE_SENDOPTIONS_DIALOG, NULL); + + return sod; +} + +void +e_sendoptions_set_need_general_options (ESendOptionsDialog *sod, gboolean needed) +{ + g_return_if_fail (E_IS_SENDOPTIONS_DIALOG (sod)); + + sod->priv->gopts_needed = needed; +} + +gboolean +e_sendoptions_get_need_general_options (ESendOptionsDialog *sod) +{ + g_return_val_if_fail (E_IS_SENDOPTIONS_DIALOG (sod), FALSE); + + return sod->priv->gopts_needed; +} + +GtkWidget * send_options_make_dateedit (void); + +GtkWidget * +send_options_make_dateedit (void) +{ + EDateEdit *dedit; + + dedit = E_DATE_EDIT (e_date_edit_new ()); + + e_date_edit_set_show_date (dedit, TRUE); + e_date_edit_set_show_time (dedit, TRUE); + + return GTK_WIDGET (dedit); +} + +gboolean +e_sendoptions_dialog_run (ESendOptionsDialog *sod, GtkWidget *parent, Item_type type) +{ + ESendOptionsDialogPrivate *priv; + GtkWidget *toplevel; + int result; + + priv = sod->priv; + priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/e-send-options.glade", NULL, NULL); + + if (!priv->xml) { + g_message ( G_STRLOC ": Could not load the Glade XML file "); + return FALSE; + } + + if (!get_widgets(sod)) { + g_object_unref (priv->xml); + g_message (G_STRLOC ": Could not get the Widgets \n"); + return FALSE; + } + + setup_widgets (sod, type); + + toplevel = gtk_widget_get_toplevel (priv->main); + gtk_window_set_transient_for (GTK_WINDOW (toplevel), + GTK_WINDOW (parent)); + + e_send_options_fill_widgets_with_data (sod); + sensitize_widgets (sod); + init_widgets (sod); + + result = gtk_dialog_run (GTK_DIALOG (priv->main)); + + if (result == GTK_RESPONSE_OK) + e_send_options_get_widgets_data (sod); + + gtk_widget_hide (priv->main); + gtk_widget_destroy (priv->main); + g_object_unref (priv->xml); + + return TRUE; +} + +static void +e_sendoptions_dialog_finalize (GObject *object) +{ +} + +static void +e_sendoptions_dialog_dispose (GObject *object) +{ +} + +/* Object initialization function for the task page */ +static void +e_sendoptions_dialog_init (GObject *object) +{ + ESendOptionsDialog *sod; + ESendOptionsDialogPrivate *priv; + ESendOptionsData *new; + + + sod = E_SENDOPTIONS_DIALOG (object); + new = g_new0 (ESendOptionsData, 1); + new->gopts = g_new0 (ESendOptionsGeneral, 1); + new->sopts = g_new0 (ESendOptionsStatusTracking, 1); + priv = g_new0 (ESendOptionsDialogPrivate, 1); + + sod->priv = priv; + sod->data = new; + sod->data->initialized = FALSE; + + priv->gopts_needed = TRUE; + priv->xml = NULL; + + priv->main = NULL; + priv->notebook = NULL; + priv->priority = NULL; + priv->classification = NULL; + priv->reply_request = NULL; + priv->reply_convenient = NULL; + priv->within_days = NULL; + priv->delay_delivery = NULL; + priv->delay_until = NULL; + priv->expiration = NULL; + priv->expire_after = NULL; + priv->create_sent = NULL; + priv->delivered =NULL; + priv->delivered_opened = NULL; + priv->all_info = NULL; + priv->when_opened = NULL; + priv->when_declined = NULL; + priv->when_accepted = NULL; + priv->when_completed = NULL; + priv->classification_label = NULL; + priv->priority_label = NULL; + priv->opened_label = NULL; + priv->gopts_label = NULL; + priv->sopts_label = NULL; + priv-> declined_label = NULL; + priv->accepted_label = NULL; + priv->completed_label = NULL; + +} + +/* Class initialization function for the Send Options */ +static void +e_sendoptions_dialog_class_init (GObjectClass *object) +{ + ESendOptionsDialogClass *klass; + GObjectClass *object_class; + GtkWidgetClass *widget_class; + + klass = E_SENDOPTIONS_DIALOG_CLASS (object); + object_class = G_OBJECT_CLASS (klass); + widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = e_sendoptions_dialog_finalize; + object_class->dispose = e_sendoptions_dialog_dispose; +} + +GType e_sendoptions_dialog_get_type (void) +{ + static GType type = 0; + if (type == 0) { + static const GTypeInfo info = { + sizeof (ESendOptionsDialogClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) e_sendoptions_dialog_class_init, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (ESendOptionsDialog), + 0, /* n_preallocs */ + (GInstanceInitFunc) e_sendoptions_dialog_init, + NULL /* instance_init */ + }; + type = g_type_register_static (G_TYPE_OBJECT, + "ESendOptionsDialogType", + &info, 0); + } + return type; +} + |