[evolution/wip/webkit2] Bug 752637 - Delete single instance of recurring event deletes all instances
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/wip/webkit2] Bug 752637 - Delete single instance of recurring event deletes all instances
- Date: Fri, 26 Feb 2016 11:19:37 +0000 (UTC)
commit 6ad04673d2a50b89d87ce744e52ce22779123027
Author: Milan Crha <mcrha redhat com>
Date: Tue Jul 21 10:36:15 2015 +0200
Bug 752637 - Delete single instance of recurring event deletes all instances
calendar/gui/e-calendar-view.c | 66 ++++++++++++++++++++++++++++++++++-----
1 files changed, 57 insertions(+), 9 deletions(-)
---
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index 4bd36cc..402ff40 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -158,7 +158,8 @@ calendar_view_check_for_retract (ECalComponent *comp,
static void
calendar_view_delete_event (ECalendarView *cal_view,
- ECalendarViewEvent *event)
+ ECalendarViewEvent *event,
+ gboolean only_occurrence)
{
ECalModel *model;
ECalComponent *comp;
@@ -177,7 +178,7 @@ calendar_view_delete_event (ECalendarView *cal_view,
vtype = e_cal_component_get_vtype (comp);
/*FIXME remove it once the we dont set the recurrence id for all the generated instances */
- if (!e_cal_client_check_recurrences_no_master (event->comp_data->client))
+ if (!only_occurrence && !e_cal_client_check_recurrences_no_master (event->comp_data->client))
e_cal_component_set_recurid (comp, NULL);
/*FIXME Retract should be moved to Groupwise features plugin */
@@ -201,25 +202,72 @@ calendar_view_delete_event (ECalendarView *cal_view,
if (delete) {
const gchar *uid;
- gchar *rid = NULL;
+ gchar *rid;
+
+ rid = e_cal_component_get_recurid_as_string (comp);
if ((itip_organizer_is_user (registry, comp, event->comp_data->client) ||
itip_sentby_is_user (registry, comp, event->comp_data->client))
&& cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
event->comp_data->client,
- comp, TRUE))
+ comp, TRUE)) {
+ if (only_occurrence && !e_cal_component_is_instance (comp)) {
+ ECalComponentRange range;
+
+ /* set the recurrence ID of the object we send */
+ range.type = E_CAL_COMPONENT_RANGE_SINGLE;
+ e_cal_component_get_dtstart (comp, &range.datetime);
+ range.datetime.value->is_date = 1;
+ e_cal_component_set_recurid (comp, &range);
+
+ e_cal_component_free_datetime (&range.datetime);
+ }
+
itip_send_component (model, E_CAL_COMPONENT_METHOD_CANCEL,
comp, event->comp_data->client, NULL, NULL,
NULL, TRUE, FALSE, FALSE);
+ }
e_cal_component_get_uid (comp, &uid);
if (!uid || !*uid) {
g_object_unref (comp);
+ g_free (rid);
return;
}
- rid = e_cal_component_get_recurid_as_string (comp);
- if (e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
- e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
+
+ if (only_occurrence) {
+ if (e_cal_component_is_instance (comp)) {
+ e_cal_ops_remove_component (model, event->comp_data->client, uid, rid,
E_CAL_OBJ_MOD_THIS, FALSE);
+ } else {
+ struct icaltimetype instance_rid;
+ ECalComponentDateTime dt;
+ icaltimezone *zone = NULL;
+
+ e_cal_component_get_dtstart (comp, &dt);
+
+ if (dt.tzid) {
+ GError *local_error = NULL;
+
+ e_cal_client_get_timezone_sync (event->comp_data->client, dt.tzid,
&zone, NULL, &local_error);
+ if (local_error != NULL) {
+ zone = e_calendar_view_get_timezone (cal_view);
+ g_clear_error (&local_error);
+ }
+ } else {
+ zone = e_calendar_view_get_timezone (cal_view);
+ }
+
+ e_cal_component_free_datetime (&dt);
+
+ instance_rid = icaltime_from_timet_with_zone (
+ event->comp_data->instance_start,
+ TRUE, zone ? zone : icaltimezone_get_utc_timezone ());
+ e_cal_util_remove_instances (event->comp_data->icalcomp, instance_rid,
E_CAL_OBJ_MOD_THIS);
+ e_cal_ops_modify_component (model, event->comp_data->client,
event->comp_data->icalcomp,
+ E_CAL_OBJ_MOD_THIS, E_CAL_OPS_SEND_FLAG_DONT_SEND);
+ }
+ } else if (e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
+ e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
e_cal_ops_remove_component (model, event->comp_data->client, uid, rid,
E_CAL_OBJ_MOD_ALL, FALSE);
else
e_cal_ops_remove_component (model, event->comp_data->client, uid, NULL,
E_CAL_OBJ_MOD_THIS, FALSE);
@@ -1012,7 +1060,7 @@ calendar_view_delete_selection (ESelectable *selectable)
if (event == NULL)
continue;
- calendar_view_delete_event (cal_view, event);
+ calendar_view_delete_event (cal_view, event, FALSE);
}
g_list_free (selected);
@@ -1395,7 +1443,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
event = (ECalendarViewEvent *) selected->data;
if (is_comp_data_valid (event)) {
- calendar_view_delete_event (cal_view, event);
+ calendar_view_delete_event (cal_view, event, TRUE);
}
g_list_free (selected);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]