aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/meeting-time-sel/e-meeting-time-sel.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/meeting-time-sel/e-meeting-time-sel.c')
-rw-r--r--widgets/meeting-time-sel/e-meeting-time-sel.c125
1 files changed, 76 insertions, 49 deletions
diff --git a/widgets/meeting-time-sel/e-meeting-time-sel.c b/widgets/meeting-time-sel/e-meeting-time-sel.c
index ecb57b1623..0cb9e4e8b9 100644
--- a/widgets/meeting-time-sel/e-meeting-time-sel.c
+++ b/widgets/meeting-time-sel/e-meeting-time-sel.c
@@ -1672,13 +1672,14 @@ e_meeting_time_selector_dump (EMeetingTimeSelector *mts)
EMeetingTimeSelectorPeriod,
period_num);
- g_date_strftime (buffer, 128, "%A, %B %d, %Y",
- &period->start.date);
+ /* These are just for debugging so don't need i18n. */
+ g_date_strftime (buffer, sizeof (buffer),
+ "%A, %B %d, %Y", &period->start.date);
g_print (" Start: %s %i:%02i\n", buffer,
period->start.hour, period->start.minute);
- g_date_strftime (buffer, 128, "%A, %B %d, %Y",
- &period->end.date);
+ g_date_strftime (buffer, sizeof (buffer),
+ "%A, %B %d, %Y", &period->end.date);
g_print (" End : %s %i:%02i\n", buffer,
period->end.hour, period->end.minute);
}
@@ -1697,7 +1698,9 @@ e_meeting_time_selector_dump_time (EMeetingTimeSelectorTime *mtstime)
gchar buffer2[128];
- g_date_strftime (buffer, 128, "%A, %B %d, %Y", &mtstime->date);
+ /* This is just for debugging so doesn't need i18n. */
+ g_date_strftime (buffer, sizeof (buffer), "%A, %B %d, %Y",
+ &mtstime->date);
sprintf (buffer2, " at %i:%02i", (gint) mtstime->hour,
(gint) mtstime->minute);
strcat (buffer, buffer2);
@@ -1713,7 +1716,8 @@ e_meeting_time_selector_dump_date (GDate *date)
{
static gchar buffer[128];
- g_date_strftime (buffer, 128, "%A, %B %d, %Y", date);
+ /* This is just for debugging so doesn't need i18n. */
+ g_date_strftime (buffer, sizeof (buffer), "%A, %B %d, %Y", date);
return buffer;
}
@@ -2411,71 +2415,92 @@ e_meeting_time_selector_get_meeting_time_positions (EMeetingTimeSelector *mts,
static void
e_meeting_time_selector_recalc_date_format (EMeetingTimeSelector *mts)
{
+ /* An array of dates, one for each month in the year 2000. They must
+ all be Sundays. */
+ static const int days[12] = { 23, 20, 19, 23, 21, 18,
+ 23, 20, 17, 22, 19, 24 };
GDate date;
- gint max_date_width, base_width, max_weekday_width, max_month_width;
- gint weekday, month;
+ gint max_date_width, longest_weekday_width, longest_month_width, width;
+ gint day, weekday, longest_weekday, month, longest_month;
gchar buffer[128];
GdkFont *font;
font = GTK_WIDGET (mts)->style->font;
- /* Check if we will be able to display the full date strings. */
- mts->date_format = E_MEETING_TIME_SELECTOR_DATE_SHORT;
- g_date_clear (&date, 1);
- g_date_set_dmy (&date, 20, 1, 2000);
-
/* Calculate the maximum date width we can fit into the display. */
max_date_width = mts->day_width - 2;
- /* First compute the width of the date string without the day or
- month names. */
- g_date_strftime (buffer, 128, ", %d, %Y", &date);
- base_width = gdk_string_width (font, buffer);
-
- /* If that doesn't fit just return. We have to use the short format.
- If that doesn't fit it will just be clipped. */
- if (gdk_string_width (font, buffer) > max_date_width)
- return;
-
- /* Now find the biggest weekday name. We start on any day and just
- go through seven days. */
- max_weekday_width = 0;
- for (weekday = 1; weekday <= 7; weekday++) {
- g_date_strftime (buffer, 128, "%A", &date);
- max_weekday_width = MAX (max_weekday_width,
- gdk_string_width (font, buffer));
+ /* Find the biggest full weekday name. We start on a particular
+ Monday and go through seven days. */
+ longest_weekday_width = 0;
+ g_date_clear (&date, 1);
+ g_date_set_dmy (&date, 3, 1, 2000); /* Monday 3rd Jan 2000. */
+ for (day = G_DATE_MONDAY; day <= G_DATE_SUNDAY; day++) {
+ g_date_strftime (buffer, sizeof (buffer), "%A", &date);
+ width = gdk_string_width (font, buffer);
+ if (width > longest_weekday_width) {
+ longest_weekday = day;
+ longest_weekday_width = width;
+ }
g_date_add_days (&date, 1);
}
/* Now find the biggest month name. */
- max_month_width = 0;
- for (month = 1; month <= 12; month++) {
+ longest_month_width = 0;
+ for (month = G_DATE_JANUARY; month <= G_DATE_DECEMBER; month++) {
g_date_set_month (&date, month);
- g_date_strftime (buffer, 128, "%B", &date);
- max_month_width = MAX (max_month_width,
- gdk_string_width (font, buffer));
+ g_date_strftime (buffer, sizeof (buffer), "%B", &date);
+ width = gdk_string_width (font, buffer);
+ if (width > longest_month_width) {
+ longest_month = month;
+ longest_month_width = width;
+ }
}
- /* See if we can use the full date. */
- if (base_width + max_month_width + max_weekday_width <= max_date_width) {
+ /* 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);
+
+ g_print ("longest_month: %i longest_weekday: %i date: %s\n",
+ longest_month, longest_weekday, buffer);
+
+ if (gdk_string_width (font, buffer) < max_date_width) {
mts->date_format = E_MEETING_TIME_SELECTOR_DATE_FULL;
return;
}
/* Now try it with abbreviated weekday names. */
- g_date_strftime (buffer, 128, " %x", &date);
- base_width = gdk_string_width (font, buffer);
-
- max_weekday_width = 0;
- for (weekday = 1; weekday <= 7; weekday++) {
- g_date_strftime (buffer, 128, "%a", &date);
- max_weekday_width = MAX (max_weekday_width,
- gdk_string_width (font, buffer));
+ longest_weekday_width = 0;
+ g_date_set_dmy (&date, 3, 1, 2000); /* Monday 3rd Jan 2000. */
+ for (day = G_DATE_MONDAY; day <= G_DATE_SUNDAY; day++) {
+ g_date_strftime (buffer, sizeof (buffer), "%a", &date);
+ width = gdk_string_width (font, buffer);
+ if (width > longest_weekday_width) {
+ longest_weekday = weekday;
+ longest_weekday_width = width;
+ }
g_date_add_days (&date, 1);
}
- if (base_width + max_weekday_width <= max_date_width)
+ 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_print ("longest_month: %i longest_weekday: %i date: %s\n",
+ longest_month, longest_weekday, buffer);
+
+ if (gdk_string_width (font, buffer) < max_date_width)
mts->date_format = E_MEETING_TIME_SELECTOR_DATE_ABBREVIATED_DAY;
+ else
+ mts->date_format = E_MEETING_TIME_SELECTOR_DATE_SHORT;
}
@@ -3052,16 +3077,18 @@ e_meeting_time_selector_update_attendees_list_positions (EMeetingTimeSelector *m
gnome_canvas_item_set
(attendee->text_item,
"font_gdk", font,
- "y", (gdouble) (row * mts->row_height + 1
- + E_MEETING_TIME_SELECTOR_TEXT_Y_PAD),
"clip_width", (gdouble) item_width,
"clip_height", (gdouble) (font->ascent
+ font->descent),
NULL);
+ e_canvas_item_move_absolute (attendee->text_item,
+ E_MEETING_TIME_SELECTOR_ICON_COLUMN_WIDTH
+ + E_MEETING_TIME_SELECTOR_TEXT_X_PAD,
+ row * mts->row_height + 1 + E_MEETING_TIME_SELECTOR_TEXT_Y_PAD);
+
gnome_canvas_item_show (attendee->text_item);
}
-
}