diff options
-rw-r--r-- | calendar/ChangeLog | 33 | ||||
-rw-r--r-- | calendar/cal-util/timeutil.c | 2 | ||||
-rw-r--r-- | calendar/gui/calendar-model.c | 3 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 25 | ||||
-rw-r--r-- | calendar/gui/e-itip-control.c | 111 | ||||
-rw-r--r-- | calendar/gui/e-timezone-entry.c | 10 | ||||
-rw-r--r-- | 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 <damon@ximian.com> + + * 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 <federico@ximian.com> + 2001-10-27 Federico Mena Quintero <federico@ximian.com> * 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 <libgnomeui/gnome-stock.h> #include <libgnomeui/gnome-dialog.h> #include <libgnomeui/gnome-dialog-util.h> +#include <gal/widgets/e-unicode.h> #include <gtkhtml/gtkhtml.h> #include <gtkhtml/gtkhtml-stream.h> #include <ical.h> #include <cal-util/cal-component.h> +#include <cal-util/timeutil.h> #include <cal-client/cal-client.h> #include <e-util/e-time-utils.h> #include <e-util/e-dialog-widgets.h> @@ -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: <b>"), - "</b><br>"); + "</b><br>", FALSE); break; case CAL_COMPONENT_TODO: - write_label_piece (start, buffer, 1024, + write_label_piece (itip, &datetime, buffer, 1024, U_("Task begins: <b>"), - "</b><br>"); + "</b><br>", FALSE); break; case CAL_COMPONENT_FREEBUSY: - write_label_piece (start, buffer, 1024, + write_label_piece (itip, &datetime, buffer, 1024, U_("Free/Busy info begins: <b>"), - "</b><br>"); + "</b><br>", FALSE); break; default: - write_label_piece (start, buffer, 1024, U_("Begins: <b>"), "</b><br>"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Begins: <b>"), "</b><br>", 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: <b>"), "</b><br>"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Meeting ends: <b>"), "</b><br>", FALSE); break; case CAL_COMPONENT_FREEBUSY: - write_label_piece (end, buffer, 1024, U_("Free/Busy info ends: <b>"), - "</b><br>"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Free/Busy info ends: <b>"), + "</b><br>", FALSE); break; default: - write_label_piece (end, buffer, 1024, U_("Ends: <b>"), "</b><br>"); + write_label_piece (itip, &datetime, buffer, 1024, U_("Ends: <b>"), "</b><br>", 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: <b>"), "</b><br>"); + /* Pass TRUE as is_utc, so it gets converted to the current + timezone. */ + write_label_piece (itip, &datetime, buffer, 1024, U_("Task Completed: <b>"), "</b><br>", 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: <b>"), "</b><br>"); + if (type == CAL_COMPONENT_TODO && !task_completed && datetime.value) { + write_label_piece (itip, &datetime, buffer, 1024, U_("Task Due: <b>"), "</b><br>", 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, |