diff options
Diffstat (limited to 'calendar/gui/dialogs')
-rw-r--r-- | calendar/gui/dialogs/alarm-page.c | 1 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor-page.h | 6 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor-util.c | 70 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor-util.h | 2 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 1 | ||||
-rw-r--r-- | calendar/gui/dialogs/event-page.c | 188 | ||||
-rw-r--r-- | calendar/gui/dialogs/recurrence-page.c | 28 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-page.c | 21 |
8 files changed, 199 insertions, 118 deletions
diff --git a/calendar/gui/dialogs/alarm-page.c b/calendar/gui/dialogs/alarm-page.c index 811760eb6f..649a86f025 100644 --- a/calendar/gui/dialogs/alarm-page.c +++ b/calendar/gui/dialogs/alarm-page.c @@ -506,6 +506,7 @@ alarm_page_fill_widgets (CompEditorPage *page, CalComponent *comp) /* Dates */ comp_editor_dates (&dates, comp); alarm_page_set_dates (page, &dates); + comp_editor_free_dates (&dates); /* List */ if (!cal_component_has_alarms (comp)) diff --git a/calendar/gui/dialogs/comp-editor-page.h b/calendar/gui/dialogs/comp-editor-page.h index 6565d9888e..af8fe1f389 100644 --- a/calendar/gui/dialogs/comp-editor-page.h +++ b/calendar/gui/dialogs/comp-editor-page.h @@ -39,9 +39,9 @@ BEGIN_GNOME_DECLS #define IS_COMP_EDITOR_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), TYPE_COMP_EDITOR_PAGE)) typedef struct { - struct icaltimetype *start; - struct icaltimetype *end; - struct icaltimetype *due; + CalComponentDateTime *start; + CalComponentDateTime *end; + CalComponentDateTime *due; struct icaltimetype *complete; } CompEditorPageDates; diff --git a/calendar/gui/dialogs/comp-editor-util.c b/calendar/gui/dialogs/comp-editor-util.c index 375d51918f..5d10942a5e 100644 --- a/calendar/gui/dialogs/comp-editor-util.c +++ b/calendar/gui/dialogs/comp-editor-util.c @@ -46,20 +46,13 @@ * @comp: The component to extract the dates from * * Extracts the dates from the calendar component into the - * CompEditorPageDates structure. Note that it returns pointers to static - * structs, so these will be overwritten in the next call. + * CompEditorPageDates structure. Call comp_editor_free_dates() to free the + * results. **/ void comp_editor_dates (CompEditorPageDates *dates, CalComponent *comp) { - static struct icaltimetype start; - static struct icaltimetype end; - static struct icaltimetype due; - static struct icaltimetype complete; - CalComponentDateTime dt; - struct icaltimetype *comp_complete; - dates->start = NULL; dates->end = NULL; @@ -68,33 +61,46 @@ comp_editor_dates (CompEditorPageDates *dates, CalComponent *comp) cal_component_get_dtstart (comp, &dt); if (dt.value) { - start = *dt.value; - dates->start = &start; + dates->start = g_new (CalComponentDateTime, 1); + *dates->start = dt; } - cal_component_free_datetime (&dt); cal_component_get_dtend (comp, &dt); if (dt.value) { - end = *dt.value; - dates->end = &end; + dates->end = g_new (CalComponentDateTime, 1); + *dates->end = dt; } - cal_component_free_datetime (&dt); cal_component_get_due (comp, &dt); if (dt.value) { - due = *dt.value; - dates->due = &due; + dates->due = g_new (CalComponentDateTime, 1); + *dates->due = dt; } - cal_component_free_datetime (&dt); - cal_component_get_completed (comp, &comp_complete); - if (comp_complete) { - complete = *comp_complete; - dates->complete = &complete; - cal_component_free_icaltimetype (comp_complete); - } + cal_component_get_completed (comp, &dates->complete); } + +/* This frees the dates in the CompEditorPageDates struct. But it doesn't free + * the struct (as that is usually static). + */ +void +comp_editor_free_dates (CompEditorPageDates *dates) +{ + if (dates->start) + cal_component_free_datetime (dates->start); + + if (dates->end) + cal_component_free_datetime (dates->end); + + if (dates->due) + cal_component_free_datetime (dates->due); + + if (dates->complete) + cal_component_free_icaltimetype (dates->complete); +} + + static void write_label_piece (struct icaltimetype *tt, char *buffer, int size, char *stext, char *etext) @@ -143,20 +149,22 @@ comp_editor_date_label (CompEditorPageDates *dates, GtkWidget *label) buffer[0] = '\0'; - if (dates->start && !icaltime_is_null_time (*dates->start)) + if (dates->start && !icaltime_is_null_time (*dates->start->value)) start_set = TRUE; - if (dates->end && !icaltime_is_null_time (*dates->end)) + if (dates->end && !icaltime_is_null_time (*dates->end->value)) end_set = TRUE; if (dates->complete && !icaltime_is_null_time (*dates->complete)) complete_set = TRUE; - if (dates->due && !icaltime_is_null_time (*dates->due)) + if (dates->due && !icaltime_is_null_time (*dates->due->value)) due_set = TRUE; if (start_set) - write_label_piece (dates->start, buffer, 1024, NULL, NULL); + write_label_piece (dates->start->value, buffer, 1024, + NULL, NULL); if (start_set && end_set) - write_label_piece (dates->end, buffer, 1024, _(" to "), NULL); + write_label_piece (dates->end->value, buffer, 1024, + _(" to "), NULL); if (complete_set) { if (start_set) @@ -167,9 +175,9 @@ comp_editor_date_label (CompEditorPageDates *dates, GtkWidget *label) if (due_set && dates->complete == NULL) { if (start_set) - write_label_piece (dates->due, buffer, 1024, _(" (Due "), ")"); + write_label_piece (dates->due->value, buffer, 1024, _(" (Due "), ")"); else - write_label_piece (dates->due, buffer, 1024, _("Due "), NULL); + write_label_piece (dates->due->value, buffer, 1024, _("Due "), NULL); } gtk_label_set_text (GTK_LABEL (label), buffer); diff --git a/calendar/gui/dialogs/comp-editor-util.h b/calendar/gui/dialogs/comp-editor-util.h index 23f3937a9a..37c1c0d5f7 100644 --- a/calendar/gui/dialogs/comp-editor-util.h +++ b/calendar/gui/dialogs/comp-editor-util.h @@ -28,6 +28,8 @@ #include "comp-editor-page.h" void comp_editor_dates (CompEditorPageDates *date, CalComponent *comp); +void comp_editor_free_dates (CompEditorPageDates *dates); + void comp_editor_date_label (CompEditorPageDates *dates, GtkWidget *label); GtkWidget *comp_editor_new_date_edit (gboolean show_date, gboolean show_time, diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index dcec6bb251..593544c11f 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -116,7 +116,6 @@ static EPixmap pixmaps [] = E_PIXMAP ("/Toolbar/FileSaveAndClose", "buttons/save-24.png"), E_PIXMAP ("/Toolbar/FilePrint", "buttons/print.png"), - E_PIXMAP ("/Toolbar/FilePrintPreview", "buttons/print-preview-24.png"), E_PIXMAP ("/Toolbar/FileDelete", "buttons/delete-message.png"), E_PIXMAP_END diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c index 74fdecb6ee..8a1415b9d2 100644 --- a/calendar/gui/dialogs/event-page.c +++ b/calendar/gui/dialogs/event-page.c @@ -561,7 +561,7 @@ event_page_fill_component (CompEditorPage *page, CalComponent *comp) char *cat, *str; CalComponentClassification classif; CalComponentTransparency transparency; - icaltimezone *zone = NULL; + icaltimezone *start_zone, *end_zone; epage = EVENT_PAGE (page); priv = epage->priv; @@ -619,13 +619,13 @@ event_page_fill_component (CompEditorPage *page, CalComponent *comp) all_day_event = e_dialog_toggle_get (priv->all_day_event); if (all_day_event) { - char *location; - - location = calendar_config_get_timezone (); - zone = icaltimezone_get_builtin_timezone (location); + char *location = calendar_config_get_timezone (); + start_zone = end_zone = icaltimezone_get_builtin_timezone (location); + } else { + start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone)); + end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone)); } - date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_time), &icaltime.year, &icaltime.month, @@ -634,10 +634,7 @@ event_page_fill_component (CompEditorPage *page, CalComponent *comp) &icaltime.hour, &icaltime.minute); g_assert (date_set); - if (!all_day_event) - zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone)); - if (zone) - date.tzid = icaltimezone_get_tzid (zone); + date.tzid = icaltimezone_get_tzid (start_zone); cal_component_set_dtstart (comp, &date); date_set = e_date_edit_get_date (E_DATE_EDIT (priv->end_time), @@ -656,10 +653,7 @@ event_page_fill_component (CompEditorPage *page, CalComponent *comp) icaltime_adjust (&icaltime, 1, 0, 0, 0); } - if (!all_day_event) - zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone)); - if (zone) - date.tzid = icaltimezone_get_tzid (zone); + date.tzid = icaltimezone_get_tzid (end_zone); cal_component_set_dtend (comp, &date); @@ -787,27 +781,79 @@ summary_changed_cb (GtkEditable *editable, gpointer data) g_free (summary); } -/* Callback used when the start or end date widgets change. We check that the - * start date < end date and we set the "all day event" button as appropriate. - */ + static void -date_changed_cb (EDateEdit *dedit, gpointer data) +notify_dates_changed (EventPage *epage, struct icaltimetype *start_tt, + struct icaltimetype *end_tt) { - EventPage *epage; EventPagePrivate *priv; CompEditorPageDates dates; + CalComponentDateTime start_dt, end_dt; + gboolean all_day_event; + icaltimezone *start_zone, *end_zone; + + priv = epage->priv; + + all_day_event = e_dialog_toggle_get (priv->all_day_event); + + start_dt.value = start_tt; + end_dt.value = end_tt; + + if (all_day_event) { + /* FIXME: When we switch to using DATE values we'll set the + TZIDs to NULL. */ + char *location; + + location = calendar_config_get_timezone (); + start_zone = end_zone = icaltimezone_get_builtin_timezone (location); + } else { + start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone)); + end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone)); + } + + start_dt.tzid = start_zone ? icaltimezone_get_tzid (start_zone) : NULL; + end_dt.tzid = end_zone ? icaltimezone_get_tzid (end_zone) : NULL; + + dates.start = &start_dt; + dates.end = &end_dt; + + dates.due = NULL; + dates.complete = NULL; + comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (epage), + &dates); +} + + +/* + * This is called whenever the start or end dates or timezones is changed. + * It makes sure that the start date < end date, and currently sets the + * "all day event" checkbox as appropriate (but won't when we use DATE values). + * It also emits the notification signals so the other event editor pages + * update their labels etc. + * + * If adjust_end_time is TRUE, if the start time < end time it will adjust + * the end time. If FALSE it will adjust the start time. If the user sets the + * start or end time, the other time is adjusted to make it valid. + */ +static void +times_updated (EventPage *epage, gboolean adjust_end_time) +{ + EventPagePrivate *priv; struct icaltimetype start_tt = icaltime_null_time(); struct icaltimetype end_tt = icaltime_null_time(); + struct icaltimetype end_tt_copy; int cmp; - gboolean date_set; + gboolean date_set, all_day_event; + icaltimezone *start_zone, *end_zone; - epage = EVENT_PAGE (data); priv = epage->priv; if (priv->updating) return; - /* Ensure that start < end */ + /* Fetch the start and end times and timezones from the widgets. */ + all_day_event = e_dialog_toggle_get (priv->all_day_event); + date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_time), &start_tt.year, &start_tt.month, @@ -826,25 +872,34 @@ date_changed_cb (EDateEdit *dedit, gpointer data) &end_tt.minute); g_assert (date_set); - /* FIXME: TIMEZONES. */ - cmp = icaltime_compare (start_tt, end_tt); - if (cmp >= 0) { - if (cmp == 0 && start_tt.hour == 0 - && start_tt.minute == 0 - && start_tt.second == 0) { - /* If the start and end times are the same, but both - * are on day boundaries, then that is OK since it - * means we have an all-day event lasting 1 day. So - * we do nothing here. - */ - } else if (GTK_WIDGET (dedit) == priv->start_time) { - /* Modify the end time, to be the start + 1 hour. */ - - /* FIXME: TIMEZONES - Probably want to leave the - timezone as it is, so we need to convert the time.*/ + if (all_day_event) { + char *location = calendar_config_get_timezone (); + start_zone = end_zone = icaltimezone_get_builtin_timezone (location); + } else { + start_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone)); + end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone)); + } + + /* Convert the end time to the same timezone as the start time. */ + end_tt_copy = end_tt; + icaltimezone_convert_time (&end_tt_copy, end_zone, start_zone); + + /* Now check if the start time is after the end time. If it is, we need + to modify one of the times. */ + cmp = icaltime_compare (start_tt, end_tt_copy); + if (cmp > 0) { + if (adjust_end_time) { + /* Modify the end time, to be the start + 1 hour, + or the same as the start time for all-day events. + We copy the start time, add on one hour, then + convert it to the original end timezone. */ end_tt = start_tt; - icaltime_adjust (&end_tt, 0, 1, 0, 0); + if (!all_day_event) { + icaltime_adjust (&end_tt, 0, 1, 0, 0); + icaltimezone_convert_time (&end_tt, start_zone, + end_zone); + } gtk_signal_handler_block_by_data (GTK_OBJECT (priv->end_time), epage); @@ -857,14 +912,17 @@ date_changed_cb (EDateEdit *dedit, gpointer data) end_tt.minute); gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->end_time), epage); - } else if (GTK_WIDGET (dedit) == priv->end_time) { - /* Modify the start time, to be the end - 1 hour. */ - - /* FIXME: TIMEZONES - Probably want to leave the - timezone as it is, so we need to convert the time.*/ - + } else { + /* Modify the start time, to be the end - 1 hour, + or the same as the start time for all-day events. + We copy the end time, subtract one hour, then + convert it to the original start timezone. */ start_tt = end_tt; - icaltime_adjust (&start_tt, 0, -1, 0, 0); + if (!all_day_event) { + icaltime_adjust (&start_tt, 0, -1, 0, 0); + icaltimezone_convert_time (&start_tt, end_zone, + start_zone); + } gtk_signal_handler_block_by_data (GTK_OBJECT (priv->start_time), epage); @@ -877,22 +935,30 @@ date_changed_cb (EDateEdit *dedit, gpointer data) start_tt.minute); gtk_signal_handler_unblock_by_data (GTK_OBJECT (priv->start_time), epage); - } else - g_assert_not_reached (); + } } /* Set the "all day event" button as appropriate */ check_all_day (epage); /* Notify upstream */ - dates.start = &start_tt; - dates.end = &end_tt; - dates.due = NULL; - dates.complete = NULL; - comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (epage), - &dates); + notify_dates_changed (epage, &start_tt, &end_tt); } +/* Callback used when the start or end date widgets change. We check that the + * start date < end date and we set the "all day event" button as appropriate. + */ +static void +date_changed_cb (GtkWidget *dedit, gpointer data) +{ + EventPage *epage; + + epage = EVENT_PAGE (data); + + times_updated (epage, dedit == epage->priv->start_time); +} + + /* Callback used when the start timezone is changed. If sync_timezones is set, * we set the end timezone to the same value. It also updates the start time * labels on the other notebook pages. @@ -909,8 +975,12 @@ start_timezone_changed_cb (GtkWidget *widget, gpointer data) if (priv->sync_timezones) { zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone)); + priv->updating = TRUE; e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->end_timezone), zone); + priv->updating = FALSE; } + + times_updated (epage, TRUE); } @@ -931,6 +1001,8 @@ end_timezone_changed_cb (GtkWidget *widget, gpointer data) end_zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->end_timezone)); priv->sync_timezones = (start_zone == end_zone) ? TRUE : FALSE; + + times_updated (epage, TRUE); } /* Callback: all day event button toggled. @@ -944,7 +1016,6 @@ all_day_event_toggled_cb (GtkWidget *toggle, gpointer data) EventPage *epage; EventPagePrivate *priv; gboolean all_day; - CompEditorPageDates dates; struct icaltimetype start_tt = icaltime_null_time(); struct icaltimetype end_tt = icaltime_null_time(); gboolean date_set; @@ -1061,12 +1132,7 @@ all_day_event_toggled_cb (GtkWidget *toggle, gpointer data) } /* Notify upstream */ - dates.start = &start_tt; - dates.end = &end_tt; - dates.due = NULL; - dates.complete = NULL; - comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (epage), - &dates); + notify_dates_changed (epage, &start_tt, &end_tt); } /* Callback used when the contacts button is clicked; we must bring up the diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c index 7a1982da17..10946805ed 100644 --- a/calendar/gui/dialogs/recurrence-page.c +++ b/calendar/gui/dialogs/recurrence-page.c @@ -886,7 +886,7 @@ preview_recur (RecurrencePage *rpage) fill_component (rpage, comp); tag_calendar_by_comp (E_CALENDAR (priv->preview_calendar), comp, - COMP_EDITOR_PAGE (rpage)->client, TRUE); + COMP_EDITOR_PAGE (rpage)->client, TRUE, FALSE); gtk_object_unref (GTK_OBJECT (comp)); } @@ -1405,6 +1405,7 @@ recurrence_page_fill_widgets (CompEditorPage *page, CalComponent *comp) /* Dates */ comp_editor_dates (&dates, comp); recurrence_page_set_dates (page, &dates); + comp_editor_free_dates (&dates); /* Exceptions */ fill_exception_widgets (rpage, comp); @@ -1741,7 +1742,7 @@ recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) { RecurrencePage *rpage; RecurrencePagePrivate *priv; - CalComponentDateTime dt, old_dt; + CalComponentDateTime dt; struct icaltimetype icaltime; guint8 mask; @@ -1758,27 +1759,15 @@ recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) dt.value = &icaltime; if (dates->start) { - icaltime = *dates->start; - - /* Copy the TZID from the old property. - FIXME: Should get notified when the TZID changes.*/ - cal_component_get_dtstart (priv->comp, &old_dt); - dt.tzid = old_dt.tzid; - + icaltime = *dates->start->value; + dt.tzid = dates->start->tzid; cal_component_set_dtstart (priv->comp, &dt); - cal_component_free_datetime (&old_dt); } if (dates->end) { - icaltime = *dates->end; - - /* Copy the TZID from the old property. - FIXME: Should get notified when the TZID changes.*/ - cal_component_get_dtend (priv->comp, &old_dt); - dt.tzid = old_dt.tzid; - + icaltime = *dates->end->value; + dt.tzid = dates->end->tzid; cal_component_set_dtend (priv->comp, &dt); - cal_component_free_datetime (&old_dt); } /* Update the weekday picker if necessary */ @@ -1795,6 +1784,9 @@ recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) weekday_picker_set_blocked_days (WEEKDAY_PICKER (priv->weekday_picker), priv->weekday_blocked_day_mask); } + + /* Make sure the preview gets updated. */ + preview_recur (rpage); } diff --git a/calendar/gui/dialogs/task-page.c b/calendar/gui/dialogs/task-page.c index 048adf31ad..2c3f8d18ec 100644 --- a/calendar/gui/dialogs/task-page.c +++ b/calendar/gui/dialogs/task-page.c @@ -676,6 +676,7 @@ date_changed_cb (EDateEdit *dedit, gpointer data) TaskPagePrivate *priv; CompEditorPageDates dates; gboolean date_set; + CalComponentDateTime start_dt, due_dt; struct icaltimetype start_tt = icaltime_null_time(); struct icaltimetype due_tt = icaltime_null_time(); @@ -692,8 +693,13 @@ date_changed_cb (EDateEdit *dedit, gpointer data) e_date_edit_get_time_of_day (E_DATE_EDIT (priv->start_date), &start_tt.hour, &start_tt.minute); - if (!date_set) + if (date_set) { + icaltimezone *zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone)); + start_dt.tzid = icaltimezone_get_tzid (zone); + } else { start_tt = icaltime_null_time (); + start_dt.tzid = NULL; + } date_set = e_date_edit_get_date (E_DATE_EDIT (priv->due_date), &due_tt.year, @@ -702,12 +708,19 @@ date_changed_cb (EDateEdit *dedit, gpointer data) e_date_edit_get_time_of_day (E_DATE_EDIT (priv->due_date), &due_tt.hour, &due_tt.minute); - if (!date_set) + if (date_set) { + icaltimezone *zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->due_timezone)); + due_dt.tzid = icaltimezone_get_tzid (zone); + } else { due_tt = icaltime_null_time (); + due_dt.tzid = NULL; + } - dates.start = &start_tt; + start_dt.value = &start_tt; + dates.start = &start_dt; dates.end = NULL; - dates.due = &due_tt; + due_dt.value = &due_tt; + dates.due = &due_dt; dates.complete = NULL; /* Notify upstream */ |