From 5b3791bb89c449b143691a7cb79ea89549adeff1 Mon Sep 17 00:00:00 2001 From: Rodrigo Moya Date: Tue, 21 Dec 2004 16:52:00 +0000 Subject: Merge from recurrences-work-branch 2004-12-21 Rodrigo Moya Merge from recurrences-work-branch * gui/e-cal-model.c (free_comp_data): renamed to e_cal_model_free_component_data and made it public. (clear_objects_array, e_cal_view_objects_removed_cb, remove_client_objects): use e_cal_model_free_component_data. (get_dtstart): get the DTSTART correctly for recurrences. (add_instance_cb): initialize all members of ECalModelComponent, and use the correct icalcomponent when setting the field. (set_instance_times): new function to set the instance_* fields of the ECalModelComponent when not expanding recurrences. (e_cal_view_objects_added_cb): expand recurrences for all objects when the model is set to expand. Call set_instance_times when not expanding recurrences. (e_cal_view_objects_modified_cb): made it remove objects and re-add them. (copy_ecdv): check values before using them. (e_cal_model_copy_component_data): Added code to copy the instance_* and color fields. * gui/e-cal-model-calendar.c (get_dtend): get the DTEND correctly for recurrences. (ecmc_set_value_at): ask user which instances to modify. * gui/e-day-view.c (e_day_view_find_event_from_uid): changed to search by UID and RID if given. (process_component): changed to not expand recurrences at all, this is now done on the model. (row_deleted_check_cb, remove_uid_cb): removed these functions. (model_rows_deleted_cb): changed to just remove the rows signalled from the model, which is the responsible for the recurrence expansion. (e_day_view_new): set the model to expand recurrences. (e_day_view_remove_event_cb): check the value searched in the array. (e_day_view_do_key_press): use e_day_view_find_event_from_uid correctly. * gui/e-week-view.c (e_week_view_find_event_from_uid): changed to search by UID and RID if given. (process_component_recur_cb): removed. (process_component): changed to not expand recurrences at all, this is now done on the model. (row_deleted_check_cb, remove_uid_cb): removed these functions. (model_rows_deleted_cb): changed to just remove the rows signalled from the model, which is the responsible for the recurrence expansion. (e_week_view_new): set the model to expand recurrences. (e_week_view_remove_event_cb): check the value searched in the array. Set the ECalModelComponent field to NULL after freeing it. (e_week_view_do_key_press): use e_week_view_find_event_from_uid correctly. * gui/dialogs/recur-comp.c (recur_component_dialog): remove the RECURRENCE-ID from the object when modifying all instances. svn path=/trunk/; revision=28166 --- calendar/gui/e-day-view.c | 111 ++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 53 deletions(-) (limited to 'calendar/gui/e-day-view.c') diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 970fe8a325..78f8cfc9b4 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -286,6 +286,7 @@ static ECalendarViewPosition e_day_view_convert_position_in_main_canvas (EDayVie gint *event_num_return); static gboolean e_day_view_find_event_from_uid (EDayView *day_view, const gchar *uid, + const gchar *rid, gint *day_return, gint *event_num_return); @@ -507,7 +508,7 @@ process_component (EDayView *day_view, ECalModelComponent *comp_data) { EDayViewEvent *event; gint day, event_num; - const char *uid; + const char *uid, *rid; ECalComponent *comp; AddEventData add_event_data; @@ -524,11 +525,15 @@ process_component (EDayView *day_view, ECalModelComponent *comp_data) } e_cal_component_get_uid (comp, &uid); + if (e_cal_component_is_instance (comp)) + rid = e_cal_component_get_recurid_as_string (comp); + else + rid = NULL; /* If the event already exists and the dates didn't change, we can update the event fairly easily without changing the events arrays or computing a new layout. */ - if (e_day_view_find_event_from_uid (day_view, uid, &day, &event_num)) { + if (e_day_view_find_event_from_uid (day_view, uid, rid, &day, &event_num)) { ECalComponent *tmp_comp; if (day == E_DAY_VIEW_LONG_EVENT) @@ -546,7 +551,8 @@ process_component (EDayView *day_view, ECalModelComponent *comp_data) #if 0 g_print ("updated object's dates unchanged\n"); #endif - e_day_view_foreach_event_with_uid (day_view, uid, e_day_view_update_event_cb, comp_data); + /* e_day_view_foreach_event_with_uid (day_view, uid, e_day_view_update_event_cb, comp_data); */ + e_day_view_update_event_cb (day_view, day, event_num, comp_data); gtk_widget_queue_draw (day_view->top_canvas); gtk_widget_queue_draw (day_view->main_canvas); return; @@ -557,19 +563,25 @@ process_component (EDayView *day_view, ECalModelComponent *comp_data) #if 0 g_print ("dates changed - removing occurrences\n"); #endif - e_day_view_foreach_event_with_uid (day_view, uid, - e_day_view_remove_event_cb, - NULL); + e_day_view_remove_event_cb (day_view, day, event_num, NULL); g_object_unref (tmp_comp); + } else { + if (rid && e_day_view_find_event_from_uid (day_view, uid, NULL, &day, &event_num)) { + if (day == E_DAY_VIEW_LONG_EVENT) + event = &g_array_index (day_view->long_events, EDayViewEvent, event_num); + else + event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); + + if (!e_cal_util_component_is_instance (event->comp_data->icalcomp)) + e_day_view_remove_event_cb (day_view, day, event_num, NULL); + } } - /* Add the occurrences of the event */ + /* Add the object */ add_event_data.day_view = day_view; add_event_data.comp_data = comp_data; - e_cal_generate_instances_for_object (comp_data->client, comp_data->icalcomp, day_view->lower, - day_view->upper, - e_day_view_add_event, &add_event_data); + e_day_view_add_event (comp, comp_data->instance_start, comp_data->instance_end, &add_event_data); g_object_unref (comp); } @@ -640,55 +652,35 @@ model_rows_inserted_cb (ETableModel *etm, int row, int count, gpointer user_data } -static gboolean -row_deleted_check_cb (EDayView *day_view, gint day, gint event_num, gpointer data) -{ - GHashTable *uids = data; - EDayViewEvent *event; - ECalModel *model; - const char *uid; - - if (day == E_DAY_VIEW_LONG_EVENT) { - event = &g_array_index (day_view->long_events, EDayViewEvent, - event_num); - } else { - event = &g_array_index (day_view->events[day], EDayViewEvent, - event_num); - } - - uid = icalcomponent_get_uid (event->comp_data->icalcomp); - model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)); - - if (!e_cal_model_get_component_for_uid (model, uid)) - g_hash_table_insert (uids, g_strdup(uid), GINT_TO_POINTER (1)); - - return TRUE; -} - -static void -remove_uid_cb (gpointer key, gpointer value, gpointer data) -{ - EDayView *day_view = data; - char *uid = key; - - e_day_view_foreach_event_with_uid (day_view, uid, e_day_view_remove_event_cb, NULL); - g_free(uid); -} - static void model_rows_deleted_cb (ETableModel *etm, int row, int count, gpointer user_data) { EDayView *day_view = E_DAY_VIEW (user_data); - GHashTable *uids; + int i; e_day_view_stop_editing_event (day_view); - uids = g_hash_table_new (g_str_hash, g_str_equal); - - e_day_view_foreach_event (day_view, row_deleted_check_cb, uids); - g_hash_table_foreach (uids, remove_uid_cb, day_view); + for (i = row + count; i > row; i--) { + gint day, event_num; + const char *uid, *rid = NULL; + ECalModelComponent *comp_data; - g_hash_table_destroy (uids); + comp_data = e_cal_model_get_component_at (E_CAL_MODEL (etm), i - 1); + if (!comp_data) + continue; + + uid = icalcomponent_get_uid (comp_data->icalcomp); + if (e_cal_util_component_is_instance (comp_data->icalcomp)) { + icalproperty *prop; + + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_RECURRENCEID_PROPERTY); + if (prop) + rid = icaltime_as_ical_string (icalcomponent_get_recurrenceid (comp_data->icalcomp)); + } + + if (e_day_view_find_event_from_uid (day_view, uid, rid, &day, &event_num)) + e_day_view_remove_event_cb (day_view, day, event_num, NULL); + } gtk_widget_queue_draw (day_view->top_canvas); gtk_widget_queue_draw (day_view->main_canvas); @@ -1080,6 +1072,7 @@ e_day_view_new (void) GObject *day_view; day_view = g_object_new (e_day_view_get_type (), NULL); + e_cal_model_set_flags (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES); return GTK_WIDGET (day_view); } @@ -1778,6 +1771,9 @@ e_day_view_remove_event_cb (EDayView *day_view, event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); + if (!event) + return TRUE; + /* If we were editing this event, set editing_event_day to -1 so on_editing_stopped doesn't try to update the event. */ if (day_view->editing_event_day == day @@ -1970,12 +1966,13 @@ e_day_view_find_event_from_item (EDayView *day_view, static gboolean e_day_view_find_event_from_uid (EDayView *day_view, const gchar *uid, + const gchar *rid, gint *day_return, gint *event_num_return) { EDayViewEvent *event; gint day, event_num; - const char *u; + const char *u, *r; if (!uid) return FALSE; @@ -1988,6 +1985,14 @@ e_day_view_find_event_from_uid (EDayView *day_view, u = icalcomponent_get_uid (event->comp_data->icalcomp); if (u && !strcmp (uid, u)) { + if (rid && *rid) { + r = icaltime_as_ical_string (icalcomponent_get_recurrenceid (event->comp_data->icalcomp)); + if (!r || !*r) + continue; + if (strcmp (rid, r) != 0) + continue; + } + *day_return = day; *event_num_return = event_num; return TRUE; @@ -4866,7 +4871,7 @@ e_day_view_do_key_press (GtkWidget *widget, GdkEventKey *event) gtk_widget_queue_draw (day_view->top_canvas); gtk_widget_queue_draw (day_view->main_canvas); - if (e_day_view_find_event_from_uid (day_view, uid, &day, &event_num)) { + if (e_day_view_find_event_from_uid (day_view, uid, NULL, &day, &event_num)) { e_day_view_start_editing_event (day_view, day, event_num, initial_text); } else { -- cgit v1.2.3