diff options
Diffstat (limited to 'calendar/gui/dialogs/event-page.c')
-rw-r--r-- | calendar/gui/dialogs/event-page.c | 110 |
1 files changed, 80 insertions, 30 deletions
diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c index 9c9d88f25b..e723d62fd2 100644 --- a/calendar/gui/dialogs/event-page.c +++ b/calendar/gui/dialogs/event-page.c @@ -872,42 +872,89 @@ event_page_fill_component (CompEditorPage *page, ECalComponent *comp) /* Alarm */ e_cal_component_remove_all_alarms (comp); if (e_dialog_toggle_get (priv->alarm)) { - ECalComponentAlarm *ca; - ECalComponentText summary; - ECalComponentAlarmTrigger trigger; - int alarm_type; - - ca = e_cal_component_alarm_new (); - - e_cal_component_get_summary (comp, &summary); - e_cal_component_alarm_set_description (ca, &summary); + if (is_custom_alarm_store (priv->alarm_list_store, NULL)) { + GtkTreeModel *model; + GtkTreeIter iter; + gboolean valid_iter; + + model = GTK_TREE_MODEL (priv->alarm_list_store); + + for (valid_iter = gtk_tree_model_get_iter_first (model, &iter); valid_iter; + valid_iter = gtk_tree_model_iter_next (model, &iter)) { + ECalComponentAlarm *alarm, *alarm_copy; + icalcomponent *icalcomp; + icalproperty *icalprop; + + alarm = (ECalComponentAlarm *) e_alarm_list_get_alarm (priv->alarm_list_store, &iter); + g_assert (alarm != NULL); + + /* We set the description of the alarm if it's got + * the X-EVOLUTION-NEEDS-DESCRIPTION property. + */ + icalcomp = e_cal_component_alarm_get_icalcomponent (alarm); + icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY); + while (icalprop) { + const char *x_name; + ECalComponentText summary; + + x_name = icalproperty_get_x_name (icalprop); + if (!strcmp (x_name, "X-EVOLUTION-NEEDS-DESCRIPTION")) { + e_cal_component_get_summary (comp, &summary); + e_cal_component_alarm_set_description (alarm, &summary); + + icalcomponent_remove_property (icalcomp, icalprop); + break; + } + + icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY); + } + + /* We clone the alarm to maintain the invariant that the alarm + * structures in the list did *not* come from the component. + */ + + alarm_copy = e_cal_component_alarm_clone (alarm); + e_cal_component_add_alarm (comp, alarm_copy); + e_cal_component_alarm_free (alarm_copy); + } + } else { + ECalComponentAlarm *ca; + ECalComponentText summary; + ECalComponentAlarmTrigger trigger; + int alarm_type; + + ca = e_cal_component_alarm_new (); + + e_cal_component_get_summary (comp, &summary); + e_cal_component_alarm_set_description (ca, &summary); - e_cal_component_alarm_set_action (ca, E_CAL_COMPONENT_ALARM_DISPLAY); + e_cal_component_alarm_set_action (ca, E_CAL_COMPONENT_ALARM_DISPLAY); - memset (&trigger, 0, sizeof (ECalComponentAlarmTrigger)); - trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START; - trigger.u.rel_duration.is_neg = 1; + memset (&trigger, 0, sizeof (ECalComponentAlarmTrigger)); + trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START; + trigger.u.rel_duration.is_neg = 1; - alarm_type = e_dialog_option_menu_get (priv->alarm_time, alarm_map); - switch (alarm_type) { - case ALARM_15_MINUTES: - trigger.u.rel_duration.minutes = 15; - break; + alarm_type = e_dialog_option_menu_get (priv->alarm_time, alarm_map); + switch (alarm_type) { + case ALARM_15_MINUTES: + trigger.u.rel_duration.minutes = 15; + break; - case ALARM_1_HOUR: - trigger.u.rel_duration.hours = 1; - break; + case ALARM_1_HOUR: + trigger.u.rel_duration.hours = 1; + break; - case ALARM_1_DAY: - trigger.u.rel_duration.days = 1; - break; + case ALARM_1_DAY: + trigger.u.rel_duration.days = 1; + break; - default: - break; - } - e_cal_component_alarm_set_trigger (ca, trigger); + default: + break; + } + e_cal_component_alarm_set_trigger (ca, trigger); - e_cal_component_add_alarm (comp, ca); + e_cal_component_add_alarm (comp, ca); + } } return TRUE; @@ -1547,11 +1594,14 @@ alarm_custom_clicked_cb (GtkWidget *widget, gpointer data) { EventPage *epage; EventPagePrivate *priv; + GtkWidget *toplevel; epage = EVENT_PAGE (data); priv = epage->priv; - alarm_list_dialog_run (gtk_widget_get_toplevel (priv->main), COMP_EDITOR_PAGE (epage)->client, priv->alarm_list_store); + toplevel = gtk_widget_get_toplevel (priv->main); + if (alarm_list_dialog_run (toplevel, COMP_EDITOR_PAGE (epage)->client, priv->alarm_list_store)) + comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage)); sensitize_widgets (epage); } |