diff options
Diffstat (limited to 'calendar')
-rw-r--r-- | calendar/gui/alarm-notify/alarm-notify.c | 93 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/alarm-notify.h | 3 | ||||
-rw-r--r-- | calendar/gui/e-meeting-time-sel-item.c | 37 | ||||
-rw-r--r-- | calendar/gui/e-meeting-time-sel.c | 49 | ||||
-rw-r--r-- | calendar/gui/e-meeting-time-sel.h | 10 |
5 files changed, 133 insertions, 59 deletions
diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c index 3b5402b4a6..bc3af20e3c 100644 --- a/calendar/gui/alarm-notify/alarm-notify.c +++ b/calendar/gui/alarm-notify/alarm-notify.c @@ -49,6 +49,9 @@ struct _AlarmNotifyPrivate { ESourceList *source_lists[E_CAL_CLIENT_SOURCE_TYPE_LAST]; ESourceList *selected_calendars; GMutex *mutex; + + GSList *offline_sources; + guint offline_timeout_id; }; typedef struct { @@ -100,6 +103,21 @@ process_removal_in_hash (const gchar *uri, prd->removals = g_list_prepend (prd->removals, (gpointer) uri); } +static gint +find_slist_source_uri_cb (gconstpointer a, gconstpointer b) +{ + ESource *asource = (ESource *) a; + const gchar *buri = b; + gchar *auri; + gint res; + + auri = e_source_get_uri (asource); + res = g_strcmp0 (auri, buri); + g_free (auri); + + return res; +} + static void alarm_notify_list_changed_cb (ESourceList *source_list, AlarmNotify *an) @@ -139,9 +157,10 @@ alarm_notify_list_changed_cb (ESourceList *source_list, continue; uri = e_source_get_uri (source); - if (!g_hash_table_lookup (an->priv->uri_client_hash[source_type], uri)) { + if (!g_hash_table_lookup (an->priv->uri_client_hash[source_type], uri) && + !g_slist_find_custom (an->priv->offline_sources, uri, find_slist_source_uri_cb)) { debug (("Adding Calendar %s", uri)); - alarm_notify_add_calendar (an, source_type, source, FALSE); + alarm_notify_add_calendar (an, source_type, source); } g_free (uri); } @@ -194,7 +213,7 @@ alarm_notify_load_calendars (AlarmNotify *an, uri = e_source_get_uri (source); debug (("Loading Calendar %s", uri)); - alarm_notify_add_calendar (an, source_type, source, FALSE); + alarm_notify_add_calendar (an, source_type, source); g_free (uri); } @@ -222,6 +241,12 @@ alarm_notify_finalize (GObject *object) priv = ALARM_NOTIFY (object)->priv; + if (priv->offline_timeout_id) + g_source_remove (priv->offline_timeout_id); + priv->offline_timeout_id = 0; + g_slist_free_full (priv->offline_sources, g_object_unref); + priv->offline_sources = NULL; + for (ii = 0; ii < E_CAL_CLIENT_SOURCE_TYPE_LAST; ii++) { g_hash_table_foreach ( priv->uri_client_hash[ii], @@ -349,6 +374,32 @@ alarm_notify_new (GCancellable *cancellable, "application-id", APPLICATION_ID, NULL); } +static gboolean +try_open_offline_timeout_cb (gpointer user_data) +{ + AlarmNotify *an = ALARM_NOTIFY (user_data); + GSList *sources, *iter; + + g_return_val_if_fail (an != NULL, FALSE); + g_return_val_if_fail (an->priv != NULL, FALSE); + + sources = an->priv->offline_sources; + an->priv->offline_sources = NULL; + an->priv->offline_timeout_id = 0; + + for (iter = sources; iter; iter = iter->next) { + ESource *source = iter->data; + + alarm_notify_add_calendar (an, + GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (source), "source-type")), + source); + } + + g_slist_free_full (sources, g_object_unref); + + return FALSE; +} + static void client_opened_cb (GObject *source_object, GAsyncResult *result, @@ -360,11 +411,22 @@ client_opened_cb (GObject *source_object, ECalClient *cal_client; ECalClientSourceType source_type; const gchar *uri; + GError *error = NULL; + + e_client_utils_open_new_finish (source, result, &client, &error); + + if (client == NULL) { + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_REPOSITORY_OFFLINE)) { + if (an->priv->offline_timeout_id) + g_source_remove (an->priv->offline_timeout_id); + an->priv->offline_sources = g_slist_append (an->priv->offline_sources, g_object_ref (source)); + an->priv->offline_timeout_id = g_timeout_add_seconds (5 * 60, try_open_offline_timeout_cb, an); + } - e_client_utils_open_new_finish (source, result, &client, NULL); + g_clear_error (&error); - if (client == NULL) return; + } cal_client = E_CAL_CLIENT (client); source_type = e_cal_client_get_source_type (cal_client); @@ -385,8 +447,6 @@ client_opened_cb (GObject *source_object, * alarm_notify_add_calendar: * @an: An alarm notification service. * @uri: URI of the calendar to load. - * @load_afterwards: Whether this calendar should be loaded in the future - * when the alarm daemon starts up. * * Tells the alarm notification service to load a calendar and start monitoring * its alarms. It can optionally be made to save the URI of this calendar so @@ -395,8 +455,7 @@ client_opened_cb (GObject *source_object, void alarm_notify_add_calendar (AlarmNotify *an, ECalClientSourceType source_type, - ESource *source, - gboolean load_afterwards) + ESource *source) { AlarmNotifyPrivate *priv; EClientSourceType client_source_type; @@ -459,6 +518,8 @@ alarm_notify_add_calendar (AlarmNotify *an, client_source_type = E_CLIENT_SOURCE_TYPE_LAST; } + g_object_set_data (G_OBJECT (source), "source-type", GUINT_TO_POINTER (source_type)); + e_client_utils_open_new ( source, client_source_type, TRUE, NULL, e_client_utils_authenticate_handler, NULL, @@ -476,6 +537,7 @@ alarm_notify_remove_calendar (AlarmNotify *an, { AlarmNotifyPrivate *priv; ECalClient *cal_client; + GSList *in_offline; priv = an->priv; @@ -486,4 +548,17 @@ alarm_notify_remove_calendar (AlarmNotify *an, alarm_queue_remove_client (cal_client, FALSE); g_hash_table_remove (priv->uri_client_hash[source_type], str_uri); } + + in_offline = g_slist_find_custom (priv->offline_sources, str_uri, find_slist_source_uri_cb); + if (in_offline) { + ESource *source = in_offline->data; + + priv->offline_sources = g_slist_remove (priv->offline_sources, source); + if (!priv->offline_sources && priv->offline_timeout_id) { + g_source_remove (priv->offline_timeout_id); + priv->offline_timeout_id = 0; + } + + g_object_unref (source); + } } diff --git a/calendar/gui/alarm-notify/alarm-notify.h b/calendar/gui/alarm-notify/alarm-notify.h index f95a4d6b33..b48cd5a602 100644 --- a/calendar/gui/alarm-notify/alarm-notify.h +++ b/calendar/gui/alarm-notify/alarm-notify.h @@ -69,8 +69,7 @@ AlarmNotify * alarm_notify_new (GCancellable *cancellable, GError **error); void alarm_notify_add_calendar (AlarmNotify *an, ECalClientSourceType source_type, - ESource *source, - gboolean load_afterwards); + ESource *source); void alarm_notify_remove_calendar (AlarmNotify *an, ECalClientSourceType source_type, const gchar *str_uri); diff --git a/calendar/gui/e-meeting-time-sel-item.c b/calendar/gui/e-meeting-time-sel-item.c index 35f3a7d743..ced8414ef9 100644 --- a/calendar/gui/e-meeting-time-sel-item.c +++ b/calendar/gui/e-meeting-time-sel-item.c @@ -29,6 +29,9 @@ #include <time.h> #include <glib/gi18n.h> + +#include "e-util/e-datetime-format.h" + #include "calendar-config.h" #include "e-meeting-time-sel-item.h" #include "e-meeting-time-sel.h" @@ -389,9 +392,10 @@ e_meeting_time_selector_item_paint_day_top (EMeetingTimeSelectorItem *mts_item, { EMeetingTimeSelector *mts; gint y, grid_x; - gchar buffer[128], *format; + gchar *str; gint hour, hour_x, hour_y; PangoLayout *layout; + struct tm tm_time; cairo_save (cr); @@ -437,29 +441,31 @@ e_meeting_time_selector_item_paint_day_top (EMeetingTimeSelectorItem *mts_item, cairo_rel_line_to (cr, 0, height); cairo_stroke (cr); + g_date_to_struct_tm (date, &tm_time); + str = e_datetime_format_format_tm ("calendar", "table", DTFormatKindDate, &tm_time); + + g_return_if_fail (str != NULL); + /* Draw the date. Set a clipping rectangle so we don't draw over the * next day. */ - if (mts->date_format == E_MEETING_TIME_SELECTOR_DATE_FULL) - /* This is a strftime() format string %A = full weekday name, - * %B = full month name, %d = month day, %Y = full year. */ - format = _("%A, %B %d, %Y"); - else if (mts->date_format == E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY) - /* This is a strftime() format string %a = abbreviated weekday - * name, %m = month number, %d = month day, %Y = full year. */ - format = _("%a %m/%d/%Y"); - else - /* This is a strftime() format string %m = month number, - * %d = month day, %Y = full year. */ - format = _("%m/%d/%Y"); + if (mts->date_format == E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY + && !e_datetime_format_includes_day_name ("calendar", "table", DTFormatKindDate)) { + gchar buffer[128]; + gchar *tmp; + + g_date_strftime (buffer, sizeof (buffer), "%a", date); - g_date_strftime (buffer, sizeof (buffer), format, date); + tmp = str; + str = g_strconcat (buffer, " ", str, NULL); + g_free (tmp); + } cairo_save (cr); cairo_rectangle (cr, x, -scroll_y, mts->day_width - 2, mts->row_height - 2); cairo_clip (cr); - pango_layout_set_text (layout, buffer, -1); + pango_layout_set_text (layout, str, -1); cairo_move_to (cr, x + 2, 4 - scroll_y); pango_cairo_show_layout (cr, layout); @@ -484,6 +490,7 @@ e_meeting_time_selector_item_paint_day_top (EMeetingTimeSelectorItem *mts_item, g_object_unref (layout); cairo_restore (cr); + g_free (str); } /* This paints the colored bars representing busy periods for the combined diff --git a/calendar/gui/e-meeting-time-sel.c b/calendar/gui/e-meeting-time-sel.c index 36e7ad7d42..9957be998d 100644 --- a/calendar/gui/e-meeting-time-sel.c +++ b/calendar/gui/e-meeting-time-sel.c @@ -41,6 +41,7 @@ #include "misc/e-dateedit.h" #include "e-util/e-util.h" +#include "e-util/e-datetime-format.h" #include "e-meeting-utils.h" #include "e-meeting-list-view.h" @@ -2327,10 +2328,11 @@ e_meeting_time_selector_recalc_date_format (EMeetingTimeSelector *mts) GDate date; gint max_date_width, longest_weekday_width, longest_month_width, width; gint day, longest_weekday, month, longest_month; - gchar buffer[128]; + gchar buffer[128], *str; const gchar *name; PangoContext *pango_context; PangoLayout *layout; + struct tm tm_time; /* Set up Pango prerequisites */ pango_context = gtk_widget_get_pango_context (GTK_WIDGET (mts)); @@ -2368,28 +2370,6 @@ e_meeting_time_selector_recalc_date_format (EMeetingTimeSelector *mts) } } - /* See if we can use the full date. We want to use a date with a - * month day > 20 and also the longest weekday. We use a - * pre-calculated array of days for each month and add on the - * weekday (which is 1 (Mon) to 7 (Sun). */ - g_date_set_dmy (&date, days[longest_month - 1] + longest_weekday, - longest_month, 2000); - /* This is a strftime() format string %A = full weekday name, - * %B = full month name, %d = month day, %Y = full year. */ - g_date_strftime (buffer, sizeof (buffer), _("%A, %B %d, %Y"), &date); - -#if 0 - g_print ("longest_month: %i longest_weekday: %i date: %s\n", - longest_month, longest_weekday, buffer); -#endif - - pango_layout_set_text (layout, buffer, -1); - pango_layout_get_pixel_size (layout, &width, NULL); - if (width < max_date_width) { - mts->date_format = E_MEETING_TIME_SELECTOR_DATE_FULL; - return; - } - /* Now try it with abbreviated weekday names. */ longest_weekday_width = 0; longest_weekday = G_DATE_MONDAY; @@ -2405,16 +2385,28 @@ e_meeting_time_selector_recalc_date_format (EMeetingTimeSelector *mts) g_date_set_dmy (&date, days[longest_month - 1] + longest_weekday, longest_month, 2000); - /* This is a strftime() format string %a = abbreviated weekday name, - * %m = month number, %d = month day, %Y = full year. */ - g_date_strftime (buffer, sizeof (buffer), _("%a %m/%d/%Y"), &date); + + g_date_to_struct_tm (&date, &tm_time); + str = e_datetime_format_format_tm ("calendar", "table", DTFormatKindDate, &tm_time); + + g_return_if_fail (str != NULL); + + if (!e_datetime_format_includes_day_name ("calendar", "table", DTFormatKindDate)) { + gchar *tmp; + + g_date_strftime (buffer, sizeof (buffer), "%a", &date); + + tmp = str; + str = g_strconcat (buffer, " ", str, NULL); + g_free (tmp); + } #if 0 g_print ("longest_month: %i longest_weekday: %i date: %s\n", - longest_month, longest_weekday, buffer); + longest_month, longest_weekday, str); #endif - pango_layout_set_text (layout, buffer, -1); + pango_layout_set_text (layout, str, -1); pango_layout_get_pixel_size (layout, &width, NULL); if (width < max_date_width) mts->date_format = E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY; @@ -2422,6 +2414,7 @@ e_meeting_time_selector_recalc_date_format (EMeetingTimeSelector *mts) mts->date_format = E_MEETING_TIME_SELECTOR_DATE_SHORT; g_object_unref (layout); + g_free (str); } /* Turn off the background of the canvas windows. This reduces flicker diff --git a/calendar/gui/e-meeting-time-sel.h b/calendar/gui/e-meeting-time-sel.h index 7f45242006..7c3f7c3021 100644 --- a/calendar/gui/e-meeting-time-sel.h +++ b/calendar/gui/e-meeting-time-sel.h @@ -68,13 +68,13 @@ G_BEGIN_DECLS /* This is used to specify the format used when displaying the dates. - * The full format is like 'Sunday, September 12, 1999'. The abbreviated format - * is like 'Sun 12/9/99'. The short format is like '12/9/99'. The actual - * format used is determined in e_meeting_time_selector_style_set (), once we - * know the font being used. */ + * The abbreviated format is like 'Sun 12/9/99'. + * The short format is like '12/9/99'. + * The actual format used is determined in e_meeting_time_selector_style_set (), + * once we know the font being used. + */ typedef enum { - E_MEETING_TIME_SELECTOR_DATE_FULL, E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY, E_MEETING_TIME_SELECTOR_DATE_SHORT } EMeetingTimeSelectorDateFormat; |