diff options
-rw-r--r-- | calendar/ChangeLog | 7 | ||||
-rw-r--r-- | calendar/gui/calendar-model.c | 134 |
2 files changed, 75 insertions, 66 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 1dba1b375d..2e05bf7821 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,10 @@ +2002-08-01 JP Rosevear <jpr@ximian.com> + + * gui/calendar-model.c (is_overdue): use get_due_status + (get_color): ditto + (get_due_status): utility function to reduce replicated code, + handle the case where the due date is just a date + 2002-07-31 Rodrigo Moya <rodrigo@ximian.com> * pcs/query-backend.[ch]: new class for implementing a backend cache diff --git a/calendar/gui/calendar-model.c b/calendar/gui/calendar-model.c index c2416344ff..976da12b96 100644 --- a/calendar/gui/calendar-model.c +++ b/calendar/gui/calendar-model.c @@ -635,21 +635,27 @@ is_complete (CalComponent *comp) return retval; } -/* Returns whether a component is overdue. Sigh, this is very similar to - * get_color() below. - */ -static gboolean -is_overdue (CalendarModel *model, CalComponent *comp) +typedef enum { + CALENDAR_MODEL_DUE_NEVER, + CALENDAR_MODEL_DUE_FUTURE, + CALENDAR_MODEL_DUE_TODAY, + CALENDAR_MODEL_DUE_OVERDUE, + CALENDAR_MODEL_DUE_COMPLETE +} CalendarModelDueStatus; + + +static CalendarModelDueStatus +get_due_status (CalendarModel *model, CalComponent *comp) { CalComponentDateTime dt; - gboolean retval; + CalendarModelDueStatus retval; cal_component_get_due (comp, &dt); /* First, do we have a due date? */ if (!dt.value) - retval = FALSE; + retval = CALENDAR_MODEL_DUE_NEVER; else { struct icaltimetype now_tt; CalClientGetStatus status; @@ -658,22 +664,39 @@ is_overdue (CalendarModel *model, CalComponent *comp) /* Second, is it already completed? */ if (is_complete (comp)) { - retval = FALSE; + retval = CALENDAR_MODEL_DUE_COMPLETE; goto out; } /* Third, are we overdue as of right now? */ - /* Get the current time in the same timezone as the DUE date.*/ - /* FIXME: TIMEZONES: Handle error. */ - status = cal_client_get_timezone (model->priv->client, dt.tzid, - &zone); - now_tt = icaltime_current_time_with_zone (zone); - - if (icaltime_compare (*dt.value, now_tt) <= 0) - retval = TRUE; - else - retval = FALSE; + if (dt.value->is_date) { + int cmp; + + now_tt = icaltime_today (); + cmp = icaltime_compare_date_only (*dt.value, now_tt); + + if (cmp < 0) + retval = CALENDAR_MODEL_DUE_OVERDUE; + else if (cmp == 0) + retval = CALENDAR_MODEL_DUE_TODAY; + else + retval = CALENDAR_MODEL_DUE_FUTURE; + } else { + /* Get the current time in the same timezone as the DUE date.*/ + /* FIXME: TIMEZONES: Handle error. */ + status = cal_client_get_timezone (model->priv->client, dt.tzid, + &zone); + now_tt = icaltime_current_time_with_zone (zone); + + if (icaltime_compare (*dt.value, now_tt) <= 0) + retval = CALENDAR_MODEL_DUE_OVERDUE; + else + if (icaltime_compare_date_only (*dt.value, now_tt) == 0) + retval = CALENDAR_MODEL_DUE_TODAY; + else + retval = CALENDAR_MODEL_DUE_FUTURE; + } } out: @@ -683,60 +706,39 @@ is_overdue (CalendarModel *model, CalComponent *comp) return retval; } +/* Returns whether a component is overdue. */ +static gboolean +is_overdue (CalendarModel *model, CalComponent *comp) +{ + switch (get_due_status (model, comp)) { + case CALENDAR_MODEL_DUE_NEVER: + case CALENDAR_MODEL_DUE_FUTURE: + case CALENDAR_MODEL_DUE_COMPLETE: + return FALSE; + case CALENDAR_MODEL_DUE_TODAY: + case CALENDAR_MODEL_DUE_OVERDUE: + return TRUE; + } + + return FALSE; +} + /* Computes the color to be used to display a component */ static const char * get_color (CalendarModel *model, CalComponent *comp) { - CalComponentDateTime dt; - const char *retval; - - cal_component_get_due (comp, &dt); - - /* First, do we have a due date? */ - - if (!dt.value) - retval = NULL; - else { - struct icaltimetype now_tt; - CalClientGetStatus status; - icaltimezone *zone; - - /* Second, is it already completed? */ - - if (is_complete (comp)) { - retval = NULL; - goto out; - } - - /* Third, is it due today? */ - - /* Get the current time in the same timezone as the DUE date.*/ - /* FIXME: TIMEZONES: Handle error. */ - status = cal_client_get_timezone (model->priv->client, dt.tzid, - &zone); - now_tt = icaltime_current_time_with_zone (zone); - - if (icaltime_compare_date_only (*dt.value, now_tt) == 0) { - retval = calendar_config_get_tasks_due_today_color (); - goto out; - } - - /* Fourth, are we overdue as of right now? We use <= in the - * comparison below so that the table entries change color - * immediately. - */ - - if (icaltime_compare (*dt.value, now_tt) <= 0) - retval = calendar_config_get_tasks_overdue_color (); - else - retval = NULL; + switch (get_due_status (model, comp)) { + case CALENDAR_MODEL_DUE_NEVER: + case CALENDAR_MODEL_DUE_FUTURE: + case CALENDAR_MODEL_DUE_COMPLETE: + return NULL; + case CALENDAR_MODEL_DUE_TODAY: + return calendar_config_get_tasks_due_today_color (); + case CALENDAR_MODEL_DUE_OVERDUE: + return calendar_config_get_tasks_overdue_color (); } - out: - - cal_component_free_datetime (&dt); - - return retval; + return NULL; } static void * |