/* * Evolution calendar - Main page of the Groupwise send options Dialog * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) version 3. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the program; if not, see * * * Authors: * Chenthill Palanisamy * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * */ #ifdef HAVE_CONFIG_H #include #endif #include "e-send-options.h" #include #include #include #include "e-dateedit.h" #include "e-misc-utils.h" #include "e-util-private.h" #define E_SEND_OPTIONS_DIALOG_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_SEND_OPTIONS_DIALOG, ESendOptionsDialogPrivate)) struct _ESendOptionsDialogPrivate { GtkBuilder *builder; gboolean gopts_needed; gboolean global; /* Widgets */ GtkWidget *main; /* Noteboook to add options page and status tracking page*/ GtkNotebook *notebook; GtkWidget *status; /* priority */ GtkWidget *priority; /* Security */ GtkWidget *security; /* 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 *security_label; GtkWidget *priority_label; GtkWidget *gopts_label; GtkWidget *opened_label; GtkWidget *declined_label; GtkWidget *accepted_label; GtkWidget *completed_label; GtkWidget *until_label; gchar *help_section; }; static void e_send_options_dialog_finalize (GObject *object); static void e_send_options_cb (GtkDialog *dialog, gint state, gpointer func_data); enum { SOD_RESPONSE, LAST_SIGNAL }; static guint signals[LAST_SIGNAL] = {0}; G_DEFINE_TYPE ( ESendOptionsDialog, e_send_options_dialog, G_TYPE_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->security = gtk_combo_box_get_active ((GtkComboBox *) priv->security); 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)); sopts->autodelete = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->autodelete)); 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); gtk_combo_box_set_active ((GtkComboBox *) priv->security, gopts->security); 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); if (sopts->autodelete) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->autodelete), TRUE); else gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->autodelete), 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); gtk_widget_set_sensitive (priv->autodelete, FALSE); } } static void expiration_toggled_cb (GtkToggleButton *toggle, gpointer data) { gboolean active; ESendOptionsDialog *sod; ESendOptionsDialogPrivate *priv; sod = data; priv = sod->priv; active = gtk_toggle_button_get_active (toggle); gtk_widget_set_sensitive (priv->expire_after, active); } static void reply_request_toggled_cb (GtkToggleButton *toggle, gpointer data) { gboolean active; ESendOptionsDialog *sod; ESendOptionsDialogPrivate *priv; sod = data; priv = sod->priv; active = gtk_toggle_button_get_active (toggle); 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 (GtkToggleButton *toggle, gpointer data) { gboolean active; ESendOptionsDialog *sod; ESendOptionsDialogPrivate *priv; sod = data; priv = sod->priv; active = gtk_toggle_button_get_active (toggle); gtk_widget_set_sensitive (priv->delay_until, active); } static void sent_item_toggled_cb (GtkToggleButton *toggle, gpointer data) { gboolean active; ESendOptionsDialog *sod; ESendOptionsDialogPrivate *priv; sod = data; priv = sod->priv; active = gtk_toggle_button_get_active (toggle); gtk_widget_set_sensitive (priv->delivered, active); gtk_widget_set_sensitive (priv->delivered_opened, active); gtk_widget_set_sensitive (priv->all_info, active); gtk_widget_set_sensitive (priv->autodelete, active); } static void delay_until_date_changed_cb (GtkWidget *dedit, gpointer data) { ESendOptionsDialog *sod; ESendOptionsDialogPrivate *priv; time_t tmp, current; sod = data; priv = sod->priv; 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 page_changed_cb (GtkNotebook *notebook, GtkWidget *page, gint num, gpointer data) { ESendOptionsDialog *sod = data; ESendOptionsDialogPrivate *priv = sod->priv; e_send_options_get_widgets_data (sod); if (num > 0) { GtkWidget *child; if (num == 1) { 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_widget_set_sensitive (priv->autodelete, TRUE); sod->data->sopts = sod->data->mopts; child = gtk_notebook_get_nth_page (notebook, 1); if (child != priv->status && (!GTK_IS_BIN (child) || gtk_bin_get_child (GTK_BIN (child)) != priv->status)) gtk_widget_reparent (priv->status, child); } else if (num == 2) { gtk_widget_hide (priv->completed_label); gtk_widget_hide (priv->when_completed); gtk_widget_set_sensitive (priv->autodelete, FALSE); gtk_widget_show (priv->accepted_label); gtk_widget_show (priv->when_accepted); sod->data->sopts = sod->data->copts; child = gtk_notebook_get_nth_page (notebook, 2); if (gtk_bin_get_child (GTK_BIN (child)) != priv->status) gtk_widget_reparent (priv->status, child); } else { gtk_widget_set_sensitive (priv->autodelete, FALSE); gtk_widget_show (priv->completed_label); gtk_widget_show (priv->when_completed); gtk_widget_show (priv->accepted_label); gtk_widget_show (priv->when_accepted); sod->data->sopts = sod->data->topts; child = gtk_notebook_get_nth_page (notebook, 3); if (gtk_bin_get_child (GTK_BIN (child)) != priv->status) gtk_widget_reparent (priv->status, child); } } e_send_options_fill_widgets_with_data (sod); } 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->main, "response", G_CALLBACK (e_send_options_cb), sod); g_signal_connect ( priv->delay_until, "changed", G_CALLBACK (delay_until_date_changed_cb), sod); if (priv->global) g_signal_connect ( priv->notebook, "switch-page", G_CALLBACK (page_changed_cb), sod); } static gboolean get_widgets (ESendOptionsDialog *sod) { ESendOptionsDialogPrivate *priv; GtkBuilder *builder; priv = sod->priv; builder = sod->priv->builder; priv->main = e_builder_get_widget (builder, "send-options-dialog"); if (!priv->main) return FALSE; priv->priority = e_builder_get_widget (builder, "combo-priority"); priv->status = e_builder_get_widget (builder, "status-tracking"); priv->security = e_builder_get_widget (builder, "security-combo"); priv->notebook = (GtkNotebook *) e_builder_get_widget (builder, "notebook"); priv->reply_request = e_builder_get_widget (builder, "reply-request-button"); priv->reply_convenient = e_builder_get_widget (builder, "reply-convinient"); priv->reply_within = e_builder_get_widget (builder, "reply-within"); priv->within_days = e_builder_get_widget (builder, "within-days"); priv->delay_delivery = e_builder_get_widget (builder, "delay-delivery-button"); priv->delay_until = e_builder_get_widget (builder, "until-date"); gtk_widget_show (priv->delay_until); priv->expiration = e_builder_get_widget (builder, "expiration-button"); priv->expire_after = e_builder_get_widget (builder, "expire-after"); priv->create_sent = e_builder_get_widget (builder, "create-sent-button"); priv->delivered = e_builder_get_widget (builder, "delivered"); priv->delivered_opened = e_builder_get_widget (builder, "delivered-opened"); priv->all_info = e_builder_get_widget (builder, "all-info"); priv->autodelete = e_builder_get_widget (builder, "autodelete"); priv->when_opened = e_builder_get_widget (builder, "open-combo"); priv->when_declined = e_builder_get_widget (builder, "delete-combo"); priv->when_accepted = e_builder_get_widget (builder, "accept-combo"); priv->when_completed = e_builder_get_widget (builder, "complete-combo"); priv->security_label = e_builder_get_widget (builder, "security-label"); priv->gopts_label = e_builder_get_widget (builder, "gopts-label"); priv->priority_label = e_builder_get_widget (builder, "priority-label"); priv->until_label = e_builder_get_widget (builder, "until-label"); priv->opened_label = e_builder_get_widget (builder, "opened-label"); priv->declined_label = e_builder_get_widget (builder, "declined-label"); priv->accepted_label = e_builder_get_widget (builder, "accepted-label"); priv->completed_label = e_builder_get_widget (builder, "completed-label"); return (priv->priority && priv->security && priv->status && 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->security_label && priv->priority_label && priv->opened_label && priv->gopts_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_show_tabs (priv->notebook, FALSE); 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->security_label), priv->security); 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); if (priv->global) { GtkWidget *widget, *page; widget = gtk_label_new (_("Mail")); page = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); gtk_widget_reparent (priv->status, page); gtk_notebook_append_page (priv->notebook, page, widget); gtk_container_child_set (GTK_CONTAINER (priv->notebook), page, "tab-fill", FALSE, "tab-expand", FALSE, NULL); gtk_widget_show (page); gtk_widget_show (widget); widget = gtk_label_new (_("Calendar")); page = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); gtk_notebook_append_page (priv->notebook, page, widget); gtk_container_child_set (GTK_CONTAINER (priv->notebook), page, "tab-fill", FALSE, "tab-expand", FALSE, NULL); gtk_widget_show (page); gtk_widget_show (widget); widget = gtk_label_new (_("Task")); page = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); gtk_notebook_append_page (priv->notebook, page, widget); gtk_container_child_set (GTK_CONTAINER (priv->notebook), page, "tab-fill", FALSE, "tab-expand", FALSE, NULL); gtk_widget_show (page); gtk_widget_show (widget); gtk_notebook_set_show_tabs (priv->notebook, TRUE); } switch (type) { case E_ITEM_MAIL: priv->help_section = g_strdup ("groupwise-placeholder"); 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: priv->help_section = g_strdup ("groupwise-placeholder"); gtk_widget_hide (priv->completed_label); gtk_widget_hide (priv->when_completed); case E_ITEM_TASK: priv->help_section = g_strdup ("groupwise-placeholder"); gtk_widget_hide (priv->security_label); gtk_widget_hide (priv->security); gtk_widget_set_sensitive (priv->autodelete, FALSE); break; default: break; } } ESendOptionsDialog * e_send_options_dialog_new (void) { ESendOptionsDialog *sod; sod = g_object_new (E_TYPE_SEND_OPTIONS_DIALOG, NULL); return sod; } void e_send_options_set_need_general_options (ESendOptionsDialog *sod, gboolean needed) { g_return_if_fail (E_IS_SEND_OPTIONS_DIALOG (sod)); sod->priv->gopts_needed = needed; } gboolean e_send_options_get_need_general_options (ESendOptionsDialog *sod) { g_return_val_if_fail (E_IS_SEND_OPTIONS_DIALOG (sod), FALSE); return sod->priv->gopts_needed; } gboolean e_send_options_set_global (ESendOptionsDialog *sod, gboolean set) { g_return_val_if_fail (E_IS_SEND_OPTIONS_DIALOG (sod), FALSE); sod->priv->global = set; return TRUE; } static void e_send_options_cb (GtkDialog *dialog, gint state, gpointer func_data) { ESendOptionsDialogPrivate *priv; ESendOptionsDialog *sod; sod = func_data; priv = sod->priv; switch (state) { case GTK_RESPONSE_OK: e_send_options_get_widgets_data (sod); case GTK_RESPONSE_CANCEL: gtk_widget_hide (priv->main); gtk_widget_destroy (priv->main); g_object_unref (priv->builder); break; case GTK_RESPONSE_HELP: e_display_help ( GTK_WINDOW (priv->main), priv->help_section); break; } g_signal_emit (func_data, signals[SOD_RESPONSE], 0, state); } gboolean e_send_options_dialog_run (ESendOptionsDialog *sod, GtkWidget *parent, Item_type type) { ESendOptionsDialogPrivate *priv; GtkWidget *toplevel; g_return_val_if_fail (sod != NULL || E_IS_SEND_OPTIONS_DIALOG (sod), FALSE); priv = sod->priv; /* Make sure our custom widget classes are registered with * GType before we load the GtkBuilder definition file. */ g_type_ensure (E_TYPE_DATE_EDIT); priv->builder = gtk_builder_new (); e_load_ui_builder_definition (priv->builder, "e-send-options.ui"); if (!get_widgets (sod)) { g_object_unref (priv->builder); g_message (G_STRLOC ": Could not get the Widgets \n"); return FALSE; } if (priv->global) { g_free (sod->data->sopts); sod->data->sopts = sod->data->mopts; } setup_widgets (sod, type); toplevel = gtk_widget_get_toplevel (priv->main); if (parent) 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); gtk_window_set_modal ((GtkWindow *) priv->main, TRUE); gtk_widget_show (priv->main); return TRUE; } static void e_send_options_dialog_finalize (GObject *object) { ESendOptionsDialog *sod; sod = E_SEND_OPTIONS_DIALOG (object); g_free (sod->priv->help_section); g_free (sod->data->gopts); if (!sod->priv->global) g_free (sod->data->sopts); g_free (sod->data->mopts); g_free (sod->data->copts); g_free (sod->data->topts); g_free (sod->data); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_send_options_dialog_parent_class)->finalize (object); } /* Object initialization function for the task page */ static void e_send_options_dialog_init (ESendOptionsDialog *sod) { ESendOptionsData *new; new = g_new0 (ESendOptionsData, 1); new->gopts = g_new0 (ESendOptionsGeneral, 1); new->sopts = g_new0 (ESendOptionsStatusTracking, 1); new->mopts = g_new0 (ESendOptionsStatusTracking, 1); new->copts = g_new0 (ESendOptionsStatusTracking, 1); new->topts = g_new0 (ESendOptionsStatusTracking, 1); sod->priv = E_SEND_OPTIONS_DIALOG_GET_PRIVATE (sod); sod->data = new; sod->data->initialized = FALSE; sod->data->gopts->security = 0; sod->priv->gopts_needed = TRUE; } /* Class initialization function for the Send Options */ static void e_send_options_dialog_class_init (ESendOptionsDialogClass *class) { GObjectClass *object_class; g_type_class_add_private (class, sizeof (ESendOptionsDialogPrivate)); object_class = G_OBJECT_CLASS (class); object_class->finalize = e_send_options_dialog_finalize; signals[SOD_RESPONSE] = g_signal_new ( "sod_response", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (ESendOptionsDialogClass, sod_response), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); }