From 70708440caf29c52e8d2a07872304a4874590fbe Mon Sep 17 00:00:00 2001 From: Damon Chaplin Date: Sun, 28 Oct 2001 02:26:21 +0000 Subject: when the week start day is set to Sunday, we have to be careful to make 2001-10-27 Damon Chaplin * gui/print.c (print_week_view): (range_selector_new): when the week start day is set to Sunday, we have to be careful to make sure we print the correct week, since the previous Saturday is actually printed first. Fixes bug #13687. (print_week_summary): always set compress_weekend to true if multi_week_view is FALSE (i.e. we are printing the week view). Fixes bug #13688. * gui/e-itip-control.c (send_freebusy): use the timezones from the DTSTART and DTEND. (write_label_piece): output the date-time and the timezone after it. Note that we may want to convert it to the current timezone and display that as well. Also converted COMPLETED to the current timezone. And fixed all uses of old timezone functions. * gui/dialogs/comp-editor.c (commit_all_fields): added function to set the focus in the window to NULL, so all fields lose their focus, so they emit "changed" signals and update their values if needed. We call this when most menu commands are used, e.g. 'Save and Close', 'Print' etc. Fixes bug #11434. In future we should also check fields are valid and show dialogs if they are not. * gui/calendar-model.c (get_completed): use the completed value properly. Fixes bug #13694. * cal-util/timeutil.c (icaltimetype_to_tm_with_zone): don't check from_zone and to_zone != NULL. A NULL zone is valid, it is for floating times. svn path=/trunk/; revision=14266 --- calendar/ChangeLog | 33 +++++++++++ calendar/cal-util/timeutil.c | 2 - calendar/gui/calendar-model.c | 3 +- calendar/gui/dialogs/comp-editor.c | 25 +++++++++ calendar/gui/e-itip-control.c | 111 ++++++++++++++++++++++++++----------- calendar/gui/e-timezone-entry.c | 10 +--- calendar/gui/print.c | 27 +++++++-- 7 files changed, 160 insertions(+), 51 deletions(-) diff --git a/calendar/ChangeLog b/calendar/ChangeLog index ee314f4445..68ae2e00a1 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,36 @@ +2001-10-27 Damon Chaplin + + * gui/print.c (print_week_view): + (range_selector_new): when the week start day is set to Sunday, we + have to be careful to make sure we print the correct week, since + the previous Saturday is actually printed first. Fixes bug #13687. + (print_week_summary): always set compress_weekend to true if + multi_week_view is FALSE (i.e. we are printing the week view). + Fixes bug #13688. + + * gui/e-itip-control.c (send_freebusy): use the timezones from the + DTSTART and DTEND. + (write_label_piece): output the date-time and the timezone after it. + Note that we may want to convert it to the current timezone and display + that as well. Also converted COMPLETED to the current timezone. + And fixed all uses of old timezone functions. + + * gui/dialogs/comp-editor.c (commit_all_fields): added function to + set the focus in the window to NULL, so all fields lose their focus, + so they emit "changed" signals and update their values if needed. + We call this when most menu commands are used, e.g. 'Save and Close', + 'Print' etc. Fixes bug #11434. In future we should also check fields + are valid and show dialogs if they are not. + + * gui/calendar-model.c (get_completed): use the completed value + properly. Fixes bug #13694. + + * cal-util/timeutil.c (icaltimetype_to_tm_with_zone): don't check + from_zone and to_zone != NULL. A NULL zone is valid, it is for + floating times. + +2001-10-27 Federico Mena Quintero + 2001-10-27 Federico Mena Quintero * gui/e-day-view.c (e_day_view_on_text_item_event): Cancel editing diff --git a/calendar/cal-util/timeutil.c b/calendar/cal-util/timeutil.c index c6f6e33bcf..3dcf8dc384 100644 --- a/calendar/cal-util/timeutil.c +++ b/calendar/cal-util/timeutil.c @@ -566,8 +566,6 @@ icaltimetype_to_tm_with_zone (struct icaltimetype *itt, tm.tm_isdst = -1; g_return_val_if_fail (itt != NULL, tm); - g_return_val_if_fail (from_zone != NULL, tm); - g_return_val_if_fail (to_zone != NULL, tm); itt_copy = *itt; diff --git a/calendar/gui/calendar-model.c b/calendar/gui/calendar-model.c index 284940f525..7e8cc5665b 100644 --- a/calendar/gui/calendar-model.c +++ b/calendar/gui/calendar-model.c @@ -432,7 +432,6 @@ get_completed (CalendarModel *model, int row) { CalendarModelPrivate *priv; - CalComponentDateTime dt; CalendarModelObjectData *object_data; struct icaltimetype *completed; @@ -446,7 +445,7 @@ get_completed (CalendarModel *model, if (completed) { object_data->completed = g_new (ECellDateEditValue, 1); - object_data->completed->tt = *dt.value; + object_data->completed->tt = *completed; object_data->completed->zone = icaltimezone_get_utc_timezone (); cal_component_free_icaltimetype (completed); } else { diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index dc7d01cbde..4f83b02dc4 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -1008,12 +1008,27 @@ comp_editor_focus (CompEditor *editor) raise_and_focus (priv->window); } +/* This sets the focus to the toplevel, so any field being edited is committed. + FIXME: In future we may also want to check some of the fields are valid, + e.g. the EDateEdit fields. */ +static void +commit_all_fields (CompEditor *editor) +{ + CompEditorPrivate *priv; + + priv = editor->priv; + + gtk_window_set_focus (GTK_WINDOW (priv->window), NULL); +} + /* Menu Commands */ static void save_cmd (GtkWidget *widget, gpointer data) { CompEditor *editor = COMP_EDITOR (data); + commit_all_fields (editor); + save_comp_with_send (editor); } @@ -1022,6 +1037,8 @@ save_close_cmd (GtkWidget *widget, gpointer data) { CompEditor *editor = COMP_EDITOR (data); + commit_all_fields (editor); + if (save_comp_with_send (editor)) close_dialog (editor); } @@ -1091,6 +1108,8 @@ save_as_cmd (GtkWidget *widget, gpointer data) priv = editor->priv; + commit_all_fields (editor); + fs = GTK_FILE_SELECTION (gtk_file_selection_new (_("Save As..."))); path = g_strdup_printf ("%s/", g_get_home_dir ()); gtk_file_selection_set_filename (fs, path); @@ -1131,6 +1150,8 @@ print_cmd (GtkWidget *widget, gpointer data) CompEditor *editor = COMP_EDITOR (data); CalComponent *comp; + commit_all_fields (editor); + comp = comp_editor_get_current_comp (editor); print_comp (comp, editor->priv->client, FALSE); gtk_object_unref (GTK_OBJECT (comp)); @@ -1142,6 +1163,8 @@ print_preview_cmd (GtkWidget *widget, gpointer data) CompEditor *editor = COMP_EDITOR (data); CalComponent *comp; + commit_all_fields (editor); + comp = comp_editor_get_current_comp (editor); print_comp (comp, editor->priv->client, TRUE); gtk_object_unref (GTK_OBJECT (comp)); @@ -1163,6 +1186,8 @@ close_cmd (GtkWidget *widget, gpointer data) { CompEditor *editor = COMP_EDITOR (data); + commit_all_fields (editor); + if (prompt_to_save_changes (editor, TRUE)) close_dialog (editor); } diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c index 1b1ab423ba..3eac9366ab 100644 --- a/calendar/gui/e-itip-control.c +++ b/calendar/gui/e-itip-control.c @@ -36,10 +36,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -433,18 +435,32 @@ set_button_status (EItipControl *itip) } static void -write_label_piece (time_t t, char *buffer, int size, const char *stext, const char *etext) +write_label_piece (EItipControl *itip, CalComponentDateTime *dt, + char *buffer, int size, + const char *stext, const char *etext, gboolean is_utc) { - struct tm *tmp_tm; - int len; + EItipControlPrivate *priv; + struct tm tmp_tm; char time_buf[64], *time_utf8; + icaltimezone *zone = NULL; + char *display_name; + + priv = itip->priv; + + /* If we have been passed a UTC value, i.e. for the COMPLETED property, + we convert it to the current timezone to display. */ + if (is_utc) { + char *location = calendar_config_get_timezone (); + zone = icaltimezone_get_builtin_timezone (location); + icaltimezone_convert_time (dt->value, icaltimezone_get_utc_timezone (), zone); + } + + tmp_tm = icaltimetype_to_tm (dt->value); - /* FIXME: Convert to an appropriate timezone. */ - tmp_tm = localtime (&t); if (stext != NULL) strcat (buffer, stext); - e_time_format_date_and_time (tmp_tm, + e_time_format_date_and_time (&tmp_tm, calendar_config_get_24_hour_format (), FALSE, FALSE, time_buf, sizeof (time_buf)); @@ -453,44 +469,59 @@ write_label_piece (time_t t, char *buffer, int size, const char *stext, const ch strcat (buffer, time_utf8); g_free (time_utf8); + if (!is_utc && dt->tzid) { + zone = icalcomponent_get_timezone (priv->top_level, dt->tzid); + } + + /* Output timezone after time, e.g. " America/New_York". */ + if (zone) { + display_name = icaltimezone_get_display_name (zone); + /* These are ASCII strings, so should be OK as UTF-8.*/ + if (display_name) { + strcat (buffer, " "); + strcat (buffer, display_name); + } + } + if (etext != NULL) strcat (buffer, etext); } static void -set_date_label (GtkHTML *html, GtkHTMLStream *html_stream, CalComponent *comp) +set_date_label (EItipControl *itip, GtkHTML *html, GtkHTMLStream *html_stream, + CalComponent *comp) { + EItipControlPrivate *priv; CalComponentDateTime datetime; - time_t start = 0, end = 0, complete = 0, due = 0; static char buffer[1024]; - gboolean wrote = FALSE; + gboolean wrote = FALSE, task_completed = FALSE; CalComponentVType type; + priv = itip->priv; + type = cal_component_get_vtype (comp); - /* FIXME: timezones. */ buffer[0] = '\0'; cal_component_get_dtstart (comp, &datetime); if (datetime.value) { - start = icaltime_as_timet (*datetime.value); switch (type) { case CAL_COMPONENT_EVENT: - write_label_piece (start, buffer, 1024, + write_label_piece (itip, &datetime, buffer, 1024, U_("Meeting begins: "), - "
"); + "
", FALSE); break; case CAL_COMPONENT_TODO: - write_label_piece (start, buffer, 1024, + write_label_piece (itip, &datetime, buffer, 1024, U_("Task begins: "), - "
"); + "
", FALSE); break; case CAL_COMPONENT_FREEBUSY: - write_label_piece (start, buffer, 1024, + write_label_piece (itip, &datetime, buffer, 1024, U_("Free/Busy info begins: "), - "
"); + "
", FALSE); break; default: - write_label_piece (start, buffer, 1024, U_("Begins: "), "
"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Begins: "), "
", FALSE); } gtk_html_write (html, html_stream, buffer, strlen(buffer)); wrote = TRUE; @@ -500,17 +531,16 @@ set_date_label (GtkHTML *html, GtkHTMLStream *html_stream, CalComponent *comp) buffer[0] = '\0'; cal_component_get_dtend (comp, &datetime); if (datetime.value){ - end = icaltime_as_timet (*datetime.value); switch (type) { case CAL_COMPONENT_EVENT: - write_label_piece (end, buffer, 1024, U_("Meeting ends: "), "
"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Meeting ends: "), "
", FALSE); break; case CAL_COMPONENT_FREEBUSY: - write_label_piece (end, buffer, 1024, U_("Free/Busy info ends: "), - "
"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Free/Busy info ends: "), + "
", FALSE); break; default: - write_label_piece (end, buffer, 1024, U_("Ends: "), "
"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Ends: "), "
", FALSE); } gtk_html_write (html, html_stream, buffer, strlen (buffer)); wrote = TRUE; @@ -521,18 +551,19 @@ set_date_label (GtkHTML *html, GtkHTMLStream *html_stream, CalComponent *comp) datetime.tzid = NULL; cal_component_get_completed (comp, &datetime.value); if (type == CAL_COMPONENT_TODO && datetime.value) { - complete = icaltime_as_timet (*datetime.value); - write_label_piece (complete, buffer, 1024, U_("Task Completed: "), "
"); + /* Pass TRUE as is_utc, so it gets converted to the current + timezone. */ + write_label_piece (itip, &datetime, buffer, 1024, U_("Task Completed: "), "
", TRUE); gtk_html_write (html, html_stream, buffer, strlen (buffer)); wrote = TRUE; + task_completed = TRUE; } cal_component_free_datetime (&datetime); buffer[0] = '\0'; cal_component_get_due (comp, &datetime); - if (type == CAL_COMPONENT_TODO && complete == 0 && datetime.value) { - due = icaltime_as_timet (*datetime.value); - write_label_piece (due, buffer, 1024, U_("Task Due: "), "
"); + if (type == CAL_COMPONENT_TODO && !task_completed && datetime.value) { + write_label_piece (itip, &datetime, buffer, 1024, U_("Task Due: "), "
", FALSE); gtk_html_write (html, html_stream, buffer, strlen (buffer)); wrote = TRUE; } @@ -683,7 +714,7 @@ write_html (EItipControl *itip, const gchar *itip_desc, const gchar *itip_title, set_message (GTK_HTML (priv->html), html_stream, itip_title, FALSE); /* Date information */ - set_date_label (GTK_HTML (priv->html), html_stream, priv->comp); + set_date_label (itip, GTK_HTML (priv->html), html_stream, priv->comp); /* Summary */ cal_component_get_summary (priv->comp, &text); @@ -1316,14 +1347,30 @@ send_freebusy (EItipControl *itip) time_t start, end; GtkWidget *dialog; GList *comp_list; + icaltimezone *zone; priv = itip->priv; - /* FIXME: timezones and free these. */ cal_component_get_dtstart (priv->comp, &datetime); - start = icaltime_as_timet (*datetime.value); + if (datetime.tzid) { + zone = icalcomponent_get_timezone (priv->top_level, + datetime.tzid); + } else { + zone = NULL; + } + start = icaltime_as_timet_with_zone (*datetime.value, zone); + cal_component_free_datetime (&datetime); + cal_component_get_dtend (priv->comp, &datetime); - end = icaltime_as_timet (*datetime.value); + if (datetime.tzid) { + zone = icalcomponent_get_timezone (priv->top_level, + datetime.tzid); + } else { + zone = NULL; + } + end = icaltime_as_timet_with_zone (*datetime.value, zone); + cal_component_free_datetime (&datetime); + comp_list = cal_client_get_free_busy (priv->event_client, NULL, start, end); if (comp_list) { diff --git a/calendar/gui/e-timezone-entry.c b/calendar/gui/e-timezone-entry.c index 32739f5d5a..eb8ebe8df4 100644 --- a/calendar/gui/e-timezone-entry.c +++ b/calendar/gui/e-timezone-entry.c @@ -319,15 +319,7 @@ e_timezone_entry_set_timezone (ETimezoneEntry *tentry, static char* e_timezone_entry_get_display_name (icaltimezone *zone) { - char *display_name; - - display_name = icaltimezone_get_location (zone); - if (!display_name) - display_name = icaltimezone_get_tznames (zone); - if (!display_name) - display_name = icaltimezone_get_tzid (zone); - - return display_name; + return icaltimezone_get_display_name (zone); } diff --git a/calendar/gui/print.c b/calendar/gui/print.c index c9cca5667b..ba96781ccf 100644 --- a/calendar/gui/print.c +++ b/calendar/gui/print.c @@ -1495,7 +1495,10 @@ print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal, psi.month = month; /* Get a few config settings. */ - psi.compress_weekend = calendar_config_get_compress_weekend (); + if (multi_week_view) + psi.compress_weekend = calendar_config_get_compress_weekend (); + else + psi.compress_weekend = TRUE; psi.use_24_hour_format = calendar_config_get_24_hour_format (); /* We convert this from (0 = Sun, 6 = Sat) to (0 = Mon, 6 = Sun). */ @@ -1837,9 +1840,15 @@ range_selector_new (GtkWidget *dialog, time_t at, int *view) week_start_day = calendar_config_get_week_start_day (); week_begin = time_week_begin_with_zone (at, week_start_day, zone); /* If the week starts on a Sunday, we have to show the Saturday first, - since the weekend is compressed. */ - if (week_start_day == 0) - week_begin = time_add_day_with_zone (week_begin, -1, zone); + since the weekend is compressed. If the original date passed in was + a Saturday, we need to move on to the next Saturday, else we move + back to the last one. */ + if (week_start_day == 0) { + if (tm.tm_wday == 6) + week_begin = time_add_day_with_zone (week_begin, 6, zone); + else + week_begin = time_add_day_with_zone (week_begin, -1, zone); + } week_end = time_add_day_with_zone (week_begin, 6, zone); week_begin_tm = *convert_timet_to_struct_tm (week_begin, zone); @@ -1955,18 +1964,24 @@ print_week_view (GnomePrintContext *pc, GnomeCalendar *gcal, time_t date, char buf[100]; time_t when; gint week_start_day; + struct tm tm; header = top - HEADER_HEIGHT; /* FIXME: What is the name supposed to be for? */ gnome_print_beginpage (pc, "Calendar Week View"); + tm = *convert_timet_to_struct_tm (date, zone); week_start_day = calendar_config_get_week_start_day (); when = time_week_begin_with_zone (date, week_start_day, zone); /* If the week starts on a Sunday, we have to show the Saturday first, since the weekend is compressed. */ - if (week_start_day == 0) - when = time_add_day_with_zone (when, -1, zone); + if (week_start_day == 0) { + if (tm.tm_wday == 6) + when = time_add_day_with_zone (when, 6, zone); + else + when = time_add_day_with_zone (when, -1, zone); + } /* Print the main week view. */ print_week_summary (pc, gcal, when, FALSE, 1, 0, -- cgit