aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-day-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-day-view.c')
-rw-r--r--calendar/gui/e-day-view.c126
1 files changed, 84 insertions, 42 deletions
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 25b026407e..6fa0ad17c1 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -263,9 +263,6 @@ static void e_day_view_on_editing_started (EDayView *day_view,
static void e_day_view_on_editing_stopped (EDayView *day_view,
GnomeCanvasItem *item);
-static void e_day_view_get_selection_range (EDayView *day_view,
- time_t *start,
- time_t *end);
static time_t e_day_view_convert_grid_position_to_time (EDayView *day_view,
gint col,
gint row);
@@ -1102,7 +1099,8 @@ e_day_view_update_event (EDayView *day_view,
g_return_if_fail (E_IS_DAY_VIEW (day_view));
#if 0
- g_print ("In e_day_view_update_event\n");
+ g_print ("In e_day_view_update_event day_view:%p uid:%s\n",
+ day_view, uid);
#endif
/* If our calendar or time hasn't been set yet, just return. */
@@ -1258,6 +1256,11 @@ e_day_view_remove_event (EDayView *day_view,
{
g_return_if_fail (E_IS_DAY_VIEW (day_view));
+#if 0
+ g_print ("In e_day_view_remove_event day_view:%p uid:%s\n",
+ day_view, uid);
+#endif
+
e_day_view_foreach_event_with_uid (day_view, uid,
e_day_view_remove_event_cb, NULL);
@@ -1527,6 +1530,39 @@ e_day_view_set_selected_time_range (EDayView *day_view,
}
+/* Returns the selected time range. */
+void
+e_day_view_get_selected_time_range (EDayView *day_view,
+ time_t *start_time,
+ time_t *end_time)
+{
+ gint start_col, start_row, end_col, end_row;
+
+ start_col = day_view->selection_start_col;
+ start_row = day_view->selection_start_row;
+ end_col = day_view->selection_end_col;
+ end_row = day_view->selection_end_row;
+
+ if (start_col == -1) {
+ start_col = 0;
+ start_row = 0;
+ end_col = 0;
+ end_row = 0;
+ }
+
+ /* Check if the selection is only in the top canvas, in which case
+ we can simply use the day_starts array. */
+ if (day_view->selection_in_top_canvas) {
+ *start_time = day_view->day_starts[start_col];
+ *end_time = day_view->day_starts[end_col + 1];
+ } else {
+ /* Convert the start col + row into a time. */
+ *start_time = e_day_view_convert_grid_position_to_time (day_view, start_col, start_row);
+ *end_time = e_day_view_convert_grid_position_to_time (day_view, end_col, end_row + 1);
+ }
+}
+
+
static void
e_day_view_recalc_day_starts (EDayView *day_view,
time_t start_time)
@@ -2254,7 +2290,8 @@ e_day_view_on_new_appointment (GtkWidget *widget, gpointer data)
ico = ical_new ("", user_name, "");
ico->new = 1;
- e_day_view_get_selection_range (day_view, &ico->dtstart, &ico->dtend);
+ e_day_view_get_selected_time_range (day_view, &ico->dtstart,
+ &ico->dtend);
event_editor = event_editor_new (day_view->calendar, ico);
gtk_widget_show (event_editor);
}
@@ -2326,6 +2363,7 @@ e_day_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
return;
/* New object */
+ /* FIXME: generate a new uid. */
ico = ical_object_duplicate (event->ico);
g_free (ico->recur);
ico->recur = 0;
@@ -2414,7 +2452,7 @@ e_day_view_update_calendar_selection_time (EDayView *day_view)
{
time_t start, end;
- e_day_view_get_selection_range (day_view, &start, &end);
+ e_day_view_get_selected_time_range (day_view, &start, &end);
gnome_calendar_set_selected_time_range (day_view->calendar,
start, end);
}
@@ -2726,15 +2764,21 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
{
EDayViewEvent *event;
gint event_num;
+ iCalObject ico;
event_num = day_view->resize_event_num;
event = &g_array_index (day_view->long_events, EDayViewEvent,
event_num);
+ /* We use a temporary shallow copy of the ico since we don't want to
+ change the original ico here. Otherwise we would not detect that
+ the event's time had changed in the "update_event" callback. */
+ ico = *event->ico;
+
if (day_view->resize_drag_pos == E_DAY_VIEW_POS_LEFT_EDGE) {
- event->ico->dtstart = day_view->day_starts[day_view->resize_start_row];
+ ico.dtstart = day_view->day_starts[day_view->resize_start_row];
} else {
- event->ico->dtend = day_view->day_starts[day_view->resize_end_row + 1];
+ ico.dtend = day_view->day_starts[day_view->resize_end_row + 1];
}
gnome_canvas_item_hide (day_view->resize_long_event_rect_item);
@@ -2742,8 +2786,7 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
day_view->resize_drag_pos = E_DAY_VIEW_POS_NONE;
/* Notify calendar of change */
- gnome_calendar_object_changed (day_view->calendar, event->ico,
- CHANGE_DATES);
+ gnome_calendar_object_changed (day_view->calendar, &ico, CHANGE_DATES);
}
@@ -2754,16 +2797,22 @@ e_day_view_finish_resize (EDayView *day_view)
{
EDayViewEvent *event;
gint day, event_num;
+ iCalObject ico;
day = day_view->resize_event_day;
event_num = day_view->resize_event_num;
event = &g_array_index (day_view->events[day], EDayViewEvent,
event_num);
+ /* We use a temporary shallow copy of the ico since we don't want to
+ change the original ico here. Otherwise we would not detect that
+ the event's time had changed in the "update_event" callback. */
+ ico = *event->ico;
+
if (day_view->resize_drag_pos == E_DAY_VIEW_POS_TOP_EDGE) {
- event->ico->dtstart = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_start_row);
+ ico.dtstart = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_start_row);
} else {
- event->ico->dtend = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_end_row + 1);
+ ico.dtend = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_end_row + 1);
}
gnome_canvas_item_hide (day_view->resize_rect_item);
@@ -2778,8 +2827,7 @@ e_day_view_finish_resize (EDayView *day_view)
day_view->resize_drag_pos = E_DAY_VIEW_POS_NONE;
/* Notify calendar of change */
- gnome_calendar_object_changed (day_view->calendar, event->ico,
- CHANGE_DATES);
+ gnome_calendar_object_changed (day_view->calendar, &ico, CHANGE_DATES);
}
@@ -3698,7 +3746,8 @@ e_day_view_key_press (GtkWidget *widget, GdkEventKey *event)
ico = ical_new ("", user_name, "");
ico->new = 1;
- e_day_view_get_selection_range (day_view, &ico->dtstart, &ico->dtend);
+ e_day_view_get_selected_time_range (day_view, &ico->dtstart,
+ &ico->dtend);
/* We add the event locally and start editing it. When we get the
"update_event" callback from the server, we basically ignore it.
@@ -3934,25 +3983,6 @@ e_day_view_on_editing_stopped (EDayView *day_view,
}
-/* Converts the selected range into a start and end time. */
-static void
-e_day_view_get_selection_range (EDayView *day_view,
- time_t *start,
- time_t *end)
-{
- /* Check if the selection is only in the top canvas, in which case
- we can simply use the day_starts array. */
- if (day_view->selection_in_top_canvas) {
- *start = day_view->day_starts[day_view->selection_start_col];
- *end = day_view->day_starts[day_view->selection_end_col + 1];
- } else {
- /* Convert the start col + row into a time. */
- *start = e_day_view_convert_grid_position_to_time (day_view, day_view->selection_start_col, day_view->selection_start_row);
- *end = e_day_view_convert_grid_position_to_time (day_view, day_view->selection_end_col, day_view->selection_end_row + 1);
- }
-}
-
-
/* FIXME: It is possible that we may produce an invalid time due to daylight
saving times (i.e. when clocks go forward there is a range of time which
is not valid). I don't know the best way to handle daylight saving time. */
@@ -4822,6 +4852,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
EDayViewPosition pos;
gint day, start_day, end_day, num_days;
gchar *event_uid;
+ iCalObject ico;
if ((data->length >= 0) && (data->format == 8)) {
pos = e_day_view_convert_position_in_top_canvas (day_view,
@@ -4854,8 +4885,14 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
|| strcmp (event_uid, event->ico->uid))
g_warning ("Unexpected event UID");
- event->ico->dtstart = day_view->day_starts[day];
- event->ico->dtend = day_view->day_starts[day + num_days];
+ /* We use a temporary shallow copy of the ico since we
+ don't want to change the original ico here.
+ Otherwise we would not detect that the event's time
+ had changed in the "update_event" callback. */
+ ico = *event->ico;
+
+ ico.dtstart = day_view->day_starts[day];
+ ico.dtend = day_view->day_starts[day + num_days];
gtk_drag_finish (context, TRUE, TRUE, time);
@@ -4864,8 +4901,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
/* Notify calendar of change */
gnome_calendar_object_changed (day_view->calendar,
- event->ico,
- CHANGE_DATES);
+ &ico, CHANGE_DATES);
return;
}
@@ -4889,6 +4925,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
EDayViewPosition pos;
gint day, row, start_row, end_row, num_rows, scroll_x, scroll_y;
gchar *event_uid;
+ iCalObject ico;
gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
&scroll_x, &scroll_y);
@@ -4922,8 +4959,14 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
|| strcmp (event_uid, event->ico->uid))
g_warning ("Unexpected event UID");
- event->ico->dtstart = e_day_view_convert_grid_position_to_time (day_view, day, row);
- event->ico->dtend = e_day_view_convert_grid_position_to_time (day_view, day, row + num_rows);
+ /* We use a temporary shallow copy of the ico since we
+ don't want to change the original ico here.
+ Otherwise we would not detect that the event's time
+ had changed in the "update_event" callback. */
+ ico = *event->ico;
+
+ ico.dtstart = e_day_view_convert_grid_position_to_time (day_view, day, row);
+ ico.dtend = e_day_view_convert_grid_position_to_time (day_view, day, row + num_rows);
gtk_drag_finish (context, TRUE, TRUE, time);
@@ -4932,8 +4975,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
/* Notify calendar of change */
gnome_calendar_object_changed (day_view->calendar,
- event->ico,
- CHANGE_DATES);
+ &ico, CHANGE_DATES);
return;
}