[evolution] I#518 - Handle different DTSTART/DTEND timezones properly



commit 79a67de77fd17b2c6be34b8711202bc15662fe11
Author: Milan Crha <mcrha redhat com>
Date:   Tue Aug 13 11:13:05 2019 +0200

    I#518 - Handle different DTSTART/DTEND timezones properly
    
    Closes https://gitlab.gnome.org/GNOME/evolution/issues/518

 src/calendar/gui/e-cal-model-calendar.c         |  70 +----------
 src/calendar/gui/e-cal-model-tasks.c            |  57 ++-------
 src/calendar/gui/e-cal-model.c                  | 151 ++++++++++++++++++------
 src/calendar/gui/e-cal-model.h                  |   6 +
 src/calendar/gui/e-calendar-view.c              |  21 +++-
 src/calendar/gui/e-comp-editor-event.c          |  11 +-
 src/calendar/gui/e-comp-editor-property-parts.c |  36 +-----
 src/calendar/gui/e-comp-editor-task.c           |  43 +++++--
 8 files changed, 191 insertions(+), 204 deletions(-)
---
diff --git a/src/calendar/gui/e-cal-model-calendar.c b/src/calendar/gui/e-cal-model-calendar.c
index 99d82b441d..7e162f77aa 100644
--- a/src/calendar/gui/e-cal-model-calendar.c
+++ b/src/calendar/gui/e-cal-model-calendar.c
@@ -49,75 +49,9 @@ static ECellDateEditValue *
 get_dtend (ECalModelCalendar *model,
            ECalModelComponent *comp_data)
 {
-       ICalTime *tt_end;
-
        if (!comp_data->dtend) {
-               ICalProperty *prop;
-               ICalTimezone *zone = NULL, *model_zone = NULL;
-               gboolean got_zone = FALSE, is_date;
-
-               prop = i_cal_component_get_first_property (comp_data->icalcomp, I_CAL_DTEND_PROPERTY);
-               if (!prop)
-                       return NULL;
-
-               tt_end = i_cal_property_get_dtend (prop);
-
-               if (i_cal_time_get_tzid (tt_end) &&
-                   e_cal_client_get_timezone_sync (comp_data->client, i_cal_time_get_tzid (tt_end), &zone, 
NULL, NULL))
-                       got_zone = TRUE;
-
-               model_zone = e_cal_model_get_timezone (E_CAL_MODEL (model));
-
-               is_date = i_cal_time_is_date (tt_end);
-
-               g_clear_object (&tt_end);
-               g_clear_object (&prop);
-
-               if (got_zone) {
-                       tt_end = i_cal_time_new_from_timet_with_zone (comp_data->instance_end, is_date, zone);
-               } else {
-                       tt_end = i_cal_time_new_from_timet_with_zone (comp_data->instance_end, is_date, 
model_zone);
-               }
-
-               if (!i_cal_time_is_valid_time (tt_end) || i_cal_time_is_null_time (tt_end)) {
-                       g_clear_object (&tt_end);
-                       return NULL;
-               }
-
-               if (i_cal_time_is_date (tt_end) &&
-                   (prop = i_cal_component_get_first_property (comp_data->icalcomp, I_CAL_DTSTART_PROPERTY)) 
!= NULL) {
-                       ICalTime *tt_start;
-                       ICalTimezone *start_zone = NULL;
-                       gboolean got_start_zone = FALSE;
-
-                       tt_start = i_cal_property_get_dtstart (prop);
-
-                       if (i_cal_time_get_tzid (tt_start) &&
-                           e_cal_client_get_timezone_sync (comp_data->client, i_cal_time_get_tzid 
(tt_start), &start_zone, NULL, NULL))
-                               got_start_zone = TRUE;
-
-                       is_date = i_cal_time_is_date (tt_end);
-
-                       g_clear_object (&tt_start);
-
-                       if (got_start_zone) {
-                               tt_start = i_cal_time_new_from_timet_with_zone (comp_data->instance_start, 
is_date, start_zone);
-                       } else {
-                               tt_start = i_cal_time_new_from_timet_with_zone (comp_data->instance_start, 
is_date, model_zone);
-                       }
-
-                       i_cal_time_adjust (tt_start, 1, 0, 0, 0);
-
-                       /* Decrease by a day only if the DTSTART will still be before, or the same as, DTEND 
*/
-                       if (i_cal_time_compare (tt_start, tt_end) <= 0)
-                               i_cal_time_adjust (tt_end, -1, 0, 0, 0);
-
-                       g_clear_object (&tt_start);
-               }
-
-               g_clear_object (&prop);
-
-               comp_data->dtend = e_cell_date_edit_value_new_take (tt_end, (got_zone && zone) ? 
e_cal_util_copy_timezone (zone) : NULL);
+               comp_data->dtend = e_cal_model_util_get_datetime_value (E_CAL_MODEL (model), comp_data,
+                       I_CAL_DTEND_PROPERTY, i_cal_property_get_dtend);
        }
 
        return e_cell_date_edit_value_copy (comp_data->dtend);
diff --git a/src/calendar/gui/e-cal-model-tasks.c b/src/calendar/gui/e-cal-model-tasks.c
index c95916d835..c9ce4f30aa 100644
--- a/src/calendar/gui/e-cal-model-tasks.c
+++ b/src/calendar/gui/e-cal-model-tasks.c
@@ -132,61 +132,24 @@ ensure_task_not_complete (ECalModelComponent *comp_data,
 }
 
 static ECellDateEditValue *
-get_completed (ECalModelComponent *comp_data)
+get_completed (ECalModel *model,
+              ECalModelComponent *comp_data)
 {
        if (!comp_data->completed) {
-               ICalTime *tt_completed;
-               ICalTimezone *zone = NULL;
-               ICalProperty *prop;
-
-               prop = i_cal_component_get_first_property (comp_data->icalcomp, I_CAL_COMPLETED_PROPERTY);
-               if (!prop)
-                       return NULL;
-
-               tt_completed = i_cal_property_get_completed (prop);
-               g_clear_object (&prop);
-
-               if (!i_cal_time_is_valid_time (tt_completed) || i_cal_time_is_null_time (tt_completed)) {
-                       g_clear_object (&tt_completed);
-                       return NULL;
-               }
-
-               if (!i_cal_time_get_tzid (tt_completed) ||
-                   !e_cal_client_get_timezone_sync (comp_data->client, i_cal_time_get_tzid (tt_completed), 
&zone, NULL, NULL))
-                       zone = NULL;
-
-               comp_data->completed = e_cell_date_edit_value_new_take (tt_completed, zone ? 
e_cal_util_copy_timezone (zone) : NULL);
+               comp_data->completed = e_cal_model_util_get_datetime_value (model, comp_data,
+                       I_CAL_COMPLETED_PROPERTY, i_cal_property_get_completed);
        }
 
        return e_cell_date_edit_value_copy (comp_data->completed);
 }
 
 static ECellDateEditValue *
-get_due (ECalModelComponent *comp_data)
+get_due (ECalModel *model,
+        ECalModelComponent *comp_data)
 {
        if (!comp_data->due) {
-               ICalTime *tt_due;
-               ICalTimezone *zone = NULL;
-               ICalProperty *prop;
-
-               prop = i_cal_component_get_first_property (comp_data->icalcomp, I_CAL_DUE_PROPERTY);
-               if (!prop)
-                       return NULL;
-
-               tt_due = i_cal_property_get_due (prop);
-
-               g_clear_object (&prop);
-
-               if (!i_cal_time_is_valid_time (tt_due) || i_cal_time_is_null_time (tt_due)) {
-                       g_clear_object (&tt_due);
-                       return NULL;
-               }
-
-               if (!i_cal_time_get_tzid (tt_due) ||
-                   !e_cal_client_get_timezone_sync (comp_data->client, i_cal_time_get_tzid (tt_due), &zone, 
NULL, NULL))
-                       zone = NULL;
-
-               comp_data->due = e_cell_date_edit_value_new_take (tt_due, zone ? e_cal_util_copy_timezone 
(zone) : NULL);
+               comp_data->due = e_cal_model_util_get_datetime_value (model, comp_data,
+                       I_CAL_DUE_PROPERTY, i_cal_property_get_due);
        }
 
        return e_cell_date_edit_value_copy (comp_data->due);
@@ -863,13 +826,13 @@ cal_model_tasks_value_at (ETableModel *etm,
 
        switch (col) {
        case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
-               return get_completed (comp_data);
+               return get_completed (E_CAL_MODEL (model), comp_data);
        case E_CAL_MODEL_TASKS_FIELD_STRIKEOUT :
                return GINT_TO_POINTER (is_status_canceled (comp_data) || is_complete (comp_data));
        case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
                return GINT_TO_POINTER (is_complete (comp_data));
        case E_CAL_MODEL_TASKS_FIELD_DUE :
-               return get_due (comp_data);
+               return get_due (E_CAL_MODEL (model), comp_data);
        case E_CAL_MODEL_TASKS_FIELD_GEO :
                return get_geo (comp_data);
        case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
diff --git a/src/calendar/gui/e-cal-model.c b/src/calendar/gui/e-cal-model.c
index 08e1f0bf7a..ed23659d5a 100644
--- a/src/calendar/gui/e-cal-model.c
+++ b/src/calendar/gui/e-cal-model.c
@@ -341,46 +341,9 @@ static ECellDateEditValue *
 get_dtstart (ECalModel *model,
              ECalModelComponent *comp_data)
 {
-       ECalModelPrivate *priv;
-       ICalTime *tt_start;
-
-       priv = model->priv;
-
        if (!comp_data->dtstart) {
-               ICalProperty *prop;
-               ICalTimezone *zone;
-               gboolean got_zone = FALSE;
-
-               prop = i_cal_component_get_first_property (comp_data->icalcomp, I_CAL_DTSTART_PROPERTY);
-               if (!prop)
-                       return NULL;
-
-               tt_start = i_cal_property_get_dtstart (prop);
-
-               if (i_cal_time_get_tzid (tt_start)
-                   && e_cal_client_get_timezone_sync (comp_data->client, i_cal_time_get_tzid (tt_start), 
&zone, NULL, NULL))
-                       got_zone = TRUE;
-
-               if (e_cal_data_model_get_expand_recurrences (priv->data_model)) {
-                       gboolean is_date = i_cal_time_is_date (tt_start);
-
-                       if (got_zone) {
-                               g_clear_object (&tt_start);
-                               tt_start = i_cal_time_new_from_timet_with_zone (comp_data->instance_start, 
is_date, zone);
-                       } else if (priv->zone) {
-                               g_clear_object (&tt_start);
-                               tt_start = i_cal_time_new_from_timet_with_zone (comp_data->instance_start, 
is_date, priv->zone);
-                       }
-               }
-
-               g_object_unref (prop);
-
-               if (!i_cal_time_is_valid_time (tt_start) || i_cal_time_is_null_time (tt_start)) {
-                       g_clear_object (&tt_start);
-                       return NULL;
-               }
-
-               comp_data->dtstart = e_cell_date_edit_value_new_take (tt_start, (got_zone && zone) ? 
e_cal_util_copy_timezone (zone) : NULL);
+               comp_data->dtstart = e_cal_model_util_get_datetime_value (model, comp_data,
+                       I_CAL_DTSTART_PROPERTY, i_cal_property_get_dtstart);
        }
 
        return e_cell_date_edit_value_copy (comp_data->dtstart);
@@ -4336,3 +4299,113 @@ e_cal_model_util_status_compare_cb (gconstpointer a,
 
        return status_a - status_b;
 }
+
+ECellDateEditValue *
+e_cal_model_util_get_datetime_value (ECalModel *model,
+                                    ECalModelComponent *comp_data,
+                                    ICalPropertyKind kind,
+                                    ICalTime * (*get_time_func) (ICalProperty *prop))
+{
+       ECellDateEditValue *value;
+       ICalProperty *prop;
+       ICalParameter *param = NULL;
+       ICalTimezone *zone = NULL;
+       ICalTime *tt;
+       const gchar *tzid;
+       gboolean is_date;
+
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL);
+       g_return_val_if_fail (E_IS_CAL_MODEL_COMPONENT (comp_data), NULL);
+       g_return_val_if_fail (get_time_func != NULL, NULL);
+
+       prop = i_cal_component_get_first_property (comp_data->icalcomp, kind);
+       if (!prop)
+               return NULL;
+
+       tt = get_time_func (prop);
+
+       if (!tt || !i_cal_time_is_valid_time (tt) || i_cal_time_is_null_time (tt)) {
+               g_clear_object (&prop);
+               g_clear_object (&tt);
+
+               return NULL;
+       }
+
+       is_date = i_cal_time_is_date (tt);
+
+       if (!is_date) {
+               param = i_cal_property_get_first_parameter (prop, I_CAL_TZID_PARAMETER);
+               tzid = param ? i_cal_parameter_get_tzid (param) : NULL;
+
+               if (!tzid || !*tzid ||
+                   !e_cal_client_get_timezone_sync (comp_data->client, tzid, &zone, NULL, NULL))
+                       zone = NULL;
+       }
+
+       if (e_cal_data_model_get_expand_recurrences (model->priv->data_model)) {
+               gboolean is_date = i_cal_time_is_date (tt);
+               time_t instance_tt = (time_t) 0;
+
+               if (kind == I_CAL_DTSTART_PROPERTY)
+                       instance_tt = comp_data->instance_start;
+               else if (kind == I_CAL_DTEND_PROPERTY)
+                       instance_tt = comp_data->instance_end;
+               else
+                       g_warn_if_reached ();
+
+               if (zone) {
+                       g_clear_object (&tt);
+                       tt = i_cal_time_new_from_timet_with_zone (instance_tt, is_date, zone);
+               } else if (model->priv->zone) {
+                       g_clear_object (&tt);
+                       tt = i_cal_time_new_from_timet_with_zone (instance_tt, is_date, model->priv->zone);
+               }
+
+               if (kind == I_CAL_DTEND_PROPERTY && is_date) {
+                       ICalProperty *dtstart;
+
+                       dtstart = i_cal_component_get_first_property (comp_data->icalcomp, 
I_CAL_DTSTART_PROPERTY);
+
+                       if (dtstart) {
+                               ICalTime *tt_start;
+                               ICalTimezone *start_zone = NULL;
+
+                               tt_start = i_cal_property_get_dtstart (dtstart);
+
+                               g_clear_object (&param);
+
+                               if (!i_cal_time_is_date (tt_start)) {
+                                       param = i_cal_property_get_first_parameter (dtstart, 
I_CAL_TZID_PARAMETER);
+                                       tzid = param ? i_cal_parameter_get_tzid (param) : NULL;
+
+                                       if (!tzid || !*tzid ||
+                                           !e_cal_client_get_timezone_sync (comp_data->client, tzid, 
&start_zone, NULL, NULL))
+                                               start_zone = NULL;
+                               }
+
+                               if (start_zone) {
+                                       tt_start = i_cal_time_new_from_timet_with_zone 
(comp_data->instance_start, is_date, start_zone);
+                               } else {
+                                       tt_start = i_cal_time_new_from_timet_with_zone 
(comp_data->instance_start, is_date, model->priv->zone);
+                               }
+
+                               i_cal_time_adjust (tt_start, 1, 0, 0, 0);
+
+                               /* Decrease by a day only if the DTSTART will still be before, or the same 
as, DTEND */
+                               if (i_cal_time_compare (tt_start, tt) <= 0)
+                                       i_cal_time_adjust (tt, -1, 0, 0, 0);
+
+                               g_clear_object (&tt_start);
+                               g_clear_object (&dtstart);
+                               g_clear_object (&param);
+                       }
+               }
+       }
+
+       value = e_cell_date_edit_value_new_take (tt, zone ? e_cal_util_copy_timezone (zone) : NULL);
+
+       g_clear_object (&prop);
+       g_clear_object (&param);
+
+       return value;
+}
diff --git a/src/calendar/gui/e-cal-model.h b/src/calendar/gui/e-cal-model.h
index 69f2f66554..0b7d90d900 100644
--- a/src/calendar/gui/e-cal-model.h
+++ b/src/calendar/gui/e-cal-model.h
@@ -413,6 +413,12 @@ gint               e_cal_model_util_status_compare_cb
                                                (gconstpointer a,
                                                 gconstpointer b,
                                                 gpointer cmp_cache);
+ECellDateEditValue *
+               e_cal_model_util_get_datetime_value
+                                               (ECalModel *model,
+                                                ECalModelComponent *comp_data,
+                                                ICalPropertyKind kind,
+                                                ICalTime * (*get_time_func) (ICalProperty *prop));
 
 G_END_DECLS
 
diff --git a/src/calendar/gui/e-calendar-view.c b/src/calendar/gui/e-calendar-view.c
index 470ea78176..f3c933a3f6 100644
--- a/src/calendar/gui/e-calendar-view.c
+++ b/src/calendar/gui/e-calendar-view.c
@@ -1948,14 +1948,27 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
                        zone = default_zone;
 
        } else {
-               zone = NULL;
+               zone = default_zone;
        }
 
        if (dtstart && e_cal_component_datetime_get_value (dtstart)) {
                t_start = i_cal_time_as_timet_with_zone (e_cal_component_datetime_get_value (dtstart), zone);
-               if (dtend && e_cal_component_datetime_get_value (dtend))
-                       t_end = i_cal_time_as_timet_with_zone (e_cal_component_datetime_get_value (dtend), 
zone);
-               else
+
+               if (dtend && e_cal_component_datetime_get_value (dtend)) {
+                       ICalTimezone *end_zone = default_zone;
+
+                       if (e_cal_component_datetime_get_tzid (dtend)) {
+                               end_zone = i_cal_component_get_timezone (e_cal_component_get_icalcomponent 
(newcomp), e_cal_component_datetime_get_tzid (dtend));
+                               if (!end_zone &&
+                                   !e_cal_client_get_timezone_sync (client, 
e_cal_component_datetime_get_tzid (dtend), &end_zone, NULL, NULL))
+                                       end_zone = NULL;
+
+                               if (!end_zone)
+                                       end_zone = default_zone;
+                       }
+
+                       t_end = i_cal_time_as_timet_with_zone (e_cal_component_datetime_get_value (dtend), 
end_zone);
+               } else
                        t_end = t_start;
 
                tmp1 = get_label (e_cal_component_datetime_get_value (dtstart), zone, default_zone);
diff --git a/src/calendar/gui/e-comp-editor-event.c b/src/calendar/gui/e-comp-editor-event.c
index 49dececa3d..b7943bb3a5 100644
--- a/src/calendar/gui/e-comp-editor-event.c
+++ b/src/calendar/gui/e-comp-editor-event.c
@@ -281,6 +281,7 @@ ece_event_update_timezone (ECompEditorEvent *event_editor,
        ICalComponent *component;
        ICalProperty *prop;
        ICalTimezone *zone = NULL;
+       gboolean has_property = FALSE;
 
        g_return_if_fail (E_IS_COMP_EDITOR_EVENT (event_editor));
 
@@ -298,6 +299,8 @@ ece_event_update_timezone (ECompEditorEvent *event_editor,
        }
 
        if (e_cal_util_component_has_property (component, I_CAL_DTSTART_PROPERTY)) {
+               has_property = TRUE;
+
                dtstart = i_cal_component_get_dtstart (component);
                if (dtstart && i_cal_time_is_valid_time (dtstart)) {
                        if (i_cal_time_is_utc (dtstart)) {
@@ -311,6 +314,8 @@ ece_event_update_timezone (ECompEditorEvent *event_editor,
        }
 
        if (e_cal_util_component_has_property (component, I_CAL_DTEND_PROPERTY)) {
+               has_property = TRUE;
+
                dtend = i_cal_component_get_dtend (component);
                if (!zone && i_cal_time_is_valid_time (dtend)) {
                        if (i_cal_time_is_utc (dtend)) {
@@ -323,9 +328,11 @@ ece_event_update_timezone (ECompEditorEvent *event_editor,
                }
        }
 
-       if (!zone) {
+       if (!zone && e_cal_util_component_has_property (component, I_CAL_DUE_PROPERTY)) {
                ICalTime *itt;
 
+               has_property = TRUE;
+
                itt = i_cal_component_get_due (component);
                if (itt && i_cal_time_is_valid_time (itt)) {
                        if (i_cal_time_is_utc (itt)) {
@@ -340,7 +347,7 @@ ece_event_update_timezone (ECompEditorEvent *event_editor,
                g_clear_object (&itt);
        }
 
-       if (zone) {
+       if (has_property) {
                GtkWidget *edit_widget;
                ICalTimezone *cfg_zone;
 
diff --git a/src/calendar/gui/e-comp-editor-property-parts.c b/src/calendar/gui/e-comp-editor-property-parts.c
index a6c1d6507a..53e106859f 100644
--- a/src/calendar/gui/e-comp-editor-property-parts.c
+++ b/src/calendar/gui/e-comp-editor-property-parts.c
@@ -1451,41 +1451,7 @@ static void
 ecepp_timezone_fill_widget (ECompEditorPropertyPart *property_part,
                            ICalComponent *component)
 {
-       ICalTime * (* get_func) (ICalProperty *prop);
-       ICalProperty *prop;
-
-       g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_TIMEZONE (property_part));
-
-       get_func = i_cal_property_get_dtstart;
-       prop = i_cal_component_get_first_property (component, I_CAL_DTSTART_PROPERTY);
-
-       if (!prop) {
-               get_func = i_cal_property_get_dtend;
-               prop = i_cal_component_get_first_property (component, I_CAL_DTEND_PROPERTY);
-       }
-
-       if (!prop) {
-               get_func = i_cal_property_get_due;
-               prop = i_cal_component_get_first_property (component, I_CAL_DUE_PROPERTY);
-       }
-
-       if (prop) {
-               ICalTime *itt;
-               GtkWidget *edit_widget;
-
-               edit_widget = e_comp_editor_property_part_get_edit_widget (property_part);
-               g_return_if_fail (E_IS_TIMEZONE_ENTRY (edit_widget));
-
-               itt = get_func (prop);
-               if (itt && i_cal_time_get_timezone (itt)) {
-                       e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (edit_widget), 
i_cal_time_get_timezone (itt));
-               } else {
-                       e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (edit_widget), NULL);
-               }
-
-               g_clear_object (&itt);
-               g_object_unref (prop);
-       }
+       /* Nothing to do here, this is sort-of virtual property part */
 }
 
 static void
diff --git a/src/calendar/gui/e-comp-editor-task.c b/src/calendar/gui/e-comp-editor-task.c
index 574c9bbb50..4280ae6c8b 100644
--- a/src/calendar/gui/e-comp-editor-task.c
+++ b/src/calendar/gui/e-comp-editor-task.c
@@ -99,18 +99,41 @@ ece_task_get_timezone_from_property (ECompEditor *comp_editor,
        return zone;
 }
 
+static ICalTime *
+ece_task_get_completed (ICalComponent *comp)
+{
+       ICalProperty *prop;
+       ICalTime *tt;
+
+       g_return_val_if_fail (I_CAL_IS_COMPONENT (comp), NULL);
+
+       prop = i_cal_component_get_first_property (comp, I_CAL_COMPLETED_PROPERTY);
+       if (!prop)
+               return NULL;
+
+       tt = i_cal_property_get_completed (prop);
+
+       g_object_unref (prop);
+
+       return tt;
+}
+
 static void
 ece_task_update_timezone (ECompEditorTask *task_editor,
                          gboolean *force_allday)
 {
-       const gint properties[] = {
-               I_CAL_DTSTART_PROPERTY,
-               I_CAL_DUE_PROPERTY,
-               I_CAL_COMPLETED_PROPERTY
+       struct _props_data {
+               ICalPropertyKind kind;
+               ICalTime * (*get_func) (ICalComponent *comp);
+       } properties[] = {
+               { I_CAL_DTSTART_PROPERTY, i_cal_component_get_dtstart },
+               { I_CAL_DUE_PROPERTY, i_cal_component_get_due },
+               { I_CAL_COMPLETED_PROPERTY, ece_task_get_completed }
        };
        ECompEditor *comp_editor;
        ICalComponent *component;
        ICalTimezone *zone = NULL;
+       gboolean has_property = FALSE;
        gint ii;
 
        g_return_if_fail (E_IS_COMP_EDITOR_TASK (task_editor));
@@ -124,11 +147,13 @@ ece_task_update_timezone (ECompEditorTask *task_editor,
        if (!component)
                return;
 
-       for (ii = 0; !zone && ii < G_N_ELEMENTS (properties); ii++) {
-               if (e_cal_util_component_has_property (component, properties[ii])) {
+       for (ii = 0; !has_property && ii < G_N_ELEMENTS (properties); ii++) {
+               if (e_cal_util_component_has_property (component, properties[ii].kind)) {
                        ICalTime *dt;
 
-                       dt = i_cal_component_get_dtstart (component);
+                       has_property = TRUE;
+
+                       dt = properties[ii].get_func (component);
                        if (dt && i_cal_time_is_valid_time (dt)) {
                                if (force_allday && i_cal_time_is_date (dt))
                                        *force_allday = TRUE;
@@ -138,7 +163,7 @@ ece_task_update_timezone (ECompEditorTask *task_editor,
                                } else {
                                        ICalProperty *prop;
 
-                                       prop = i_cal_component_get_first_property (component, properties[ii]);
+                                       prop = i_cal_component_get_first_property (component, 
properties[ii].kind);
                                        zone = ece_task_get_timezone_from_property (comp_editor, prop);
                                        g_clear_object (&prop);
                                }
@@ -148,7 +173,7 @@ ece_task_update_timezone (ECompEditorTask *task_editor,
                }
        }
 
-       if (zone) {
+       if (has_property) {
                GtkWidget *edit_widget;
                ICalTimezone *cfg_zone;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]