diff options
-rw-r--r-- | calendar/ChangeLog | 18 | ||||
-rw-r--r-- | calendar/cal-util/cal-component.c | 9 | ||||
-rw-r--r-- | calendar/cal-util/cal-component.h | 2 | ||||
-rw-r--r-- | calendar/gui/dialogs/Makefile.am | 3 | ||||
-rw-r--r-- | calendar/gui/dialogs/alarm-options.c | 576 | ||||
-rw-r--r-- | calendar/gui/dialogs/alarm-options.glade | 398 | ||||
-rw-r--r-- | calendar/gui/dialogs/alarm-options.h | 29 | ||||
-rw-r--r-- | calendar/gui/dialogs/alarm-page.c | 42 | ||||
-rw-r--r-- | calendar/gui/dialogs/alarm-page.glade | 7 |
9 files changed, 1077 insertions, 7 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 3c93bd6a6b..9498fa1cc7 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,21 @@ +2001-07-02 Federico Mena Quintero <federico@ximian.com> + + * 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. + 2001-07-03 Damon Chaplin <damon@ximian.com> * cal-client/cal-client.[hc] diff --git a/calendar/cal-util/cal-component.c b/calendar/cal-util/cal-component.c index 2669dc5562..86b949dfed 100644 --- a/calendar/cal-util/cal-component.c +++ b/calendar/cal-util/cal-component.c @@ -4337,6 +4337,11 @@ cal_component_alarm_new (void) g_free (new_auid); alarm->action = NULL; + alarm->attach = NULL; + alarm->description.prop = NULL; + alarm->description.altrep_param = NULL; + alarm->duration = NULL; + alarm->repeat = NULL; alarm->trigger = NULL; return alarm; @@ -4532,14 +4537,14 @@ cal_component_alarm_get_attach (CalComponentAlarm *alarm, struct icalattachtype } /** - * cal_copmonent_alarm_set_attach: + * cal_component_alarm_set_attach: * @alarm: An alarm. * @attach: Attachment property or NULL to remove an existing property. * * Sets the attachment property of an alarm. **/ void -cal_copmonent_alarm_set_attach (CalComponentAlarm *alarm, struct icalattachtype *attach) +cal_component_alarm_set_attach (CalComponentAlarm *alarm, struct icalattachtype *attach) { g_return_if_fail (alarm != NULL); diff --git a/calendar/cal-util/cal-component.h b/calendar/cal-util/cal-component.h index 4b3bdfaae4..2dcc06ce61 100644 --- a/calendar/cal-util/cal-component.h +++ b/calendar/cal-util/cal-component.h @@ -434,7 +434,7 @@ void cal_component_alarm_get_action (CalComponentAlarm *alarm, CalAlarmAction *a void cal_component_alarm_set_action (CalComponentAlarm *alarm, CalAlarmAction action); void cal_component_alarm_get_attach (CalComponentAlarm *alarm, struct icalattachtype **attach); -void cal_copmonent_alarm_set_attach (CalComponentAlarm *alarm, struct icalattachtype *attach); +void cal_component_alarm_set_attach (CalComponentAlarm *alarm, struct icalattachtype *attach); void cal_component_alarm_get_description (CalComponentAlarm *alarm, CalComponentText *description); void cal_component_alarm_set_description (CalComponentAlarm *alarm, CalComponentText *description); 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 <federico@ximian.com> + * + * 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 <config.h> +#endif + +#include <glib.h> +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> +#include <gtk/gtkmain.h> +#include <gtk/gtkcheckbutton.h> +#include <gtk/gtksignal.h> +#include <gtk/gtkwindow.h> +#include <glade/glade.h> +#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 @@ +<?xml version="1.0"?> +<GTK-Interface> + +<project> + <name>Dialogs</name> + <program_name>dialogs</program_name> + <directory></directory> + <source_directory>src</source_directory> + <pixmaps_directory>pixmaps</pixmaps_directory> + <language>C</language> + <gnome_support>True</gnome_support> + <gettext_support>True</gettext_support> +</project> + +<widget> + <class>GtkWindow</class> + <name>alarm-options-toplevel</name> + <title></title> + <type>GTK_WINDOW_DIALOG</type> + <position>GTK_WIN_POS_NONE</position> + <modal>True</modal> + <allow_shrink>False</allow_shrink> + <allow_grow>True</allow_grow> + <auto_shrink>True</auto_shrink> + + <widget> + <class>GtkVBox</class> + <name>vbox1</name> + <border_width>4</border_width> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + + <widget> + <class>GtkFrame</class> + <name>frame1</name> + <label>Alarm Repeat</label> + <label_xalign>0</label_xalign> + <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>GtkHBox</class> + <name>hbox1</name> + <border_width>4</border_width> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + + <widget> + <class>GtkCheckButton</class> + <name>repeat-toggle</name> + <can_focus>True</can_focus> + <has_focus>True</has_focus> + <label>Repeat the alarm</label> + <active>False</active> + <draw_indicator>True</draw_indicator> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkHBox</class> + <name>repeat-group</name> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>GtkSpinButton</class> + <name>repeat-quantity</name> + <can_focus>True</can_focus> + <climb_rate>1</climb_rate> + <digits>0</digits> + <numeric>False</numeric> + <update_policy>GTK_UPDATE_ALWAYS</update_policy> + <snap>False</snap> + <wrap>False</wrap> + <value>1</value> + <lower>0</lower> + <upper>999</upper> + <step>1</step> + <page>10</page> + <page_size>10</page_size> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label1</name> + <label>extra times every</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkSpinButton</class> + <name>repeat-value</name> + <can_focus>True</can_focus> + <climb_rate>1</climb_rate> + <digits>0</digits> + <numeric>False</numeric> + <update_policy>GTK_UPDATE_ALWAYS</update_policy> + <snap>False</snap> + <wrap>False</wrap> + <value>1</value> + <lower>0</lower> + <upper>999</upper> + <step>1</step> + <page>10</page> + <page_size>10</page_size> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + + <widget> + <class>GtkOptionMenu</class> + <name>repeat-unit</name> + <can_focus>True</can_focus> + <items>minutes +hours +days +</items> + <initial_choice>0</initial_choice> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + </widget> + </widget> + </widget> + + <widget> + <class>GtkVBox</class> + <name>dalarm-group</name> + <visible>False</visible> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkLabel</class> + <name>label2</name> + <label>Message to Display</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkScrolledWindow</class> + <name>scrolledwindow1</name> + <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy> + <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> + <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> + <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkText</class> + <name>dalarm-description</name> + <can_focus>True</can_focus> + <editable>True</editable> + <text></text> + </widget> + </widget> + </widget> + + <widget> + <class>GtkHBox</class> + <name>aalarm-group</name> + <visible>False</visible> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>GtkLabel</class> + <name>label3</name> + <label>Play sound:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GnomeFileEntry</class> + <name>file-entry1</name> + <max_saved>10</max_saved> + <directory>False</directory> + <modal>False</modal> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkEntry</class> + <child_name>GnomeEntry:entry</child_name> + <name>aalarm-attach</name> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + </widget> + </widget> + + <widget> + <class>GtkLabel</class> + <name>malarm-group</name> + <visible>False</visible> + <label>FIXME: mail alarm options</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkHBox</class> + <name>palarm-group</name> + <visible>False</visible> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>GtkLabel</class> + <name>label5</name> + <label>Run program:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkEntry</class> + <name>palarm-program</name> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label6</name> + <label>With these arguments:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkEntry</class> + <name>palarm-args</name> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + </widget> + + <widget> + <class>GtkHButtonBox</class> + <name>hbuttonbox1</name> + <layout_style>GTK_BUTTONBOX_END</layout_style> + <spacing>30</spacing> + <child_min_width>85</child_min_width> + <child_min_height>27</child_min_height> + <child_ipad_x>7</child_ipad_x> + <child_ipad_y>0</child_ipad_y> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>GtkButton</class> + <name>button-ok</name> + <can_default>True</can_default> + <has_default>True</has_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> + <relief>GTK_RELIEF_NORMAL</relief> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-cancel</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> + <relief>GTK_RELIEF_NORMAL</relief> + </widget> + </widget> + </widget> +</widget> + +</GTK-Interface> 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 <federico@ximian.com> + * + * 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 <cal-util/cal-component.h> + +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 <widget> <class>GtkButton</class> - <name>button9</name> + <name>button-options</name> <can_focus>True</can_focus> - <label>Settings...</label> + <label>Options...</label> + <relief>GTK_RELIEF_NORMAL</relief> <child> <padding>0</padding> <expand>False</expand> @@ -361,6 +362,7 @@ end of appointment <can_default>True</can_default> <can_focus>True</can_focus> <label>Add</label> + <relief>GTK_RELIEF_NORMAL</relief> </widget> <widget> @@ -369,6 +371,7 @@ end of appointment <can_default>True</can_default> <can_focus>True</can_focus> <label>Delete</label> + <relief>GTK_RELIEF_NORMAL</relief> </widget> </widget> </widget> |