From ab00f5b08adb1d74a0c70d935a32ffd982e86f34 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 21 Jan 2009 02:52:05 +0000 Subject: Merge revisions 37075:37107 from trunk. svn path=/branches/kill-bonobo/; revision=37112 --- plugins/itip-formatter/ChangeLog | 18 +++++++ plugins/itip-formatter/itip-formatter.c | 84 +++++++++++++++++++++++++++++---- plugins/itip-formatter/itip-view.c | 77 +++++++++++++++++++++++++++++- plugins/itip-formatter/itip-view.h | 6 +++ 4 files changed, 174 insertions(+), 11 deletions(-) (limited to 'plugins/itip-formatter') diff --git a/plugins/itip-formatter/ChangeLog b/plugins/itip-formatter/ChangeLog index c04825312f..874875d906 100644 --- a/plugins/itip-formatter/ChangeLog +++ b/plugins/itip-formatter/ChangeLog @@ -1,3 +1,21 @@ +2009-01-19 Milan Crha + + ** Fix for bug #225712 + + * itip-view.h: + * itip-view.c: (itip_view_set_show_keep_alarm_check), + (itip_view_get_keep_alarm_check_state), + (itip_view_set_show_inherit_alarm_check), + (itip_view_get_inherit_alarm_check_state): New functions to new + options to either inherit reminder from the incoming event or to + preserve users reminders in already existing event in the calendar. + * itip-view.c: (struct _ItipViewPrivate), (alarm_check_toggled_cb), + (itip_view_init): Properly initialize new option's members. + * itip-formatter.c: (find_cal_opened_cb), (update_item), + (send_comp_to_attendee), (update_attendee_status), (send_item), + (extract_itip_data), (view_response_cb), (format_itip_object): + Setup new options based on the actual data. + 2008-11-28 Suman Manjunath ** Fix for bug #561467 diff --git a/plugins/itip-formatter/itip-formatter.c b/plugins/itip-formatter/itip-formatter.c index 61d2234bd8..83ea0036fb 100644 --- a/plugins/itip-formatter/itip-formatter.c +++ b/plugins/itip-formatter/itip-formatter.c @@ -630,6 +630,16 @@ find_cal_opened_cb (ECal *ecal, ECalendarStatus status, gpointer data) if (!pitip->current_ecal && e_cal_get_object (ecal, fd->uid, fd->rid, &icalcomp, NULL)) { + if ((pitip->method == ICAL_METHOD_PUBLISH || pitip->method == ICAL_METHOD_REQUEST) && + (icalcomponent_get_first_component (icalcomp, ICAL_VALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XAUDIOALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XDISPLAYALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XPROCEDUREALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XEMAILALARM_COMPONENT))) + itip_view_set_show_keep_alarm_check (ITIP_VIEW (pitip->view), TRUE); + else + itip_view_set_show_keep_alarm_check (ITIP_VIEW (pitip->view), FALSE); + icalcomponent_free (icalcomp); pitip->current_ecal = ecal; @@ -652,7 +662,8 @@ find_cal_opened_cb (ECal *ecal, ECalendarStatus status, gpointer data) _("Found the appointment in the calendar '%s'"), e_source_peek_name (source)); set_buttons_sensitive (pitip); - } + } else if (!pitip->current_ecal) + itip_view_set_show_keep_alarm_check (ITIP_VIEW (pitip->view), FALSE); if (pitip->current_ecal) { if (e_cal_get_static_capability (pitip->current_ecal, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) { @@ -991,6 +1002,19 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response) icalcomponent_add_component (pitip->top_level, clone); icalcomponent_set_method (pitip->top_level, pitip->method); + if (!itip_view_get_inherit_alarm_check_state (ITIP_VIEW (pitip->view))) { + icalcomponent *alarm_comp; + icalcompiter alarm_iter; + + alarm_iter = icalcomponent_begin_component (clone, ICAL_VALARM_COMPONENT); + while ((alarm_comp = icalcompiter_deref (&alarm_iter)) != NULL) { + icalcompiter_next (&alarm_iter); + + icalcomponent_remove_component (clone, alarm_comp); + icalcomponent_free (alarm_comp); + } + } + clone_comp = e_cal_component_new (); if (!e_cal_component_set_icalcomponent (clone_comp, clone)) { itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_ERROR, _("Unable to parse item")); @@ -999,6 +1023,35 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response) } source = e_cal_get_source (pitip->current_ecal); + if (itip_view_get_keep_alarm_check_state (ITIP_VIEW (pitip->view))) { + ECalComponent *real_comp; + GList *alarms, *l; + ECalComponentAlarm *alarm; + + real_comp = get_real_item (pitip); + if (real_comp != NULL) { + alarms = e_cal_component_get_alarm_uids (real_comp); + + for (l = alarms; l; l = l->next) { + alarm = e_cal_component_get_alarm (real_comp, (const char *)l->data); + + if (alarm) { + ECalComponentAlarm *aclone = e_cal_component_alarm_clone (alarm); + + if (aclone) { + e_cal_component_add_alarm (clone_comp, aclone); + e_cal_component_alarm_free (aclone); + } + + e_cal_component_alarm_free (alarm); + } + } + + cal_obj_uid_list_free (alarms); + g_object_unref (real_comp); + } + } + if ((response != ITIP_VIEW_RESPONSE_CANCEL) && (response != ITIP_VIEW_RESPONSE_DECLINE)){ GSList *attachments = NULL, *new_attachments = NULL, *l; @@ -1160,7 +1213,7 @@ send_comp_to_attendee (ECalComponentItipMethod method, ECalComponent *comp, cons } /* FIXME send the attachments in the request */ - status = itip_send_comp (method, send_comp, client, NULL, NULL, NULL); + status = itip_send_comp (method, send_comp, client, NULL, NULL, NULL, TRUE); g_object_unref (send_comp); @@ -1310,7 +1363,7 @@ update_attendee_status (struct _itip_puri *pitip) if (itip_view_get_update (ITIP_VIEW (pitip->view))) { e_cal_component_commit_sequence (comp); - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL, TRUE); } if (!e_cal_modify_object (pitip->current_ecal, icalcomp, rid ? CALOBJ_MOD_THIS : CALOBJ_MOD_ALL, &error)) { @@ -1340,7 +1393,7 @@ send_item (struct _itip_puri *pitip) comp = get_real_item (pitip); if (comp != NULL) { - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL, TRUE); g_object_unref (comp); switch (pitip->type) { @@ -1421,7 +1474,7 @@ set_itip_error (struct _itip_puri *pitip, GtkContainer *container, const char *p } static gboolean -extract_itip_data (struct _itip_puri *pitip, GtkContainer *container) +extract_itip_data (struct _itip_puri *pitip, GtkContainer *container, gboolean *have_alarms) { icalproperty *prop; icalcomponent_kind kind = ICAL_NO_COMPONENT; @@ -1581,14 +1634,24 @@ extract_itip_data (struct _itip_puri *pitip, GtkContainer *container) prop = icalcomponent_get_next_property (pitip->ical_comp, ICAL_X_PROPERTY); } - /* Strip out alarms for security purposes */ + /* Strip out procedural alarms for security purposes */ alarm_iter = icalcomponent_begin_component (pitip->ical_comp, ICAL_VALARM_COMPONENT); while ((alarm_comp = icalcompiter_deref (&alarm_iter)) != NULL) { + icalproperty *p; + icalcompiter_next (&alarm_iter); - icalcomponent_remove_component (pitip->ical_comp, alarm_comp); + p = icalcomponent_get_first_property (alarm_comp, ICAL_ACTION_PROPERTY); + if (icalproperty_get_action (p) == ICAL_ACTION_PROCEDURE) + icalcomponent_remove_component (pitip->ical_comp, alarm_comp); + icalcomponent_free (alarm_comp); } + + if (have_alarms) { + alarm_iter = icalcomponent_begin_component (pitip->ical_comp, ICAL_VALARM_COMPONENT); + *have_alarms = icalcompiter_deref (&alarm_iter) != NULL; + } } pitip->comp = e_cal_component_new (); @@ -1911,7 +1974,7 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) } e_cal_component_rescan (comp); - if (itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, pitip->current_ecal, pitip->top_level, NULL, NULL)) { + if (itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, pitip->current_ecal, pitip->top_level, NULL, NULL, TRUE)) { camel_folder_set_message_flags (pitip->folder, pitip->uid, CAMEL_MESSAGE_ANSWERED, CAMEL_MESSAGE_ANSWERED); } @@ -1974,6 +2037,7 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject const char *string, *org; int i; gboolean response_enabled; + gboolean have_alarms = FALSE; info = (struct _itip_puri *) em_format_find_puri((EMFormat *)efh, pobject->classid); @@ -1991,7 +2055,7 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject } /* FIXME Handle multiple VEVENTS with the same UID, ie detached instances */ - if (!extract_itip_data (info, GTK_CONTAINER (eb))) + if (!extract_itip_data (info, GTK_CONTAINER (eb), &have_alarms)) return TRUE; info->view = itip_view_new (); @@ -2003,6 +2067,8 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject if (!response_enabled) { itip_view_set_mode (ITIP_VIEW (info->view), ITIP_VIEW_MODE_HIDE_ALL); } else { + itip_view_set_show_inherit_alarm_check (ITIP_VIEW (info->view), have_alarms && (info->method == ICAL_METHOD_PUBLISH || info->method == ICAL_METHOD_REQUEST)); + switch (info->method) { case ICAL_METHOD_PUBLISH: case ICAL_METHOD_REQUEST: diff --git a/plugins/itip-formatter/itip-view.c b/plugins/itip-formatter/itip-view.c index 92a8460e48..8c36da53d3 100644 --- a/plugins/itip-formatter/itip-view.c +++ b/plugins/itip-formatter/itip-view.c @@ -121,6 +121,8 @@ struct _ItipViewPrivate { GtkWidget *options_box; GtkWidget *free_time_check; + GtkWidget *keep_alarm_check; + GtkWidget *inherit_alarm_check; GtkWidget *button_box; gboolean buttons_sensitive; @@ -947,6 +949,18 @@ recur_toggled_cb (GtkWidget *widget, gpointer data) itip_view_set_mode (view, priv->mode); } +/* + alarm_check_toggled_cb + check1 was changed, so make the second available based on state of the first check. +*/ +static void +alarm_check_toggled_cb (GtkWidget *check1, GtkWidget *check2) +{ + g_return_if_fail (check1 != NULL); + g_return_if_fail (check2 != NULL); + + gtk_widget_set_sensitive (check2, !(GTK_WIDGET_VISIBLE (check1) && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check1)))); +} static void itip_view_init (ItipView *view) @@ -1119,6 +1133,17 @@ itip_view_init (ItipView *view) priv->free_time_check = gtk_check_button_new_with_mnemonic (_("Show time as _free")); gtk_box_pack_start (GTK_BOX (priv->options_box), priv->free_time_check, FALSE, FALSE, 0); + priv->keep_alarm_check = gtk_check_button_new_with_mnemonic (_("_Preserve my reminder")); + /* default value is to keep user's alarms */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view->priv->keep_alarm_check), TRUE); + gtk_box_pack_start (GTK_BOX (priv->options_box), priv->keep_alarm_check, FALSE, FALSE, 0); + + priv->inherit_alarm_check = gtk_check_button_new_with_mnemonic (_("_Inherit reminder")); + gtk_box_pack_start (GTK_BOX (priv->options_box), priv->inherit_alarm_check, FALSE, FALSE, 0); + + g_signal_connect (priv->keep_alarm_check, "toggled", G_CALLBACK (alarm_check_toggled_cb), priv->inherit_alarm_check); + g_signal_connect (priv->inherit_alarm_check, "toggled", G_CALLBACK (alarm_check_toggled_cb), priv->keep_alarm_check); + /* The buttons for actions */ priv->button_box = gtk_hbutton_box_new (); gtk_button_box_set_layout (GTK_BUTTON_BOX (priv->button_box), GTK_BUTTONBOX_START); @@ -2118,7 +2143,7 @@ itip_view_set_show_recur_check (ItipView *view, gboolean show) if (show) gtk_widget_show (view->priv->recur_check); - else { + else { gtk_widget_hide (view->priv->recur_check); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view->priv->recur_check), FALSE); } @@ -2132,7 +2157,7 @@ itip_view_set_show_free_time_check (ItipView *view, gboolean show) if (show) gtk_widget_show (view->priv->free_time_check); - else { + else { gtk_widget_hide (view->priv->free_time_check); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view->priv->free_time_check), FALSE); } @@ -2145,3 +2170,51 @@ itip_view_get_free_time_check_state (ItipView *view) return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (view->priv->free_time_check)); } + +void +itip_view_set_show_keep_alarm_check (ItipView *view, gboolean show) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (ITIP_IS_VIEW (view)); + + if (show) + gtk_widget_show (view->priv->keep_alarm_check); + else + gtk_widget_hide (view->priv->keep_alarm_check); + + /* and update state of the second check */ + alarm_check_toggled_cb (view->priv->keep_alarm_check, view->priv->inherit_alarm_check); +} + +gboolean +itip_view_get_keep_alarm_check_state (ItipView *view) +{ + g_return_val_if_fail (view != NULL, FALSE); + + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (view->priv->keep_alarm_check)); +} + +void +itip_view_set_show_inherit_alarm_check (ItipView *view, gboolean show) +{ + g_return_if_fail (view != NULL); + g_return_if_fail (ITIP_IS_VIEW (view)); + + if (show) + gtk_widget_show (view->priv->inherit_alarm_check); + else { + gtk_widget_hide (view->priv->inherit_alarm_check); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view->priv->inherit_alarm_check), FALSE); + } + + /* and update state of the second check */ + alarm_check_toggled_cb (view->priv->inherit_alarm_check, view->priv->keep_alarm_check); +} + +gboolean +itip_view_get_inherit_alarm_check_state (ItipView *view) +{ + g_return_val_if_fail (view != NULL, FALSE); + + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (view->priv->inherit_alarm_check)); +} diff --git a/plugins/itip-formatter/itip-view.h b/plugins/itip-formatter/itip-view.h index f810f1f074..736119ae04 100644 --- a/plugins/itip-formatter/itip-view.h +++ b/plugins/itip-formatter/itip-view.h @@ -180,6 +180,12 @@ void itip_view_set_needs_decline (ItipView *view, gboolean needs_decline); void itip_view_set_show_free_time_check (ItipView *view, gboolean show); gboolean itip_view_get_free_time_check_state (ItipView *view); +void itip_view_set_show_keep_alarm_check (ItipView *view, gboolean show); +gboolean itip_view_get_keep_alarm_check_state (ItipView *view); + +void itip_view_set_show_inherit_alarm_check (ItipView *view, gboolean show); +gboolean itip_view_get_inherit_alarm_check_state (ItipView *view); + G_END_DECLS #endif -- cgit v1.2.3