aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/comp-util.c
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2009-01-15 22:48:21 +0800
committerMilan Crha <mcrha@src.gnome.org>2009-01-15 22:48:21 +0800
commit9a69a192221d827f263e6972b9f07031b62676ef (patch)
tree0735d643e2bef20cb7f1f8f488ec33f1359899a0 /calendar/gui/comp-util.c
parent8772855cc43886feadea096de92fc378330a14b4 (diff)
downloadgsoc2013-evolution-9a69a192221d827f263e6972b9f07031b62676ef.tar
gsoc2013-evolution-9a69a192221d827f263e6972b9f07031b62676ef.tar.gz
gsoc2013-evolution-9a69a192221d827f263e6972b9f07031b62676ef.tar.bz2
gsoc2013-evolution-9a69a192221d827f263e6972b9f07031b62676ef.tar.lz
gsoc2013-evolution-9a69a192221d827f263e6972b9f07031b62676ef.tar.xz
gsoc2013-evolution-9a69a192221d827f263e6972b9f07031b62676ef.tar.zst
gsoc2013-evolution-9a69a192221d827f263e6972b9f07031b62676ef.zip
** Fix for bug #245156
2009-01-15 Milan Crha <mcrha@redhat.com> ** Fix for bug #245156 * gui/e-day-view.c: (e_day_view_finish_long_event_resize), (e_day_view_finish_resize), (e_day_view_change_event_time), (e_day_view_on_top_canvas_drag_data_received), (e_day_view_on_main_canvas_drag_data_received): * gui/e-week-view.c: (e_week_view_change_event_time): * gui/e-calendar-view.c: (on_unrecur_appointment): Keep old timezone for dtstart/dtend when changing it. * gui/comp-util.h: (cal_comp_set_dtstart_with_oldzone), (cal_comp_set_dtend_with_oldzone): * gui/comp-util.c: (cal_comp_set_dtstart_with_oldzone), (cal_comp_set_dtend_with_oldzone), (datetime_to_zone): Helper functions to make it easier. svn path=/trunk/; revision=37079
Diffstat (limited to 'calendar/gui/comp-util.c')
-rw-r--r--calendar/gui/comp-util.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/calendar/gui/comp-util.c b/calendar/gui/comp-util.c
index 0e63a9c336..9504c7bda7 100644
--- a/calendar/gui/comp-util.c
+++ b/calendar/gui/comp-util.c
@@ -530,3 +530,80 @@ cal_comp_selection_get_string_list (GtkSelectionData *data)
return list;
}
+
+static void
+datetime_to_zone (ECal *client, ECalComponentDateTime *date, const char *tzid)
+{
+ icaltimezone *from, *to;
+
+ g_return_if_fail (date != NULL);
+
+ if (date->tzid == NULL || tzid == NULL ||
+ date->tzid == tzid || g_str_equal (date->tzid, tzid))
+ return;
+
+ from = icaltimezone_get_builtin_timezone_from_tzid (date->tzid);
+ if (!from) {
+ if (!e_cal_get_timezone (client, date->tzid, &from, NULL))
+ g_warning ("%s: Could not get timezone from server: %s", G_STRFUNC, date->tzid ? date->tzid : "");
+ }
+
+ to = icaltimezone_get_builtin_timezone_from_tzid (tzid);
+ if (!to) {
+ /* do not check failure here, maybe the zone is not available there */
+ e_cal_get_timezone (client, tzid, &to, NULL);
+ }
+
+ icaltimezone_convert_time (date->value, from, to);
+ date->tzid = tzid;
+}
+
+/**
+ * cal_comp_set_dtstart_with_oldzone:
+ * Changes 'dtstart' of the component, but converts time to the old timezone.
+ * @param client ECal structure, to retrieve timezone from, when required.
+ * @param comp Component, where make the change.
+ * @param pdate Value, to change to.
+ **/
+void
+cal_comp_set_dtstart_with_oldzone (ECal *client, ECalComponent *comp, const ECalComponentDateTime *pdate)
+{
+ ECalComponentDateTime olddate, date;
+
+ g_return_if_fail (comp != NULL);
+ g_return_if_fail (pdate != NULL);
+
+ e_cal_component_get_dtstart (comp, &olddate);
+
+ date = *pdate;
+
+ datetime_to_zone (client, &date, olddate.tzid);
+ e_cal_component_set_dtstart (comp, &date);
+
+ e_cal_component_free_datetime (&olddate);
+}
+
+/**
+ * cal_comp_set_dtend_with_oldzone:
+ * Changes 'dtend' of the component, but converts time to the old timezone.
+ * @param client ECal structure, to retrieve timezone from, when required.
+ * @param comp Component, where make the change.
+ * @param pdate Value, to change to.
+ **/
+void
+cal_comp_set_dtend_with_oldzone (ECal *client, ECalComponent *comp, const ECalComponentDateTime *pdate)
+{
+ ECalComponentDateTime olddate, date;
+
+ g_return_if_fail (comp != NULL);
+ g_return_if_fail (pdate != NULL);
+
+ e_cal_component_get_dtend (comp, &olddate);
+
+ date = *pdate;
+
+ datetime_to_zone (client, &date, olddate.tzid);
+ e_cal_component_set_dtend (comp, &date);
+
+ e_cal_component_free_datetime (&olddate);
+}