diff options
-rw-r--r-- | calendar/ChangeLog | 42 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 72 |
2 files changed, 96 insertions, 18 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index f3d8cc9184..2c7594b6df 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,31 +1,37 @@ +2004-08-09 Rodrigo Moya <rodrigo@novell.com> + + * gui/e-calendar-view.c: re-added 'Make this occurrence movable' menu + item, gone by mistake. + (on_unrecur_appointment): new callback for the new menu item. + 2004-08-06 JP Rosevear <jpr@ximian.com> - Fixes #62452 + Fixes #62452 - * gui/e-itip-control.c (find_my_address): take option to retrieve - current status as well, actually look for the delegator in the - list so we can retrieve status there as well - (show_current_event): use find_my_address to get the status so we - properly handle not finding the address in the list of attendees - (show_current): pass extra param - (ok_clicked_cb): ditto + * gui/e-itip-control.c (find_my_address): take option to retrieve + current status as well, actually look for the delegator in the + list so we can retrieve status there as well + (show_current_event): use find_my_address to get the status so we + properly handle not finding the address in the list of attendees + (show_current): pass extra param + (ok_clicked_cb): ditto 2004-08-06 JP Rosevear <jpr@ximian.com> - Fixes #62021 + Fixes #62021 - * gui/dialogs/event-page.c (source_changed_cb): set the default - timezone + * gui/dialogs/event-page.c (source_changed_cb): set the default + timezone - * gui/e-itip-control.c (start_calendar_server): set the default - timezone - - * gui/calendar-component.c (setup_create_ecal): set the default - timezone, as the component view is not alive and hence has not set - it + * gui/e-itip-control.c (start_calendar_server): set the default + timezone + * gui/calendar-component.c (setup_create_ecal): set the default + timezone, as the component view is not alive and hence has not set + it + * gui/tasks-component.c (setup_create_ecal): ditto - + 2004-08-05 Parthasarathi S A <sparthasarathi@novell.com> Fix for bug #61673. diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index 0cb5cb9f3d..c22a4125d4 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -1255,6 +1255,77 @@ on_delete_appointment (GtkWidget *widget, gpointer user_data) } static void +on_unrecur_appointment (GtkWidget *widget, gpointer user_data) +{ + ECalendarView *cal_view; + ECalendarViewEvent *event; + ECalComponent *comp, *new_comp; + ECalComponentDateTime date; + struct icaltimetype itt; + GList *selected; + char *new_uid; + + cal_view = E_CALENDAR_VIEW (user_data); + + selected = e_calendar_view_get_selected_events (cal_view); + if (!selected) + return; + + event = (ECalendarViewEvent *) selected->data; + + date.value = &itt; + date.tzid = NULL; + + /* For the recurring object, we add an exception to get rid of the + instance. */ + + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + cal_comp_util_add_exdate (comp, event->comp_data->instance_start, e_calendar_view_get_timezone (cal_view)); + e_cal_component_commit_sequence (comp); + + /* For the unrecurred instance we duplicate the original object, + create a new uid for it, get rid of the recurrence rules, and set + the start & end times to the instances times. */ + new_comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (new_comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + new_uid = e_cal_component_gen_uid (); + e_cal_component_set_uid (new_comp, new_uid); + g_free (new_uid); + e_cal_component_set_rdate_list (new_comp, NULL); + e_cal_component_set_rrule_list (new_comp, NULL); + e_cal_component_set_exdate_list (new_comp, NULL); + e_cal_component_set_exrule_list (new_comp, NULL); + + date.value = &itt; + date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (cal_view)); + + *date.value = icaltime_from_timet_with_zone (event->comp_data->instance_start, FALSE, + e_calendar_view_get_timezone (cal_view)); + e_cal_component_set_dtstart (new_comp, &date); + *date.value = icaltime_from_timet_with_zone (event->comp_data->instance_end, FALSE, + e_calendar_view_get_timezone (cal_view)); + e_cal_component_set_dtend (new_comp, &date); + e_cal_component_commit_sequence (new_comp); + + /* Now update both ECalComponents. Note that we do this last since at + * present the updates happen synchronously so our event may disappear. + */ + if (!e_cal_modify_object (event->comp_data->client, e_cal_component_get_icalcomponent (comp), CALOBJ_MOD_THIS, NULL)) + g_message ("e_day_view_on_unrecur_appointment(): Could not update the object!"); + + g_object_unref (comp); + + if (!e_cal_create_object (event->comp_data->client, e_cal_component_get_icalcomponent (new_comp), &new_uid, NULL)) + g_message ("e_day_view_on_unrecur_appointment(): Could not update the object!"); + else + g_free (new_uid); + + g_object_unref (new_comp); + g_list_free (selected); +} + +static void on_delete_occurrence (GtkWidget *widget, gpointer user_data) { ECalendarView *cal_view; @@ -1378,6 +1449,7 @@ static EPopupMenu child_items [] = { E_POPUP_SEPARATOR, E_POPUP_ITEM (N_("_Delete"), GTK_SIGNAL_FUNC (on_delete_appointment), MASK_EDITABLE | MASK_SINGLE | MASK_EDITING), + E_POPUP_ITEM (N_("Make this Occurrence _Movable"), GTK_SIGNAL_FUNC (on_unrecur_appointment), MASK_EDITABLE | MASK_RECURRING | MASK_EDITING | MASK_INSTANCE), E_POPUP_ITEM (N_("Delete this _Occurrence"), GTK_SIGNAL_FUNC (on_delete_occurrence), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE), E_POPUP_ITEM (N_("Delete _All Occurrences"), GTK_SIGNAL_FUNC (on_delete_appointment), MASK_RECURRING | MASK_EDITING | MASK_EDITABLE), |