aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-week-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-week-view.c')
-rw-r--r--calendar/gui/e-week-view.c110
1 files changed, 86 insertions, 24 deletions
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index fbe9ee435a..10655feecb 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -271,6 +271,7 @@ e_week_view_init (EWeekView *week_view)
week_view->spans = NULL;
+ week_view->zone = NULL;
week_view->multi_week_view = FALSE;
week_view->weeks_shown = 6;
week_view->rows = 6;
@@ -988,8 +989,8 @@ query_obj_updated_cb (CalQuery *query, const char *uid,
cal_recur_generate_instances (comp,
week_view->day_starts[0],
week_view->day_starts[num_days],
- e_week_view_add_event,
- week_view);
+ e_week_view_add_event, week_view,
+ cal_client_resolve_tzid, week_view->client);
gtk_object_unref (GTK_OBJECT (comp));
@@ -1332,7 +1333,7 @@ e_week_view_set_first_day_shown (EWeekView *week_view,
gint weekday, day_offset, num_days;
gboolean update_adjustment_value = FALSE;
guint32 old_selection_start_julian = 0, old_selection_end_julian = 0;
- struct tm start_tm;
+ struct icaltimetype start_tt = icaltime_null_time ();
time_t start_time;
g_return_if_fail (E_IS_WEEK_VIEW (week_view));
@@ -1369,8 +1370,14 @@ e_week_view_set_first_day_shown (EWeekView *week_view,
if (!g_date_valid (&week_view->first_day_shown)
|| g_date_compare (&week_view->first_day_shown, &base_date)) {
week_view->first_day_shown = base_date;
- g_date_to_struct_tm (&base_date, &start_tm);
- start_time = mktime (&start_tm);
+
+ start_tt.year = g_date_year (&base_date);
+ start_tt.month = g_date_month (&base_date);
+ start_tt.day = g_date_day (&base_date);
+
+ start_time = icaltime_as_timet_with_zone (start_tt,
+ week_view->zone);
+
e_week_view_recalc_day_starts (week_view, start_time);
update_query (week_view);
}
@@ -1643,6 +1650,51 @@ e_week_view_set_24_hour_format (EWeekView *week_view,
gtk_widget_queue_draw (week_view->main_canvas);
}
+
+/* The current timezone. */
+icaltimezone*
+e_week_view_get_timezone (EWeekView *week_view)
+{
+ g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), NULL);
+
+ return week_view->zone;
+}
+
+
+void
+e_week_view_set_timezone (EWeekView *week_view,
+ icaltimezone *zone)
+{
+ icaltimezone *old_zone;
+ struct icaltimetype tt = icaltime_null_time ();
+ time_t lower;
+
+ g_return_if_fail (E_IS_WEEK_VIEW (week_view));
+
+ old_zone = week_view->zone;
+ if (old_zone == zone)
+ return;
+
+ week_view->zone = zone;
+
+ /* If we don't have a valid date set yet, just return. */
+ if (!g_date_valid (&week_view->first_day_shown))
+ return;
+
+ /* Recalculate the new start of the first week. We just use exactly
+ the same time, but with the new timezone. */
+ tt.year = g_date_year (&week_view->first_day_shown);
+ tt.month = g_date_month (&week_view->first_day_shown);
+ tt.day = g_date_day (&week_view->first_day_shown);
+ tt.is_daylight = -1;
+
+ lower = icaltime_as_timet_with_zone (tt, zone);
+
+ e_week_view_recalc_day_starts (week_view, lower);
+ update_query (week_view);
+}
+
+
void
e_week_view_cut_clipboard (EWeekView *week_view)
{
@@ -2186,7 +2238,7 @@ e_week_view_add_event (CalComponent *comp,
EWeekView *week_view;
EWeekViewEvent event;
gint num_days;
- struct tm start_tm, end_tm;
+ struct icaltimetype start_tt, end_tt;
week_view = E_WEEK_VIEW (data);
@@ -2203,8 +2255,10 @@ e_week_view_add_event (CalComponent *comp,
g_return_val_if_fail (start < week_view->day_starts[num_days], TRUE);
g_return_val_if_fail (end > week_view->day_starts[0], TRUE);
- start_tm = *(localtime (&start));
- end_tm = *(localtime (&end));
+ start_tt = icaltime_from_timet_with_zone (start, FALSE,
+ week_view->zone);
+ end_tt = icaltime_from_timet_with_zone (end, FALSE,
+ week_view->zone);
event.comp = comp;
gtk_object_ref (GTK_OBJECT (event.comp));
@@ -2213,8 +2267,8 @@ e_week_view_add_event (CalComponent *comp,
event.spans_index = 0;
event.num_spans = 0;
- event.start_minute = start_tm.tm_hour * 60 + start_tm.tm_min;
- event.end_minute = end_tm.tm_hour * 60 + end_tm.tm_min;
+ event.start_minute = start_tt.hour * 60 + start_tt.minute;
+ event.end_minute = end_tt.hour * 60 + end_tt.minute;
if (event.end_minute == 0 && start != end)
event.end_minute = 24 * 60;
@@ -2583,7 +2637,7 @@ e_week_view_on_adjustment_changed (GtkAdjustment *adjustment,
{
GDate date;
gint week_offset;
- struct tm tm;
+ struct icaltimetype start_tt = icaltime_null_time ();
time_t lower, start, end;
guint32 old_first_day_julian, new_first_day_julian;
@@ -2608,9 +2662,11 @@ e_week_view_on_adjustment_changed (GtkAdjustment *adjustment,
week_view->first_day_shown = date;
/* Convert it to a time_t. */
- g_date_to_struct_tm (&date, &tm);
- lower = mktime (&tm);
- lower = time_day_begin (lower);
+ start_tt.year = g_date_year (&date);
+ start_tt.month = g_date_month (&date);
+ start_tt.day = g_date_day (&date);
+
+ lower = icaltime_as_timet_with_zone (start_tt, week_view->zone);
e_week_view_recalc_day_starts (week_view, lower);
update_query (week_view);
@@ -3019,11 +3075,13 @@ e_week_view_key_press (GtkWidget *widget, GdkEventKey *event)
dtend = week_view->day_starts[week_view->selection_end_day + 1];
date.value = &itt;
- date.tzid = NULL;
+ date.tzid = icaltimezone_get_tzid (week_view->zone);
- *date.value = icaltime_from_timet (dtstart, FALSE);
+ *date.value = icaltime_from_timet_with_zone (dtstart, FALSE,
+ week_view->zone);
cal_component_set_dtstart (comp, &date);
- *date.value = icaltime_from_timet (dtend, FALSE);
+ *date.value = icaltime_from_timet_with_zone (dtend, FALSE,
+ week_view->zone);
cal_component_set_dtend (comp, &date);
/* We add the event locally and start editing it. We don't send the
@@ -3245,7 +3303,7 @@ e_week_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
when we get the "update_event" callback. */
comp = cal_component_clone (event->comp);
- cal_comp_util_add_exdate (comp, icaltime_from_timet (event->start, TRUE));
+ cal_comp_util_add_exdate (comp, event->start, week_view->zone);
if (!cal_client_update_object (week_view->client, comp))
g_message ("e_week_view_on_delete_occurrence(): Could not update the object!");
@@ -3358,7 +3416,7 @@ e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
/* For the recurring object, we add a exception to get rid of the
instance. */
comp = cal_component_clone (event->comp);
- cal_comp_util_add_exdate (comp, icaltime_from_timet (event->start, TRUE));
+ cal_comp_util_add_exdate (comp, event->start, week_view->zone);
/* For the unrecurred instance we duplicate the original object,
create a new uid for it, get rid of the recurrence rules, and set
@@ -3371,11 +3429,13 @@ e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
cal_component_set_exrule_list (new_comp, NULL);
date.value = &itt;
- date.tzid = NULL;
+ date.tzid = icaltimezone_get_tzid (week_view->zone);
- *date.value = icaltime_from_timet (event->start, TRUE);
+ *date.value = icaltime_from_timet_with_zone (event->start, FALSE,
+ week_view->zone);
cal_component_set_dtstart (new_comp, &date);
- *date.value = icaltime_from_timet (event->end, TRUE);
+ *date.value = icaltime_from_timet_with_zone (event->end, FALSE,
+ week_view->zone);
cal_component_set_dtend (new_comp, &date);
/* Now update both CalComponents. Note that we do this last since at
@@ -3527,11 +3587,13 @@ selection_received (GtkWidget *invisible,
icalcomp = icalparser_parse_string ((const char *) comp_str);
if (icalcomp) {
dtstart = week_view->day_starts[week_view->selection_start_day];
- itime = icaltime_from_timet (dtstart, FALSE);
+ itime = icaltime_from_timet_with_zone (dtstart, FALSE,
+ week_view->zone);
icalcomponent_set_dtstart (icalcomp, itime);
dtend = week_view->day_starts[week_view->selection_end_day + 1];
- itime = icaltime_from_timet (dtend, FALSE);
+ itime = icaltime_from_timet_with_zone (dtend, FALSE,
+ week_view->zone);
icalcomponent_set_dtend (icalcomp, itime);
comp = cal_component_new ();