diff options
author | Damon Chaplin <damon@ximian.com> | 2001-09-27 12:02:17 +0800 |
---|---|---|
committer | Damon Chaplin <damon@src.gnome.org> | 2001-09-27 12:02:17 +0800 |
commit | b235a79effc13b17b0bffc78189b831493bd37d6 (patch) | |
tree | 1717b8309b347b794dd05f7bfd657c57d1707f82 | |
parent | f0c38138fa31e7e03c289f75c85d4c214ff9dcca (diff) | |
download | gsoc2013-evolution-b235a79effc13b17b0bffc78189b831493bd37d6.tar gsoc2013-evolution-b235a79effc13b17b0bffc78189b831493bd37d6.tar.gz gsoc2013-evolution-b235a79effc13b17b0bffc78189b831493bd37d6.tar.bz2 gsoc2013-evolution-b235a79effc13b17b0bffc78189b831493bd37d6.tar.lz gsoc2013-evolution-b235a79effc13b17b0bffc78189b831493bd37d6.tar.xz gsoc2013-evolution-b235a79effc13b17b0bffc78189b831493bd37d6.tar.zst gsoc2013-evolution-b235a79effc13b17b0bffc78189b831493bd37d6.zip |
added comparison functions for these special cell types. But the date and
2001-09-26 Damon Chaplin <damon@ximian.com>
* gui/e-calendar-table.c (date_compare_cb):
(percent_compare_cb):
(priority_compare_cb): added comparison functions for these special
cell types. But the date and percent ones don't work yet due to the
use of static text buffers for return cell values.
(e_calendar_table_init): added the comparison functions to the
ETableExtras. NOTE: task_compare_cb() never seems to be called.
I'm not sure why it is there.
* gui/e-calendar-table.etspec: set the comparison function names for
the date/percent/priority fields.
* cal-util/cal-util.c (cal_util_priority_to_string):
(cal_util_priority_from_string): new utility functions.
* gui/calendar-model.c (get_priority):
(set_priority): used above utility functions, and removed the warning
dialog which isn't useful now that the field isn't editable.
* gui/dialogs/event-page.c (times_updated): handle timezones and for
all-day events make sure it stays an all-day event after adjusting.
Fixes bugs #5945 and #10222.
* gui/calendar-commands.c (pixmaps): fixed the E_PIXMAP paths - the
edit items were moved beneath 'EditPlaceholder'. This gets rid of
those long Bonobo warnings! (and we get the icons back)
* gui/dialogs/comp-editor.c (pixmaps): removed the PrintPreview toolbar
icon, since it doesn't appear in the xml file. Gets rid of warning.
* gui/dialogs/event-page.c (notify_dates_changed): new function to
emit the notification signal when the dates are changed. It also
handles timezones now.
* gui/dialogs/comp-editor-page.h (CompEditorPageDates): used
CalComponentDateTime for start/end/due so we have the timezone as well
as the time.
* gui/dialogs/comp-editor-util.c (comp_editor_dates): updated to get
the timezones as well as the times.
(comp_editor_free_dates): new function needed to free all the structs.
* gui/dialogs/recurrence-page.c (recurrence_page_set_dates): added call
to preview_recur() to make sure the preview gets updated.
* gui/dialogs/alarm-page.c (alarm_page_fill_widgets): free the
CompEditorPageDates struct after use.
* gui/tag-calendar.c (tag_calendar_by_comp): added 'comp_is_on_server'
argument. If FALSE, we try to use builtin timezones first. This is
needed for the recurrence page of the event editor, because the
timezones may not have been added to the server yet. This and the
changes to the notification stuff should fix bug #5034.
* gui/gnome-cal.c (dn_query_obj_updated_cb): call above
tag_calendar_by_comp() with TRUE since the events will be on the
server in this case.
* gui/e-day-view-layout.c:
* gui/e-day-view.c: made sure an event always takes up at least one
row, even when the start & end times are the same. Fixes bug #5944.
I don't know if we should try to also handle events with the end time
before the start time.
* gui/e-week-view.c (e_week_view_style_set): check that the small font
is actually smaller than the normal font. If it isn't, don't use it.
Hopefully fixes bug #6876.
(e_week_view_on_new_appointment): if only one day is selected, then
we set the initial time of the event to 1/2-hour from the start of the
working day, to differentiate 'New Appointment' from 'New All Day
Event'. Fixes bug #8892.
* gui/e-day-view.c (e_day_view_on_new_appointment): do the same as the
above.
svn path=/trunk/; revision=13186
-rw-r--r-- | calendar/ChangeLog | 78 | ||||
-rw-r--r-- | calendar/cal-util/cal-util.c | 48 | ||||
-rw-r--r-- | calendar/cal-util/cal-util.h | 4 | ||||
-rw-r--r-- | calendar/gui/calendar-commands.c | 8 | ||||
-rw-r--r-- | calendar/gui/calendar-model.c | 49 | ||||
-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 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.c | 66 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.etspec | 12 | ||||
-rw-r--r-- | calendar/gui/e-day-view-layout.c | 4 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 32 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 28 | ||||
-rw-r--r-- | calendar/gui/gnome-cal.c | 7 | ||||
-rw-r--r-- | calendar/gui/tag-calendar.c | 46 | ||||
-rw-r--r-- | calendar/gui/tag-calendar.h | 3 |
21 files changed, 525 insertions, 177 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index b1a9bdf457..e57b7d107f 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,80 @@ +2001-09-26 Damon Chaplin <damon@ximian.com> + + * gui/e-calendar-table.c (date_compare_cb): + (percent_compare_cb): + (priority_compare_cb): added comparison functions for these special + cell types. But the date and percent ones don't work yet due to the + use of static text buffers for return cell values. + (e_calendar_table_init): added the comparison functions to the + ETableExtras. NOTE: task_compare_cb() never seems to be called. + I'm not sure why it is there. + + * gui/e-calendar-table.etspec: set the comparison function names for + the date/percent/priority fields. + + * cal-util/cal-util.c (cal_util_priority_to_string): + (cal_util_priority_from_string): new utility functions. + + * gui/calendar-model.c (get_priority): + (set_priority): used above utility functions, and removed the warning + dialog which isn't useful now that the field isn't editable. + + * gui/dialogs/event-page.c (times_updated): handle timezones and for + all-day events make sure it stays an all-day event after adjusting. + Fixes bugs #5945 and #10222. + + * gui/calendar-commands.c (pixmaps): fixed the E_PIXMAP paths - the + edit items were moved beneath 'EditPlaceholder'. This gets rid of + those long Bonobo warnings! (and we get the icons back) + + * gui/dialogs/comp-editor.c (pixmaps): removed the PrintPreview toolbar + icon, since it doesn't appear in the xml file. Gets rid of warning. + + * gui/dialogs/event-page.c (notify_dates_changed): new function to + emit the notification signal when the dates are changed. It also + handles timezones now. + + * gui/dialogs/comp-editor-page.h (CompEditorPageDates): used + CalComponentDateTime for start/end/due so we have the timezone as well + as the time. + + * gui/dialogs/comp-editor-util.c (comp_editor_dates): updated to get + the timezones as well as the times. + (comp_editor_free_dates): new function needed to free all the structs. + + * gui/dialogs/recurrence-page.c (recurrence_page_set_dates): added call + to preview_recur() to make sure the preview gets updated. + + * gui/dialogs/alarm-page.c (alarm_page_fill_widgets): free the + CompEditorPageDates struct after use. + + * gui/tag-calendar.c (tag_calendar_by_comp): added 'comp_is_on_server' + argument. If FALSE, we try to use builtin timezones first. This is + needed for the recurrence page of the event editor, because the + timezones may not have been added to the server yet. This and the + changes to the notification stuff should fix bug #5034. + + * gui/gnome-cal.c (dn_query_obj_updated_cb): call above + tag_calendar_by_comp() with TRUE since the events will be on the + server in this case. + + * gui/e-day-view-layout.c: + * gui/e-day-view.c: made sure an event always takes up at least one + row, even when the start & end times are the same. Fixes bug #5944. + I don't know if we should try to also handle events with the end time + before the start time. + + * gui/e-week-view.c (e_week_view_style_set): check that the small font + is actually smaller than the normal font. If it isn't, don't use it. + Hopefully fixes bug #6876. + (e_week_view_on_new_appointment): if only one day is selected, then + we set the initial time of the event to 1/2-hour from the start of the + working day, to differentiate 'New Appointment' from 'New All Day + Event'. Fixes bug #8892. + + * gui/e-day-view.c (e_day_view_on_new_appointment): do the same as the + above. + 2001-09-26 Federico Mena Quintero <federico@ximian.com> Fixes the GUI part of bug #7892. @@ -322,7 +399,6 @@ (event_editor_destroy): unref model * gui/dialogs/comp-editor.h: add virtual function - * gui/dialogs/comp-editor.c (comp_editor_set_cal_client): make set_cal_client a virutal function diff --git a/calendar/cal-util/cal-util.c b/calendar/cal-util/cal-util.c index 1df57bacec..774b9aca11 100644 --- a/calendar/cal-util/cal-util.c +++ b/calendar/cal-util/cal-util.c @@ -22,6 +22,9 @@ #include <config.h> #include <stdlib.h> +#include <glib.h> +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> #include "cal-util.h" @@ -400,3 +403,48 @@ cal_util_generate_alarms_for_list (GList *comps, return n; } + + +/* Converts an iCalendar PRIORITY value to a translated string. Any unknown + priority value (i.e. not 0-9) will be returned as "" (undefined). */ +char * +cal_util_priority_to_string (int priority) +{ + char *retval; + + if (priority <= 0) + retval = ""; + else if (priority <= 4) + retval = _("High"); + else if (priority == 5) + retval = _("Normal"); + else if (priority <= 9) + retval = _("Low"); + else + retval = ""; + + return retval; +} + + +/* Converts a translated priority string to an iCalendar priority value. + Returns -1 if the priority string is not valid. */ +int +cal_util_priority_from_string (const char *string) +{ + int priority; + + /* An empty string is the same as 'None'. */ + if (!string || !string[0] || !g_strcasecmp (string, _("Undefined"))) + priority = 0; + else if (!g_strcasecmp (string, _("High"))) + priority = 3; + else if (!g_strcasecmp (string, _("Normal"))) + priority = 5; + else if (!g_strcasecmp (string, _("Low"))) + priority = 7; + else + priority = -1; + + return priority; +} diff --git a/calendar/cal-util/cal-util.h b/calendar/cal-util/cal-util.h index 362d9eaae5..9e7c7ce5e4 100644 --- a/calendar/cal-util/cal-util.h +++ b/calendar/cal-util/cal-util.h @@ -79,6 +79,10 @@ int cal_util_generate_alarms_for_list (GList *comps, icaltimezone *cal_util_resolve_tzid (const char *tzid, gpointer data); +char *cal_util_priority_to_string (int priority); +int cal_util_priority_from_string (const char *string); + + END_GNOME_DECLS #endif diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c index 366026dc96..3fe7e4bdae 100644 --- a/calendar/gui/calendar-commands.c +++ b/calendar/gui/calendar-commands.c @@ -575,10 +575,10 @@ static EPixmap pixmaps [] = { E_PIXMAP ("/menu/File/New/NewFirstItem/NewAppointment", "new_appointment.xpm"), E_PIXMAP ("/menu/File/New/NewFirstItem/NewTask", "new_task-16.png"), - E_PIXMAP ("/menu/Edit/CutEvent", "16_cut.png"), - E_PIXMAP ("/menu/Edit/CopyEvent", "16_copy.png"), - E_PIXMAP ("/menu/Edit/PasteEvent", "16_paste.png"), - E_PIXMAP ("/menu/Edit/DeleteEvent", "evolution-trash-mini.png"), + E_PIXMAP ("/menu/EditPlaceholder/Edit/CutEvent", "16_cut.png"), + E_PIXMAP ("/menu/EditPlaceholder/Edit/CopyEvent", "16_copy.png"), + E_PIXMAP ("/menu/EditPlaceholder/Edit/PasteEvent", "16_paste.png"), + E_PIXMAP ("/menu/EditPlaceholder/Edit/DeleteEvent", "evolution-trash-mini.png"), E_PIXMAP ("/menu/File/Print/Print", "print.xpm"), E_PIXMAP ("/menu/File/Print/PrintPreview", "print-preview.xpm"), E_PIXMAP ("/menu/ComponentActionsPlaceholder/Actions/NewAppointment", "new_appointment.xpm"), diff --git a/calendar/gui/calendar-model.c b/calendar/gui/calendar-model.c index 8a26af5faf..c83d29d04d 100644 --- a/calendar/gui/calendar-model.c +++ b/calendar/gui/calendar-model.c @@ -528,21 +528,14 @@ static char * get_priority (CalComponent *comp) { int *priority; - char *retval; + char *retval = ""; cal_component_get_priority (comp, &priority); - if (!priority || *priority == 0) - retval = ""; - else if (*priority <= 4) - retval = _("High"); - else if (*priority == 5) - retval = _("Normal"); - else - retval = _("Low"); - - if (priority) + if (priority) { + retval = cal_util_priority_to_string (*priority); cal_component_free_priority (priority); + } return retval; } @@ -1157,38 +1150,18 @@ set_percent (CalComponent *comp, const char *value) ensure_task_not_complete (comp); } -/* FIXME: We won't need this eventually, since the user won't be allowed to - * edit the field. - */ -static void -show_priority_warning (void) -{ - GtkWidget *dialog; - - dialog = gnome_message_box_new (_("The priority must be 'High', 'Normal', 'Low' or 'Undefined'."), - GNOME_MESSAGE_BOX_ERROR, - GNOME_STOCK_BUTTON_OK, NULL); - gtk_widget_show (dialog); -} - /* Sets the priority of a calendar component */ static void set_priority (CalComponent *comp, const char *value) { int priority; - /* An empty string is the same as 'None'. */ - if (!value[0] || !g_strcasecmp (value, _("Undefined"))) + priority = cal_util_priority_from_string (value); + /* If the priority is invalid (which should never happen) output a + warning and set it to undefined. */ + if (priority == -1) { + g_warning ("Invalid priority"); priority = 0; - else if (!g_strcasecmp (value, _("High"))) - priority = 3; - else if (!g_strcasecmp (value, _("Normal"))) - priority = 5; - else if (!g_strcasecmp (value, _("Low"))) - priority = 7; - else { - show_priority_warning (); - return; } cal_component_set_priority (comp, &priority); @@ -1956,7 +1929,9 @@ adjust_query_sexp (CalendarModel *model, const char *sexp) if (free_completed_sexp) g_free (completed_sexp); - g_print ("Calendar mode sexp:\n%s\n", new_sexp); +#if 0 + g_print ("Calendar model sexp:\n%s\n", new_sexp); +#endif return new_sexp; } 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 */ diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index 1b37c8662e..8d8856ed2a 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -186,6 +186,12 @@ compare_priorities (int *a, int *b) /* Comparison function for the task-sort column. Sorts by due date and then by * priority. + * + * FIXME: Does this ever get called?? It doesn't seem to. + * I specified that the table should be sorted by this column, but it still + * never calls this function. + * Also, this assumes it is passed pointers to CalComponents, but I think it + * may just be passed pointers to the 2 cell values. */ static gint task_compare_cb (gconstpointer a, gconstpointer b) @@ -195,6 +201,8 @@ task_compare_cb (gconstpointer a, gconstpointer b) int *prio_a, *prio_b; int retval; + g_print ("In task_compare_cb\n"); + ca = CAL_COMPONENT (a); cb = CAL_COMPONENT (b); @@ -206,7 +214,8 @@ task_compare_cb (gconstpointer a, gconstpointer b) if (due_a.value && due_b.value) { int v; - /* FIXME: TIMEZONES. */ + /* FIXME: TIMEZONES. But currently we have no way to get the + CalClient, so we can't get the timezone. */ v = icaltime_compare (*due_a.value, *due_b.value); if (v == 0) @@ -232,6 +241,54 @@ task_compare_cb (gconstpointer a, gconstpointer b) return retval; } +static gint +date_compare_cb (gconstpointer a, gconstpointer b) +{ + const char *value1 = a, *value2 = b; + + g_print ("In date_compare_cb '%s' '%s'\n", value1, value2); + + return 0; +} + +static gint +percent_compare_cb (gconstpointer a, gconstpointer b) +{ + const char *value1 = a, *value2 = b; + + /* FIXME: Currently this isn't working as the ETableSorter caches + all the values in the table before sorting, but our get_value() + function returns a pointer to a static buffer. So all the cached + pointers point to the same buffer. */ + + g_print ("In percent_compare_cb '%s' '%s'\n", value1, value2); + + return 0; +} + +static gint +priority_compare_cb (gconstpointer a, gconstpointer b) +{ + int priority1, priority2; + + priority1 = cal_util_priority_from_string ((const char*) a); + priority2 = cal_util_priority_from_string ((const char*) b); + + /* We change undefined priorities so they appear after 'Low'. */ + if (priority1 <= 0) + priority1 = 10; + if (priority2 <= 0) + priority2 = 10; + + /* We'll just use the ordering of the priority values. */ + if (priority1 < priority2) + return -1; + else if (priority1 > priority2) + return 1; + else + return 0; +} + static void e_calendar_table_init (ECalendarTable *cal_table) { @@ -413,6 +470,13 @@ e_calendar_table_init (ECalendarTable *cal_table) */ e_table_extras_add_compare (extras, "task-sort", task_compare_cb); + e_table_extras_add_compare (extras, "date-compare", + date_compare_cb); + e_table_extras_add_compare (extras, "percent-compare", + percent_compare_cb); + e_table_extras_add_compare (extras, "priority-compare", + priority_compare_cb); + /* Create pixmaps */ if (!icon_pixbufs[0]) diff --git a/calendar/gui/e-calendar-table.etspec b/calendar/gui/e-calendar-table.etspec index b6a81f7fea..f0f717c006 100644 --- a/calendar/gui/e-calendar-table.etspec +++ b/calendar/gui/e-calendar-table.etspec @@ -1,13 +1,13 @@ <ETableSpecification click-to-add="true" _click-to-add-message="Click to add a task" draw-grid="true"> <ETableColumn model_col= "0" _title="Categories" expansion="1.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> <ETableColumn model_col= "1" _title="Classification" expansion="1.0" minimum_width="10" resizable="true" cell="classification" compare="string"/> - <ETableColumn model_col= "2" _title="Completion Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="string"/> - <ETableColumn model_col= "3" _title="End Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="string"/> - <ETableColumn model_col= "4" _title="Start Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="string"/> - <ETableColumn model_col= "5" _title="Due Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="string"/> + <ETableColumn model_col= "2" _title="Completion Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare"/> + <ETableColumn model_col= "3" _title="End Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare"/> + <ETableColumn model_col= "4" _title="Start Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare"/> + <ETableColumn model_col= "5" _title="Due Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare"/> <ETableColumn model_col= "6" _title="Geographical Position" expansion="1.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> - <ETableColumn model_col= "7" _title="% Complete" expansion="1.0" minimum_width="10" resizable="true" cell="percent" compare="string"/> - <ETableColumn model_col= "8" _title="Priority" expansion="1.0" minimum_width="10" resizable="true" cell="priority" compare="string"/> + <ETableColumn model_col= "7" _title="% Complete" expansion="1.0" minimum_width="10" resizable="true" cell="percent" compare="percent-compare"/> + <ETableColumn model_col= "8" _title="Priority" expansion="1.0" minimum_width="10" resizable="true" cell="priority" compare="priority-compare"/> <ETableColumn model_col= "9" _title="Summary" expansion="3.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> <ETableColumn model_col="10" _title="Show Time As" expansion="1.0" minimum_width="10" resizable="true" cell="transparency" compare="string"/> <ETableColumn model_col="11" _title="URL" expansion="2.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> diff --git a/calendar/gui/e-day-view-layout.c b/calendar/gui/e-day-view-layout.c index 00a448d7ec..67527b0feb 100644 --- a/calendar/gui/e-day-view-layout.c +++ b/calendar/gui/e-day-view-layout.c @@ -201,6 +201,8 @@ e_day_view_layout_day_event (EDayViewEvent *event, start_row = event->start_minute / mins_per_row; end_row = (event->end_minute - 1) / mins_per_row; + if (end_row < start_row) + end_row = start_row; event->num_columns = 0; @@ -292,6 +294,8 @@ e_day_view_expand_day_event (EDayViewEvent *event, start_row = event->start_minute / mins_per_row; end_row = (event->end_minute - 1) / mins_per_row; + if (end_row < start_row) + end_row = start_row; /* Try each column until we find a free one. */ clashed = FALSE; diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 80b79bf2f5..77343b4763 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -3255,6 +3255,8 @@ e_day_view_on_event_click (EDayView *day_view, day_view->resize_drag_pos = pos; day_view->resize_start_row = event->start_minute / day_view->mins_per_row; day_view->resize_end_row = (event->end_minute - 1) / day_view->mins_per_row; + if (day_view->resize_end_row < day_view->resize_start_row) + day_view->resize_end_row = day_view->resize_start_row; day_view->resize_bars_event_day = day; day_view->resize_bars_event_num = event_num; @@ -3526,8 +3528,27 @@ e_day_view_on_new_appointment (GtkWidget *widget, gpointer data) { EDayView *day_view = E_DAY_VIEW (data); time_t dtstart, dtend; + struct icaltimetype itt; - e_day_view_get_selected_time_range (day_view, &dtstart, &dtend); + /* Edit a new event. If only one day is selected in the top canvas, + we set the time to the first 1/2-hour of the working day. */ + if (day_view->selection_in_top_canvas + && day_view->selection_start_day != -1 + && day_view->selection_start_day == day_view->selection_end_day) { + dtstart = day_view->day_starts[day_view->selection_start_day]; + itt = icaltime_from_timet_with_zone (dtstart, FALSE, + day_view->zone); + itt.hour = calendar_config_get_day_start_hour (); + itt.minute = calendar_config_get_day_start_minute (); + dtstart = icaltime_as_timet_with_zone (itt, day_view->zone); + + icaltime_adjust (&itt, 0, 0, 30, 0); + dtend = icaltime_as_timet_with_zone (itt, day_view->zone); + } else { + e_day_view_get_selected_time_range (day_view, &dtstart, + &dtend); + } + gnome_calendar_new_appointment_for ( day_view->calendar, dtstart, dtend, FALSE); } @@ -5834,6 +5855,9 @@ e_day_view_get_event_position (EDayView *day_view, start_row = event->start_minute / day_view->mins_per_row; end_row = (event->end_minute - 1) / day_view->mins_per_row; + if (end_row < start_row) + end_row = start_row; + cols_in_row = day_view->cols_per_row[day][start_row]; start_col = event->start_row_or_col; num_columns = event->num_columns; @@ -6320,6 +6344,9 @@ e_day_view_update_main_canvas_drag (EDayView *day_view, day_view->drag_event_num); start_row = event->start_minute / day_view->mins_per_row; end_row = (event->end_minute - 1) / day_view->mins_per_row; + if (end_row < start_row) + end_row = start_row; + num_rows = end_row - start_row + 1; } @@ -6690,6 +6717,9 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget, /* Calculate time offset from start row. */ start_row = event->start_minute / day_view->mins_per_row; end_row = (event->end_minute - 1) / day_view->mins_per_row; + if (end_row < start_row) + end_row = start_row; + num_rows = end_row - start_row + 1; start_offset = event->start_minute % day_view->mins_per_row; diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index b9bc5199d1..22f776b557 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -52,6 +52,7 @@ #include "comp-util.h" #include "cal-util/timeutil.h" #include "calendar-commands.h" +#include "calendar-config.h" #include "goto.h" #include "e-week-view-event-item.h" #include "e-week-view-layout.h" @@ -641,6 +642,13 @@ e_week_view_style_set (GtkWidget *widget, week_view->row_height = font->ascent + font->descent + E_WEEK_VIEW_EVENT_BORDER_HEIGHT * 2 + E_WEEK_VIEW_EVENT_TEXT_Y_PAD * 2; week_view->row_height = MAX (week_view->row_height, E_WEEK_VIEW_ICON_HEIGHT + E_WEEK_VIEW_ICON_Y_PAD + E_WEEK_VIEW_EVENT_BORDER_HEIGHT * 2); + /* Check that the small font is smaller than the default font. + If it isn't, we won't use it. */ + if (week_view->small_font) { + if (font->ascent + font->descent <= week_view->small_font->ascent + week_view->small_font->descent) + week_view->use_small_font = FALSE; + } + /* Set the height of the top canvas. */ gtk_widget_set_usize (week_view->titles_canvas, -1, font->ascent + font->descent + 5); @@ -3367,9 +3375,25 @@ e_week_view_on_new_appointment (GtkWidget *widget, gpointer data) { EWeekView *week_view = E_WEEK_VIEW (data); time_t dtstart, dtend; + struct icaltimetype itt; - dtstart = week_view->day_starts[week_view->selection_start_day]; - dtend = week_view->day_starts[week_view->selection_end_day + 1]; + /* Edit a new event. If only one day is selected we set the time to + the first 1/2-hour of the working day. */ + if (week_view->selection_start_day == week_view->selection_end_day) { + dtstart = week_view->day_starts[week_view->selection_start_day]; + itt = icaltime_from_timet_with_zone (dtstart, FALSE, + week_view->zone); + itt.hour = calendar_config_get_day_start_hour (); + itt.minute = calendar_config_get_day_start_minute (); + dtstart = icaltime_as_timet_with_zone (itt, week_view->zone); + + icaltime_adjust (&itt, 0, 0, 30, 0); + dtend = icaltime_as_timet_with_zone (itt, week_view->zone); + } else { + dtstart = week_view->day_starts[week_view->selection_start_day]; + dtend = week_view->day_starts[week_view->selection_end_day + 1]; + } + gnome_calendar_new_appointment_for ( week_view->calendar, dtstart, dtend, FALSE); } diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index a2282ba2f1..bed5b0e3e9 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -287,7 +287,8 @@ dn_query_obj_updated_cb (CalQuery *query, const char *uid, return; } - tag_calendar_by_comp (priv->date_navigator, comp, priv->client, FALSE); + tag_calendar_by_comp (priv->date_navigator, comp, priv->client, FALSE, + TRUE); gtk_object_unref (GTK_OBJECT (comp)); } @@ -1961,7 +1962,7 @@ gnome_calendar_edit_object (GnomeCalendar *gcal, CalComponent *comp) } /** - * gnome_calendar_new_appointment: + * gnome_calendar_new_appointment_for: * @gcal: An Evolution calendar. * @dtstart: a Unix time_t that marks the beginning of the appointment. * @dtend: a Unix time_t that marks the end of the appointment. @@ -2233,6 +2234,7 @@ gnome_calendar_update_date_navigator (GnomeCalendar *gcal) end_date = start_date; g_date_add_days (&end_date, days_shown - 1); + g_print ("Updating date navigator selection\n"); e_calendar_item_set_selection (priv->date_navigator->calitem, &start_date, &end_date); } @@ -2325,6 +2327,7 @@ static void gnome_calendar_on_date_navigator_date_range_changed (ECalendarItem *calitem, GnomeCalendar *gcal) { + g_print ("In gnome_calendar_on_date_navigator_date_range_changed\n"); update_query (gcal); } diff --git a/calendar/gui/tag-calendar.c b/calendar/gui/tag-calendar.c index 30ee02520c..08a2636ec0 100644 --- a/calendar/gui/tag-calendar.c +++ b/calendar/gui/tag-calendar.c @@ -152,6 +152,32 @@ tag_calendar_by_client (ECalendar *ecal, CalClient *client) tag_calendar_cb, &c); } +/* Resolves TZIDs for the recurrence generator, for when the comp is not on + the server. We need to try to use builtin timezones first, as they may not + be added to the server yet. */ +icaltimezone* +resolve_tzid_cb (const char *tzid, gpointer data) +{ + CalClient *client; + icaltimezone *zone = NULL; + CalClientGetStatus status; + + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (IS_CAL_CLIENT (data), NULL); + + client = CAL_CLIENT (data); + + /* Try to find the builtin timezone first. */ + zone = icaltimezone_get_builtin_timezone_from_tzid (tzid); + + if (!zone) { + /* FIXME: Handle errors. */ + status = cal_client_get_timezone (client, tzid, &zone); + } + + return zone; +} + /** * tag_calendar_by_comp: * @ecal: Calendar widget to tag. @@ -161,9 +187,13 @@ tag_calendar_by_client (ECalendar *ecal, CalClient *client) * Tags an #ECalendar widget with any occurrences of a specific calendar * component that occur within the calendar's current time range. * Note that TRANSPARENT events are also tagged here. + * + * If comp_is_on_server is FALSE, it will try to resolve TZIDs using builtin + * timezones first, before querying the server, since the timezones may not + * have been added to the calendar on the server yet. **/ void -tag_calendar_by_comp (ECalendar *ecal, CalComponent *comp, CalClient *client, gboolean clear_first) +tag_calendar_by_comp (ECalendar *ecal, CalComponent *comp, CalClient *client, gboolean clear_first, gboolean comp_is_on_server) { struct calendar_tag_closure c; @@ -184,7 +214,15 @@ tag_calendar_by_comp (ECalendar *ecal, CalComponent *comp, CalClient *client, gb #if 0 g_print ("DateNavigator generating instances\n"); #endif - cal_recur_generate_instances (comp, c.start_time, c.end_time, - tag_calendar_cb, &c, - cal_client_resolve_tzid_cb, client); + if (comp_is_on_server) { + cal_recur_generate_instances (comp, c.start_time, c.end_time, + tag_calendar_cb, &c, + cal_client_resolve_tzid_cb, + client); + } else { + cal_recur_generate_instances (comp, c.start_time, c.end_time, + tag_calendar_cb, &c, + resolve_tzid_cb, + client); + } } diff --git a/calendar/gui/tag-calendar.h b/calendar/gui/tag-calendar.h index 0ec7b5a148..4b5ede9267 100644 --- a/calendar/gui/tag-calendar.h +++ b/calendar/gui/tag-calendar.h @@ -28,6 +28,7 @@ void tag_calendar_by_client (ECalendar *ecal, CalClient *client); void tag_calendar_by_comp (ECalendar *ecal, CalComponent *comp, - CalClient *client, gboolean clear_first); + CalClient *client, gboolean clear_first, + gboolean comp_is_on_server); #endif |