aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-day-view.c
diff options
context:
space:
mode:
authorRodrigo Moya <rodrigo@novell.com>2004-12-22 00:52:00 +0800
committerRodrigo Moya <rodrigo@src.gnome.org>2004-12-22 00:52:00 +0800
commit5b3791bb89c449b143691a7cb79ea89549adeff1 (patch)
tree8a878f66dbbc784a8211d9e6b2e73b22ae8e83c5 /calendar/gui/e-day-view.c
parent3b74f2348e60711c0141ac9888efd9a9973db34b (diff)
downloadgsoc2013-evolution-5b3791bb89c449b143691a7cb79ea89549adeff1.tar.gz
gsoc2013-evolution-5b3791bb89c449b143691a7cb79ea89549adeff1.tar.zst
gsoc2013-evolution-5b3791bb89c449b143691a7cb79ea89549adeff1.zip
Merge from recurrences-work-branch
2004-12-21 Rodrigo Moya <rodrigo@novell.com> 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
Diffstat (limited to 'calendar/gui/e-day-view.c')
-rw-r--r--calendar/gui/e-day-view.c111
1 files changed, 58 insertions, 53 deletions
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 {