From eb52ee5a862b132e6c0655cd44b5887d64ead3ca Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Tue, 3 Jul 2001 04:48:06 +0000 Subject: New files with the alarm options dialog; this configures the 2001-07-02 Federico Mena Quintero * gui/dialogs/alarm-options.[ch]: New files with the alarm options dialog; this configures the repeat/duration properties and the options specific to each alarm action type. * gui/dialogs/alarm-page.c (AlarmPagePrivate): Added the alarm options button. Also, keep an alarm structure which we are editing and an alarm options dialog. (init_widgets): Connect to the options button. (add_clicked_cb): Clone the component we are editing instead of creating a new one so that we preserve the data from the alarm options dialog. (button_options_clicked_cb): Pop up the alarm options dialog. * cal-util/cal-component.c (cal_component_alarm_new): Doh, initialize the other fields in the new alarm. svn path=/trunk/; revision=10731 --- calendar/gui/dialogs/Makefile.am | 3 + calendar/gui/dialogs/alarm-options.c | 576 +++++++++++++++++++++++++++++++ calendar/gui/dialogs/alarm-options.glade | 398 +++++++++++++++++++++ calendar/gui/dialogs/alarm-options.h | 29 ++ calendar/gui/dialogs/alarm-page.c | 42 ++- calendar/gui/dialogs/alarm-page.glade | 7 +- 6 files changed, 1051 insertions(+), 4 deletions(-) create mode 100644 calendar/gui/dialogs/alarm-options.c create mode 100644 calendar/gui/dialogs/alarm-options.glade create mode 100644 calendar/gui/dialogs/alarm-options.h (limited to 'calendar/gui') diff --git a/calendar/gui/dialogs/Makefile.am b/calendar/gui/dialogs/Makefile.am index 3069c97a46..7d8e37497f 100644 --- a/calendar/gui/dialogs/Makefile.am +++ b/calendar/gui/dialogs/Makefile.am @@ -20,6 +20,8 @@ INCLUDES = \ noinst_LIBRARIES = libcal-dialogs.a libcal_dialogs_a_SOURCES = \ + alarm-options.c \ + alarm-options.h \ alarm-page.c \ alarm-page.h \ cal-prefs-dialog.c \ @@ -58,6 +60,7 @@ libcal_dialogs_a_SOURCES = \ task-page.h glade_DATA = \ + alarm-options.glade \ alarm-page.glade \ cal-prefs-dialog.glade \ e-timezone-dialog.glade \ diff --git a/calendar/gui/dialogs/alarm-options.c b/calendar/gui/dialogs/alarm-options.c new file mode 100644 index 0000000000..f94d146377 --- /dev/null +++ b/calendar/gui/dialogs/alarm-options.c @@ -0,0 +1,576 @@ +/* Evolution calendar - Alarm options dialog + * + * Copyright (C) 2001 Ximian, Inc. + * + * Authors: Federico Mena-Quintero + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include "e-util/e-dialog-widgets.h" +#include "alarm-options.h" + + + +typedef struct { + /* Whether the dialog was accepted or canceled */ + gboolean canceled; + + /* Glade XML data */ + GladeXML *xml; + + /* Toplevel */ + GtkWidget *toplevel; + + /* Buttons */ + GtkWidget *button_ok; + GtkWidget *button_cancel; + + /* Alarm repeat widgets */ + GtkWidget *repeat_toggle; + GtkWidget *repeat_group; + GtkWidget *repeat_quantity; + GtkWidget *repeat_value; + GtkWidget *repeat_unit; + + /* Display alarm widgets */ + GtkWidget *dalarm_group; + GtkWidget *dalarm_description; + + /* Audio alarm widgets */ + GtkWidget *aalarm_group; + GtkWidget *aalarm_attach; + + /* FIXME: Mail alarm widgets */ + GtkWidget *malarm_group; + + /* Procedure alarm widgets */ + GtkWidget *palarm_group; + GtkWidget *palarm_program; + GtkWidget *palarm_args; +} Dialog; + + + +/* Gets the widgets from the XML file and returns if they are all available. */ +static gboolean +get_widgets (Dialog *dialog) +{ +#define GW(name) glade_xml_get_widget (dialog->xml, name) + + dialog->toplevel = GW ("alarm-options-toplevel"); + + dialog->button_ok = GW ("button-ok"); + dialog->button_cancel = GW ("button-cancel"); + + dialog->repeat_toggle = GW ("repeat-toggle"); + dialog->repeat_group = GW ("repeat-group"); + dialog->repeat_quantity = GW ("repeat-quantity"); + dialog->repeat_value = GW ("repeat-value"); + dialog->repeat_unit = GW ("repeat-unit"); + + dialog->dalarm_group = GW ("dalarm-group"); + dialog->dalarm_description = GW ("dalarm-description"); + + dialog->aalarm_group = GW ("aalarm-group"); + dialog->aalarm_attach = GW ("aalarm-attach"); + + dialog->malarm_group = GW ("malarm-group"); + + dialog->palarm_group = GW ("palarm-group"); + dialog->palarm_program = GW ("palarm-program"); + dialog->palarm_args = GW ("palarm-args"); + + return (dialog->toplevel + && dialog->button_ok + && dialog->button_cancel + && dialog->repeat_toggle + && dialog->repeat_group + && dialog->repeat_quantity + && dialog->repeat_value + && dialog->repeat_unit + && dialog->dalarm_group + && dialog->dalarm_description + && dialog->aalarm_group + && dialog->aalarm_attach + && dialog->malarm_group + && dialog->palarm_group + && dialog->palarm_program + && dialog->palarm_args); +} + +/* Closes the dialog by terminating its main loop */ +static void +close_dialog (Dialog *dialog, gboolean canceled) +{ + dialog->canceled = canceled; + gtk_main_quit (); +} + +/* Callback used when the toplevel window is deleted */ +static guint +toplevel_delete_event_cb (GtkWidget *widget, GdkEventAny *event, gpointer data) +{ + Dialog *dialog; + + dialog = data; + close_dialog (dialog, TRUE); + return TRUE; +} + +/* Callback used when the OK button is clicked */ +static void +button_ok_clicked_cb (GtkWidget *button, gpointer data) +{ + Dialog *dialog; + + dialog = data; + close_dialog (dialog, FALSE); +} + +/* Callback used when the Cancel button is clicked */ +static void +button_cancel_clicked_cb (GtkWidget *button, gpointer data) +{ + Dialog *dialog; + + dialog = data; + close_dialog (dialog, TRUE); +} + +/* Callback used when the repeat toggle button is toggled. We sensitize the + * repeat group options as appropriate. + */ +static void +repeat_toggle_toggled_cb (GtkToggleButton *toggle, gpointer data) +{ + Dialog *dialog; + gboolean active; + + dialog = data; + + active = gtk_toggle_button_get_active (toggle); + + gtk_widget_set_sensitive (dialog->repeat_group, active); +} + +/* Hooks the widget signals */ +static void +init_widgets (Dialog *dialog) +{ + /* Toplevel, buttons */ + + dialog->canceled = TRUE; + + gtk_signal_connect (GTK_OBJECT (dialog->toplevel), "delete_event", + GTK_SIGNAL_FUNC (toplevel_delete_event_cb), dialog); + + gtk_signal_connect (GTK_OBJECT (dialog->button_ok), "clicked", + GTK_SIGNAL_FUNC (button_ok_clicked_cb), dialog); + + gtk_signal_connect (GTK_OBJECT (dialog->button_cancel), "clicked", + GTK_SIGNAL_FUNC (button_cancel_clicked_cb), dialog); + + /* Alarm repeat */ + + gtk_signal_connect (GTK_OBJECT (dialog->repeat_toggle), "toggled", + GTK_SIGNAL_FUNC (repeat_toggle_toggled_cb), dialog); +} + +/* Fills the audio alarm widgets with the values from the alarm component */ +static void +alarm_to_aalarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) +{ + struct icalattachtype *attach; + char *url; + + cal_component_alarm_get_attach (alarm, &attach); + + if (!attach) { + e_dialog_editable_set (dialog->aalarm_attach, NULL); + return; + } + + /* FIXME: this does not support inline data */ + + url = NULL; + + if (icalattachtype_get_base64 (attach)) + g_message ("alarm_to_aalarm_widgets(): FIXME: we don't support base64 data yet"); + else if (icalattachtype_get_binary (attach)) + g_message ("alarm_to_aalarm_widgets(): FIXME: we don't support binary data yet"); + else + url = icalattachtype_get_url (attach); + + e_dialog_editable_set (dialog->aalarm_attach, url); + + icalattachtype_free (attach); +} + +/* Fills the display alarm widgets with the values from the alarm component */ +static void +alarm_to_dalarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) +{ + CalComponentText description; + + cal_component_alarm_get_description (alarm, &description); + + e_dialog_editable_set (dialog->dalarm_description, description.value); +} + +/* Fills the mail alarm widgets with the values from the alarm component */ +static void +alarm_to_malarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) +{ + /* FIXME: nothing for now; we don't support mail alarms */ +} + +/* Fills the procedure alarm widgets with the values from the alarm component */ +static void +alarm_to_palarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) +{ + struct icalattachtype *attach; + CalComponentText description; + char *url; + + cal_component_alarm_get_attach (alarm, &attach); + cal_component_alarm_get_description (alarm, &description); + + url = icalattachtype_get_url (attach); + + e_dialog_editable_set (dialog->palarm_program, url); + e_dialog_editable_set (dialog->palarm_args, description.value); + + icalattachtype_free (attach); +} + +enum duration_units { + DUR_MINUTES, + DUR_HOURS, + DUR_DAYS +}; + +static const int duration_units_map[] = { + DUR_MINUTES, + DUR_HOURS, + DUR_DAYS, + -1 +}; + +/* Sigh. Takes an overcomplicated duration value and reduces it to its lowest + * common denominator. + */ +static void +normalize_duration (struct icaldurationtype dur, int *value, enum duration_units *units) +{ + if (dur.seconds != 0 || dur.minutes != 0) { + *value = ((((dur.weeks * 7 + dur.days) * 24 + dur.hours) * 60) + dur.minutes + + dur.seconds / 60 + ((dur.seconds % 60) >= 30 ? 1 : 0)); + *units = DUR_MINUTES; + } else if (dur.hours) { + *value = ((dur.weeks * 7) + dur.days) * 24 + dur.hours; + *units = DUR_HOURS; + } else if (dur.days != 0 || dur.weeks != 0) { + *value = dur.weeks * 7 + dur.days; + *units = DUR_DAYS; + } else { + *value = 0; + *units = DUR_MINUTES; + } +} + +/* Fills the repeat widgets with the values from the alarm component */ +static void +alarm_to_repeat_widgets (Dialog *dialog, CalComponentAlarm *alarm) +{ + CalAlarmRepeat repeat; + int value; + enum duration_units units; + + cal_component_alarm_get_repeat (alarm, &repeat); + + /* Sensitivity */ + + if (repeat.repetitions == 0) { + gtk_widget_set_sensitive (dialog->repeat_group, FALSE); + e_dialog_toggle_set (dialog->repeat_toggle, FALSE); + return; + } + + gtk_widget_set_sensitive (dialog->repeat_group, TRUE); + e_dialog_toggle_set (dialog->repeat_toggle, TRUE); + + /* Repetitions */ + e_dialog_spin_set (dialog->repeat_quantity, repeat.repetitions); + + /* Duration */ + + normalize_duration (repeat.duration, &value, &units); + + e_dialog_spin_set (dialog->repeat_value, value); + e_dialog_option_menu_set (dialog->repeat_unit, units, duration_units_map); +} + +/* Fills the widgets with the values from the alarm component */ +static void +alarm_to_dialog (Dialog *dialog, CalComponentAlarm *alarm) +{ + CalAlarmAction action; + + alarm_to_repeat_widgets (dialog, alarm); + + cal_component_alarm_get_action (alarm, &action); + + switch (action) { + case CAL_ALARM_NONE: + g_assert_not_reached (); + return; + + case CAL_ALARM_AUDIO: + gtk_window_set_title (GTK_WINDOW (dialog->toplevel), _("Audio Alarm Options")); + gtk_widget_show (dialog->aalarm_group); + gtk_widget_hide (dialog->dalarm_group); + gtk_widget_hide (dialog->malarm_group); + gtk_widget_hide (dialog->palarm_group); + alarm_to_aalarm_widgets (dialog, alarm); + break; + + case CAL_ALARM_DISPLAY: + gtk_window_set_title (GTK_WINDOW (dialog->toplevel), _("Message Alarm Options")); + gtk_widget_hide (dialog->aalarm_group); + gtk_widget_show (dialog->dalarm_group); + gtk_widget_hide (dialog->malarm_group); + gtk_widget_hide (dialog->palarm_group); + alarm_to_dalarm_widgets (dialog, alarm); + break; + + case CAL_ALARM_EMAIL: + gtk_window_set_title (GTK_WINDOW (dialog->toplevel), _("Mail Alarm Options")); + gtk_widget_hide (dialog->aalarm_group); + gtk_widget_hide (dialog->dalarm_group); + gtk_widget_show (dialog->malarm_group); + gtk_widget_hide (dialog->palarm_group); + alarm_to_malarm_widgets (dialog, alarm); + break; + + case CAL_ALARM_PROCEDURE: + gtk_window_set_title (GTK_WINDOW (dialog->toplevel), _("Program Alarm Options")); + gtk_widget_hide (dialog->aalarm_group); + gtk_widget_hide (dialog->dalarm_group); + gtk_widget_hide (dialog->malarm_group); + gtk_widget_show (dialog->palarm_group); + alarm_to_palarm_widgets (dialog, alarm); + break; + + case CAL_ALARM_UNKNOWN: + gtk_window_set_title (GTK_WINDOW (dialog->toplevel), _("Unknown Alarm Options")); + break; + + default: + g_assert_not_reached (); + return; + } +} + + + +/* Fills the alarm data with the values from the repeat/duration widgets */ +static void +repeat_widgets_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) +{ + CalAlarmRepeat repeat; + + if (!e_dialog_toggle_get (dialog->repeat_toggle)) { + repeat.repetitions = 0; + + cal_component_alarm_set_repeat (alarm, repeat); + return; + } + + repeat.repetitions = e_dialog_spin_get_int (dialog->repeat_quantity); + + memset (&repeat.duration, 0, sizeof (repeat.duration)); + switch (e_dialog_option_menu_get (dialog->repeat_unit, duration_units_map)) { + case DUR_MINUTES: + repeat.duration.minutes = e_dialog_spin_get_int (dialog->repeat_value); + break; + + case DUR_HOURS: + repeat.duration.hours = e_dialog_spin_get_int (dialog->repeat_value); + break; + + case DUR_DAYS: + repeat.duration.days = e_dialog_spin_get_int (dialog->repeat_value); + break; + + default: + g_assert_not_reached (); + } + + cal_component_alarm_set_repeat (alarm, repeat); + +} + +/* Fills the audio alarm data with the values from the widgets */ +static void +aalarm_widgets_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) +{ + char *url; + struct icalattachtype *attach; + + attach = icalattachtype_new (); + + url = e_dialog_editable_get (dialog->aalarm_attach); + icalattachtype_set_url (attach, url ? url : ""); + g_free (url); + + cal_component_alarm_set_attach (alarm, attach); + icalattachtype_free (attach); +} + +/* Fills the display alarm data with the values from the widgets */ +static void +dalarm_widgets_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) +{ + char *str; + CalComponentText description; + + str = e_dialog_editable_get (dialog->dalarm_description); + description.value = str; + description.altrep = NULL; + + cal_component_alarm_set_description (alarm, &description); + g_free (str); +} + +/* Fills the mail alarm data with the values from the widgets */ +static void +malarm_widgets_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) +{ + /* FIXME: nothing for now; we don't support mail alarms */ +} + +/* Fills the procedure alarm data with the values from the widgets */ +static void +palarm_widgets_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) +{ + char *program; + struct icalattachtype *attach; + char *str; + CalComponentText description; + + attach = icalattachtype_new (); + + program = e_dialog_editable_get (dialog->palarm_program); + icalattachtype_set_url (attach, program ? program : ""); + g_free (program); + + cal_component_alarm_set_attach (alarm, attach); + icalattachtype_free (attach); + + str = e_dialog_editable_get (dialog->palarm_args); + description.value = str; + description.altrep = NULL; + + cal_component_alarm_set_description (alarm, &description); + g_free (str); +} + +/* Fills the alarm data with the values from the widgets */ +static void +dialog_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) +{ + CalAlarmAction action; + + repeat_widgets_to_alarm (dialog, alarm); + + cal_component_alarm_get_action (alarm, &action); + + switch (action) { + case CAL_ALARM_NONE: + g_assert_not_reached (); + break; + + case CAL_ALARM_AUDIO: + aalarm_widgets_to_alarm (dialog, alarm); + break; + + case CAL_ALARM_DISPLAY: + dalarm_widgets_to_alarm (dialog, alarm); + break; + + case CAL_ALARM_EMAIL: + malarm_widgets_to_alarm (dialog, alarm); + break; + + case CAL_ALARM_PROCEDURE: + palarm_widgets_to_alarm (dialog, alarm); + break; + + case CAL_ALARM_UNKNOWN: + break; + + default: + g_assert_not_reached (); + } +} + + + +gboolean +alarm_options_dialog_run (CalComponentAlarm *alarm) +{ + Dialog dialog; + + g_return_val_if_fail (alarm != NULL, FALSE); + + dialog.xml = glade_xml_new (EVOLUTION_GLADEDIR "/alarm-options.glade", NULL); + if (!dialog.xml) { + g_message ("alarm_options_dialog_new(): Could not load the Glade XML file!"); + return FALSE; + } + + if (!get_widgets (&dialog)) { + gtk_object_unref (GTK_OBJECT (dialog.xml)); + return FALSE; + } + + init_widgets (&dialog); + + alarm_to_dialog (&dialog, alarm); + + gtk_widget_show (dialog.toplevel); + gtk_main (); + + if (!dialog.canceled) + dialog_to_alarm (&dialog, alarm); + + gtk_widget_destroy (dialog.toplevel); + gtk_object_unref (GTK_OBJECT (dialog.xml)); + + return TRUE; +} diff --git a/calendar/gui/dialogs/alarm-options.glade b/calendar/gui/dialogs/alarm-options.glade new file mode 100644 index 0000000000..ad0c181561 --- /dev/null +++ b/calendar/gui/dialogs/alarm-options.glade @@ -0,0 +1,398 @@ + + + + + Dialogs + dialogs + + src + pixmaps + C + True + True + + + + GtkWindow + alarm-options-toplevel + + GTK_WINDOW_DIALOG + GTK_WIN_POS_NONE + True + False + True + True + + + GtkVBox + vbox1 + 4 + False + 4 + + + GtkFrame + frame1 + + 0 + GTK_SHADOW_ETCHED_IN + + 0 + False + False + + + + GtkHBox + hbox1 + 4 + False + 4 + + + GtkCheckButton + repeat-toggle + True + True + + False + True + + 0 + False + False + + + + + GtkHBox + repeat-group + False + 4 + + 0 + False + False + + + + GtkSpinButton + repeat-quantity + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 + 0 + 999 + 1 + 10 + 10 + + 0 + True + True + + + + + GtkLabel + label1 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkSpinButton + repeat-value + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 + 0 + 999 + 1 + 10 + 10 + + 0 + True + True + + + + + GtkOptionMenu + repeat-unit + True + minutes +hours +days + + 0 + + 0 + False + False + + + + + + + + GtkVBox + dalarm-group + False + False + 4 + + 0 + True + True + + + + GtkLabel + label2 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkScrolledWindow + scrolledwindow1 + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + 0 + True + True + + + + GtkText + dalarm-description + True + True + + + + + + + GtkHBox + aalarm-group + False + False + 4 + + 0 + False + False + + + + GtkLabel + label3 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GnomeFileEntry + file-entry1 + 10 + False + False + + 0 + True + True + + + + GtkEntry + GnomeEntry:entry + aalarm-attach + True + True + True + 0 + + + + + + + GtkLabel + malarm-group + False + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkHBox + palarm-group + False + False + 4 + + 0 + False + False + + + + GtkLabel + label5 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkEntry + palarm-program + True + True + True + 0 + + + 0 + True + True + + + + + GtkLabel + label6 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkEntry + palarm-args + True + True + True + 0 + + + 0 + True + True + + + + + + GtkHButtonBox + hbuttonbox1 + GTK_BUTTONBOX_END + 30 + 85 + 27 + 7 + 0 + + 0 + False + False + + + + GtkButton + button-ok + True + True + True + GNOME_STOCK_BUTTON_OK + GTK_RELIEF_NORMAL + + + + GtkButton + button-cancel + True + True + GNOME_STOCK_BUTTON_CANCEL + GTK_RELIEF_NORMAL + + + + + + diff --git a/calendar/gui/dialogs/alarm-options.h b/calendar/gui/dialogs/alarm-options.h new file mode 100644 index 0000000000..36f945f684 --- /dev/null +++ b/calendar/gui/dialogs/alarm-options.h @@ -0,0 +1,29 @@ +/* Evolution calendar - Alarm options dialog + * + * Copyright (C) 2001 Ximian, Inc. + * + * Authors: Federico Mena-Quintero + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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, Boston, MA 02111-1307, USA. + */ + +#ifndef ALARM_OPTIONS_H +#define ALARM_OPTIONS_H + +#include + +gboolean alarm_options_dialog_run (CalComponentAlarm *alarm); + +#endif diff --git a/calendar/gui/dialogs/alarm-page.c b/calendar/gui/dialogs/alarm-page.c index 9a92b5c9a2..3946c15310 100644 --- a/calendar/gui/dialogs/alarm-page.c +++ b/calendar/gui/dialogs/alarm-page.c @@ -35,6 +35,7 @@ #include "e-util/e-dialog-widgets.h" #include "cal-util/cal-util.h" #include "comp-editor-util.h" +#include "alarm-options.h" #include "alarm-page.h" @@ -61,6 +62,11 @@ struct _AlarmPagePrivate { GtkWidget *relative; GtkWidget *time; + GtkWidget *button_options; + + /* Alarm options dialog and the alarm we maintain */ + CalComponentAlarm *alarm; + gboolean updating; }; @@ -155,6 +161,9 @@ alarm_page_init (AlarmPage *apage) priv->value_units = NULL; priv->relative = NULL; priv->time = NULL; + priv->button_options = NULL; + + priv->alarm = cal_component_alarm_new (); priv->updating = FALSE; } @@ -205,6 +214,11 @@ alarm_page_destroy (GtkObject *object) free_alarms (apage); + if (priv->alarm) { + cal_component_alarm_free (priv->alarm); + priv->alarm = NULL; + } + g_free (priv); apage->priv = NULL; @@ -581,6 +595,8 @@ get_widgets (AlarmPage *apage) priv->relative = GW ("relative"); priv->time = GW ("time"); + priv->button_options = GW ("button-options"); + #undef GW return (priv->summary @@ -592,7 +608,8 @@ get_widgets (AlarmPage *apage) && priv->interval_value && priv->value_units && priv->relative - && priv->time); + && priv->time + && priv->button_options); } /* This is called when any field is changed; it notifies upstream. */ @@ -621,7 +638,7 @@ add_clicked_cb (GtkButton *button, gpointer data) apage = ALARM_PAGE (data); priv = apage->priv; - alarm = cal_component_alarm_new (); + alarm = cal_component_alarm_clone (priv->alarm); memset (&trigger, 0, sizeof (CalAlarmTrigger)); trigger.type = e_dialog_option_menu_get (priv->time, time_map); @@ -690,6 +707,23 @@ delete_clicked_cb (GtkButton *button, gpointer data) gtk_widget_set_sensitive (priv->delete, FALSE); } +/* Callback used when the alarm options button is clicked */ +static void +button_options_clicked_cb (GtkWidget *widget, gpointer data) +{ + AlarmPage *apage; + AlarmPagePrivate *priv; + + apage = ALARM_PAGE (data); + priv = apage->priv; + + cal_component_alarm_set_action (priv->alarm, + e_dialog_option_menu_get (priv->action, action_map)); + + if (!alarm_options_dialog_run (priv->alarm)) + g_message ("button_options_clicked_cb(): Could not create the alarm options dialog"); +} + /* Hooks the widget signals */ static void init_widgets (AlarmPage *apage) @@ -711,6 +745,10 @@ init_widgets (AlarmPage *apage) GTK_SIGNAL_FUNC (field_changed_cb), apage); gtk_signal_connect (GTK_OBJECT (priv->delete), "clicked", GTK_SIGNAL_FUNC (field_changed_cb), apage); + + /* Options button */ + gtk_signal_connect (GTK_OBJECT (priv->button_options), "clicked", + GTK_SIGNAL_FUNC (button_options_clicked_cb), apage); } diff --git a/calendar/gui/dialogs/alarm-page.glade b/calendar/gui/dialogs/alarm-page.glade index 80db7edc76..0e4009009a 100644 --- a/calendar/gui/dialogs/alarm-page.glade +++ b/calendar/gui/dialogs/alarm-page.glade @@ -280,9 +280,10 @@ end of appointment GtkButton - button9 + button-options True - + + GTK_RELIEF_NORMAL 0 False @@ -361,6 +362,7 @@ end of appointment True True + GTK_RELIEF_NORMAL @@ -369,6 +371,7 @@ end of appointment True True + GTK_RELIEF_NORMAL -- cgit v1.2.3