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-week-view.c | 94 ++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 58 deletions(-) (limited to 'calendar/gui/e-week-view.c') diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index 587b0f3e06..fb60e67d3f 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -162,6 +162,7 @@ static void e_week_view_on_editing_stopped (EWeekView *week_view, GnomeCanvasItem *item); static gboolean e_week_view_find_event_from_uid (EWeekView *week_view, const gchar *uid, + const gchar *rid, gint *event_num_return); typedef gboolean (* EWeekViewForeachEventCallback) (EWeekView *week_view, gint event_num, @@ -302,16 +303,6 @@ time_range_changed_cb (ECalModel *model, time_t start_time, time_t end_time, gpo e_week_view_set_selected_time_range (E_CALENDAR_VIEW (week_view), start_time, start_time); } -static gboolean -process_component_recur_cb (ECalComponent *comp, time_t start, time_t end, gpointer data) -{ - AddEventData *add_event_data; - - add_event_data = data; - - return e_week_view_add_event (comp, start, end, FALSE, add_event_data); -} - static void process_component (EWeekView *week_view, ECalModelComponent *comp_data) { @@ -319,7 +310,7 @@ process_component (EWeekView *week_view, ECalModelComponent *comp_data) gint event_num, num_days; ECalComponent *comp = NULL; AddEventData add_event_data; - const char *uid; + const char *uid, *rid; /* If we don't have a valid date set yet, just return. */ if (!g_date_valid (&week_view->first_day_shown)) @@ -334,11 +325,15 @@ process_component (EWeekView *week_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_week_view_find_event_from_uid (week_view, uid, &event_num)) { + if (e_week_view_find_event_from_uid (week_view, uid, rid, &event_num)) { ECalComponent *tmp_comp; event = &g_array_index (week_view->events, EWeekViewEvent, @@ -352,7 +347,8 @@ process_component (EWeekView *week_view, ECalModelComponent *comp_data) #if 0 g_print ("updated object's dates unchanged\n"); #endif - e_week_view_foreach_event_with_uid (week_view, uid, e_week_view_update_event_cb, comp_data); + /* e_week_view_foreach_event_with_uid (week_view, uid, e_week_view_update_event_cb, comp_data); */ + e_week_view_update_event_cb (week_view, event_num, comp_data); g_object_unref (comp); g_object_unref (tmp_comp); gtk_widget_queue_draw (week_view->main_canvas); @@ -364,22 +360,23 @@ process_component (EWeekView *week_view, ECalModelComponent *comp_data) #if 0 g_print ("dates changed - removing occurrences\n"); #endif - e_week_view_foreach_event_with_uid (week_view, uid, - e_week_view_remove_event_cb, - NULL); + e_week_view_remove_event_cb (week_view, event_num, NULL); g_object_unref (tmp_comp); + } else { + if (rid && e_week_view_find_event_from_uid (week_view, uid, NULL, &event_num)) { + event = &g_array_index (week_view->events, EWeekViewEvent, event_num); + if (!e_cal_util_component_is_instance (event->comp_data->icalcomp)) + e_week_view_remove_event_cb (week_view, event_num, NULL); + } } - /* Add the occurrences of the event */ + /* Add the object */ num_days = week_view->multi_week_view ? week_view->weeks_shown * 7 : 7; add_event_data.week_view = week_view; add_event_data.comp_data = comp_data; - e_cal_generate_instances_for_object (comp_data->client, comp_data->icalcomp, - week_view->day_starts[0], - week_view->day_starts[num_days], - process_component_recur_cb, &add_event_data); + e_week_view_add_event (comp, comp_data->instance_start, comp_data->instance_end, FALSE, &add_event_data); g_object_unref (comp); } @@ -444,49 +441,17 @@ model_rows_inserted_cb (ETableModel *etm, int row, int count, gpointer user_data e_week_view_queue_layout (week_view); } -static gboolean -row_deleted_check_cb (EWeekView *week_view, gint event_num, gpointer data) -{ - GHashTable *uids = data; - EWeekViewEvent *event; - ECalModel *model; - const char *uid; - - event = &g_array_index (week_view->events, EWeekViewEvent, event_num); - uid = icalcomponent_get_uid (event->comp_data->icalcomp); - model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_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) -{ - EWeekView *week_view = data; - char *uid = key; - - e_week_view_foreach_event_with_uid (week_view, uid, e_week_view_remove_event_cb, NULL); - g_free(uid); -} - static void model_rows_deleted_cb (ETableModel *etm, int row, int count, gpointer user_data) { EWeekView *week_view = E_WEEK_VIEW (user_data); - GHashTable *uids; + int i; /* FIXME Stop editing? */ - - uids = g_hash_table_new (g_str_hash, g_str_equal); - e_week_view_foreach_event (week_view, row_deleted_check_cb, uids); - g_hash_table_foreach (uids, remove_uid_cb, week_view); + for (i = row + count; i > row; i--) + e_week_view_remove_event_cb (week_view, i - 1, NULL); - g_hash_table_destroy (uids); - gtk_widget_queue_draw (week_view->main_canvas); e_week_view_queue_layout (week_view); } @@ -691,6 +656,7 @@ e_week_view_new (void) GtkWidget *week_view; week_view = GTK_WIDGET (g_object_new (e_week_view_get_type (), NULL)); + e_cal_model_set_flags (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES); return week_view; } @@ -1969,6 +1935,8 @@ e_week_view_remove_event_cb (EWeekView *week_view, gint span_num; event = &g_array_index (week_view->events, EWeekViewEvent, event_num); + if (!event) + return TRUE; /* If we were editing this event, set editing_event_num to -1 so on_editing_stopped doesn't try to update the event. */ @@ -1992,6 +1960,7 @@ e_week_view_remove_event_cb (EWeekView *week_view, } e_cal_model_free_component_data (event->comp_data); + event->comp_data = NULL; g_array_remove_index (week_view->events, event_num); week_view->events_need_layout = TRUE; @@ -3425,6 +3394,7 @@ e_week_view_find_event_from_item (EWeekView *week_view, static gboolean e_week_view_find_event_from_uid (EWeekView *week_view, const gchar *uid, + const gchar *rid, gint *event_num_return) { EWeekViewEvent *event; @@ -3436,13 +3406,21 @@ e_week_view_find_event_from_uid (EWeekView *week_view, num_events = week_view->events->len; for (event_num = 0; event_num < num_events; event_num++) { - const char *u; + const char *u, *r; event = &g_array_index (week_view->events, EWeekViewEvent, event_num); 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; + } + *event_num_return = event_num; return TRUE; } @@ -3780,7 +3758,7 @@ e_week_view_do_key_press (GtkWidget *widget, GdkEventKey *event) e_week_view_check_layout (week_view); gtk_widget_queue_draw (week_view->main_canvas); - if (e_week_view_find_event_from_uid (week_view, uid, &event_num)) { + if (e_week_view_find_event_from_uid (week_view, uid, NULL, &event_num)) { EWeekViewEvent *event; EWeekViewEventSpan *span; -- cgit