From e4e894969ece81b2ed434c7d66e4b2d1b42244d3 Mon Sep 17 00:00:00 2001 From: Damon Chaplin Date: Thu, 25 Oct 2001 23:28:15 +0000 Subject: subtract 1 from any positive BYSETPOS value, since our array is 0-based. 2001-10-25 Damon Chaplin * cal-util/cal-recur.c (cal_obj_bysetpos_filter): subtract 1 from any positive BYSETPOS value, since our array is 0-based. * gui/dialogs/recurrence-page.c (simple_recur_to_comp): (recurrence_page_fill_widgets): Outlook (2000) will not accept monthly recurrences like BYDAY=2TU. Instead it uses BYDAY=TU;BYSETPOS=2. So to be compatable with it we now do the same, although we still accept and convert the old format. * cal-client/cal-client.c (cal_client_get_component_as_string): new function to return a complete VCALENDAR string containing a VEVENT or VTODO with all the VTIMEZONEs it uses. * gui/dialogs/comp-editor.c (save_as_ok): use above function so we save the VTIMEZONE data with the VEVENT/VTODO. Fixes bug #????. Also made sure we output "METHOD:PUBLISH" since Outlook (2000) will not import it otherwise. * gui/dialogs/comp-editor.c (page_mapped_cb): (page_unmapped_cb): install/uninstall the GtkAccelGroup for the page. (comp_editor_append_page): connect to the map/unmap signals to install/uninstall the accelerators. (This is all for bug #11609, though of course it doesn't work too well in GTK+ 1.2 anyway.) * gui/dialogs/task-page.c (get_widgets): * gui/dialogs/task-details-page.c (get_widgets): * gui/dialogs/schedule-page.c (get_widgets): * gui/dialogs/recurrence-page.c (get_widgets): * gui/dialogs/meeting-page.c (get_widgets): * gui/dialogs/event-page.c (get_widgets): * gui/dialogs/alarm-page.c (get_widgets): got the GtkAccelGroup from the original window, ref'ed it and placed it in the CompEditorPage struct. * gui/dialogs/comp-editor-page.c (comp_editor_page_destroy): unref any GtkAccelGroup for the page. * gui/dialogs/task-page.glade: changed '_Confidential' to 'Con_fidential' as it clashed with '_Contacts'. It now matches the event editor as well. * gui/dialogs/event-page.glade: * gui/dialogs/task-page.glade: Set CAN_FOCUS to TRUE for the custom EDateEdit widgets, and set them as the accel targets of the labels. svn path=/trunk/; revision=14108 --- calendar/gui/dialogs/alarm-page.c | 12 ++++++ calendar/gui/dialogs/comp-editor-page.c | 6 +++ calendar/gui/dialogs/comp-editor-page.h | 6 +++ calendar/gui/dialogs/comp-editor.c | 70 ++++++++++++++++++++------------ calendar/gui/dialogs/event-page.c | 12 ++++++ calendar/gui/dialogs/event-page.glade | 6 +++ calendar/gui/dialogs/meeting-page.c | 12 ++++++ calendar/gui/dialogs/recurrence-page.c | 63 ++++++++++++++++++++-------- calendar/gui/dialogs/schedule-page.c | 12 ++++++ calendar/gui/dialogs/task-details-page.c | 12 ++++++ calendar/gui/dialogs/task-page.c | 12 ++++++ calendar/gui/dialogs/task-page.glade | 8 +++- 12 files changed, 187 insertions(+), 44 deletions(-) (limited to 'calendar/gui/dialogs') diff --git a/calendar/gui/dialogs/alarm-page.c b/calendar/gui/dialogs/alarm-page.c index 276f6c3a24..023dfac55c 100644 --- a/calendar/gui/dialogs/alarm-page.c +++ b/calendar/gui/dialogs/alarm-page.c @@ -623,7 +623,10 @@ alarm_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) static gboolean get_widgets (AlarmPage *apage) { + CompEditorPage *page = COMP_EDITOR_PAGE (apage); AlarmPagePrivate *priv; + GSList *accel_groups; + GtkWidget *toplevel; priv = apage->priv; @@ -633,6 +636,15 @@ get_widgets (AlarmPage *apage) if (!priv->main) return FALSE; + /* Get the GtkAccelGroup from the toplevel window, so we can install + it when the notebook page is mapped. */ + toplevel = gtk_widget_get_toplevel (priv->main); + accel_groups = gtk_accel_groups_from_object (GTK_OBJECT (toplevel)); + if (accel_groups) { + page->accel_group = accel_groups->data; + gtk_accel_group_ref (page->accel_group); + } + gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); diff --git a/calendar/gui/dialogs/comp-editor-page.c b/calendar/gui/dialogs/comp-editor-page.c index 9f006a9979..7834ddccef 100644 --- a/calendar/gui/dialogs/comp-editor-page.c +++ b/calendar/gui/dialogs/comp-editor-page.c @@ -153,6 +153,7 @@ static void comp_editor_page_init (CompEditorPage *page) { page->client = NULL; + page->accel_group = NULL; } @@ -171,6 +172,11 @@ comp_editor_page_destroy (GtkObject *object) page->client = NULL; } + if (page->accel_group) { + gtk_accel_group_unref (page->accel_group); + page->accel_group = NULL; + } + if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } diff --git a/calendar/gui/dialogs/comp-editor-page.h b/calendar/gui/dialogs/comp-editor-page.h index caf0486337..28b75866a6 100644 --- a/calendar/gui/dialogs/comp-editor-page.h +++ b/calendar/gui/dialogs/comp-editor-page.h @@ -50,6 +50,12 @@ typedef struct { /* Some of the pages need the CalClient to access timezone data. */ CalClient *client; + + /* The GtkAccelGroup for the page. We install this when the page is + mapped, and uninstall when it is unmapped. libglade would do this + normally, but we create our pages individually so have to do it + ourselves. */ + GtkAccelGroup *accel_group; } CompEditorPage; typedef struct { diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index bcb104fe85..077bff879c 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -461,6 +461,36 @@ comp_editor_get_needs_send (CompEditor *editor) return priv->needs_send; } +static void page_mapped_cb (GtkWidget *page_widget, + CompEditorPage *page) +{ + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (page_widget); + if (!GTK_IS_WINDOW (toplevel)) + return; + + if (page->accel_group) { + gtk_window_add_accel_group (GTK_WINDOW (toplevel), + page->accel_group); + } +} + +static void page_unmapped_cb (GtkWidget *page_widget, + CompEditorPage *page) +{ + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (page_widget); + if (!GTK_IS_WINDOW (toplevel)) + return; + + if (page->accel_group) { + gtk_window_remove_accel_group (GTK_WINDOW (toplevel), + page->accel_group); + } +} + /** * comp_editor_append_page: * @editor: A component editor @@ -518,6 +548,13 @@ comp_editor_append_page (CompEditor *editor, gtk_signal_connect (GTK_OBJECT (page), "dates_changed", GTK_SIGNAL_FUNC (page_dates_changed_cb), editor); + /* Listen for when the page is mapped/unmapped so we can + install/uninstall the appropriate GtkAccelGroup. */ + gtk_signal_connect (GTK_OBJECT (page_widget), "map", + GTK_SIGNAL_FUNC (page_mapped_cb), page); + gtk_signal_connect (GTK_OBJECT (page_widget), "unmap", + GTK_SIGNAL_FUNC (page_unmapped_cb), page); + /* The first page is the main page of the editor, so we ask it to focus * its main widget. */ @@ -1023,32 +1060,12 @@ save_as_ok (GtkWidget *widget, gpointer data) FILE *file; gchar *ical_string; - icalcomponent *top_level; - icalcomponent *icalcomp; - icalproperty *prop; - - top_level = icalcomponent_new (ICAL_VCALENDAR_COMPONENT); - - /* RFC 2445, section 4.7.1 */ - prop = icalproperty_new_calscale ("GREGORIAN"); - icalcomponent_add_property (top_level, prop); - - /* RFC 2445, section 4.7.3 */ - prop = icalproperty_new_prodid ("-//Ximian//NONSGML Evolution Calendar//EN"); - icalcomponent_add_property (top_level, prop); - - /* RFC 2445, section 4.7.4. This is the iCalendar spec version, *NOT* - * the product version! Do not change this! - */ - prop = icalproperty_new_version ("2.0"); - icalcomponent_add_property (top_level, prop); - - icalcomp = cal_component_get_icalcomponent (priv->comp); - g_assert (icalcomp != NULL); - - icalcomponent_add_component (top_level, icalcomp); - - ical_string = icalcomponent_as_ical_string (top_level); + ical_string = cal_client_get_component_as_string (priv->client, priv->comp); + if (ical_string == NULL) { + g_warning ("Couldn't convert item to a string"); + gtk_main_quit (); + return; + } file = fopen (path, "w"); if (file == NULL) { @@ -1058,6 +1075,7 @@ save_as_ok (GtkWidget *widget, gpointer data) } fprintf (file, ical_string); + g_free (ical_string); fclose (file); gtk_main_quit (); diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c index f4a849db11..9c89fbdf53 100644 --- a/calendar/gui/dialogs/event-page.c +++ b/calendar/gui/dialogs/event-page.c @@ -715,7 +715,10 @@ event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) static gboolean get_widgets (EventPage *epage) { + CompEditorPage *page = COMP_EDITOR_PAGE (epage); EventPagePrivate *priv; + GSList *accel_groups; + GtkWidget *toplevel; priv = epage->priv; @@ -725,6 +728,15 @@ get_widgets (EventPage *epage) if (!priv->main) return FALSE; + /* Get the GtkAccelGroup from the toplevel window, so we can install + it when the notebook page is mapped. */ + toplevel = gtk_widget_get_toplevel (priv->main); + accel_groups = gtk_accel_groups_from_object (GTK_OBJECT (toplevel)); + if (accel_groups) { + page->accel_group = accel_groups->data; + gtk_accel_group_ref (page->accel_group); + } + gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); diff --git a/calendar/gui/dialogs/event-page.glade b/calendar/gui/dialogs/event-page.glade index e90490dd03..0e591b0663 100644 --- a/calendar/gui/dialogs/event-page.glade +++ b/calendar/gui/dialogs/event-page.glade @@ -132,6 +132,7 @@ 0.5 0 0 + start-time 0 1 @@ -158,6 +159,7 @@ 0.5 0 0 + end-time 0 1 @@ -177,6 +179,7 @@ Custom start-time + True make_date_edit @@ -202,6 +205,7 @@ Custom end-time + True make_date_edit 0 0 @@ -467,6 +471,7 @@ GtkButton contacts-button True + GTK_RELIEF_NORMAL 0 False @@ -504,6 +509,7 @@ GtkButton categories-button True + GTK_RELIEF_NORMAL 0 False diff --git a/calendar/gui/dialogs/meeting-page.c b/calendar/gui/dialogs/meeting-page.c index 447022e81c..3ae487c31d 100644 --- a/calendar/gui/dialogs/meeting-page.c +++ b/calendar/gui/dialogs/meeting-page.c @@ -456,7 +456,10 @@ meeting_page_fill_component (CompEditorPage *page, CalComponent *comp) static gboolean get_widgets (MeetingPage *mpage) { + CompEditorPage *page = COMP_EDITOR_PAGE (mpage); MeetingPagePrivate *priv; + GSList *accel_groups; + GtkWidget *toplevel; priv = mpage->priv; @@ -466,6 +469,15 @@ get_widgets (MeetingPage *mpage) if (!priv->main) return FALSE; + /* Get the GtkAccelGroup from the toplevel window, so we can install + it when the notebook page is mapped. */ + toplevel = gtk_widget_get_toplevel (priv->main); + accel_groups = gtk_accel_groups_from_object (GTK_OBJECT (toplevel)); + if (accel_groups) { + page->accel_group = accel_groups->data; + gtk_accel_group_ref (page->accel_group); + } + gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c index 28858bd950..c76b6dd970 100644 --- a/calendar/gui/dialogs/recurrence-page.c +++ b/calendar/gui/dialogs/recurrence-page.c @@ -582,8 +582,9 @@ sensitize_recur_widgets (RecurrencePage *rpage) } } +#if 0 /* Encondes a position/weekday pair into the proper format for - * icalrecurrencetype.by_day. + * icalrecurrencetype.by_day. Not needed at present. */ static short nth_weekday (int pos, icalrecurrencetype_weekday weekday) @@ -592,6 +593,7 @@ nth_weekday (int pos, icalrecurrencetype_weekday weekday) return (pos << 3) | (int) weekday; } +#endif /* Gets the simple recurrence data from the recurrence widgets and stores it in * the calendar component. @@ -678,39 +680,42 @@ simple_recur_to_comp (RecurrencePage *rpage, CalComponent *comp) r.by_month_day[0] = day_index; break; + /* Outlook 2000 uses BYDAY=TU;BYSETPOS=2, and will not + accept BYDAY=2TU. So we now use the same as Outlook + by default. */ case MONTH_DAY_MON: - r.by_day[0] = nth_weekday (day_index, - ICAL_MONDAY_WEEKDAY); + r.by_day[0] = ICAL_MONDAY_WEEKDAY; + r.by_set_pos[0] = day_index; break; case MONTH_DAY_TUE: - r.by_day[0] = nth_weekday (day_index, - ICAL_TUESDAY_WEEKDAY); + r.by_day[0] = ICAL_TUESDAY_WEEKDAY; + r.by_set_pos[0] = day_index; break; case MONTH_DAY_WED: - r.by_day[0] = nth_weekday (day_index, - ICAL_WEDNESDAY_WEEKDAY); + r.by_day[0] = ICAL_WEDNESDAY_WEEKDAY; + r.by_set_pos[0] = day_index; break; case MONTH_DAY_THU: - r.by_day[0] = nth_weekday (day_index, - ICAL_THURSDAY_WEEKDAY); + r.by_day[0] = ICAL_THURSDAY_WEEKDAY; + r.by_set_pos[0] = day_index; break; case MONTH_DAY_FRI: - r.by_day[0] = nth_weekday (day_index, - ICAL_FRIDAY_WEEKDAY); + r.by_day[0] = ICAL_FRIDAY_WEEKDAY; + r.by_set_pos[0] = day_index; break; case MONTH_DAY_SAT: - r.by_day[0] = nth_weekday (day_index, - ICAL_SATURDAY_WEEKDAY); + r.by_day[0] = ICAL_SATURDAY_WEEKDAY; + r.by_set_pos[0] = day_index; break; case MONTH_DAY_SUN: - r.by_day[0] = nth_weekday (day_index, - ICAL_SUNDAY_WEEKDAY); + r.by_day[0] = ICAL_SUNDAY_WEEKDAY; + r.by_set_pos[0] = day_index; break; default: @@ -1577,12 +1582,15 @@ recurrence_page_fill_widgets (CompEditorPage *page, CalComponent *comp) if (n_by_year_day != 0 || n_by_week_no != 0 || n_by_month != 0 - || n_by_set_pos != 0) + || n_by_set_pos > 1) goto custom; if (n_by_month_day == 1) { int nth; + if (n_by_set_pos != 0) + goto custom; + nth = r->by_month_day[0]; if (nth < 1) goto custom; @@ -1594,11 +1602,20 @@ recurrence_page_fill_widgets (CompEditorPage *page, CalComponent *comp) int pos; enum month_day_options month_day; + /* Outlook 2000 uses BYDAY=TU;BYSETPOS=2, and will not + accept BYDAY=2TU. So we now use the same as Outlook + by default. */ + weekday = icalrecurrencetype_day_day_of_week (r->by_day[0]); pos = icalrecurrencetype_day_position (r->by_day[0]); - if (pos < 1) + if (pos == 0) { + if (n_by_set_pos != 1) + goto custom; + pos = r->by_set_pos[0]; + } else if (pos < 0) { goto custom; + } switch (weekday) { case ICAL_MONDAY_WEEKDAY: @@ -1799,7 +1816,10 @@ recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) static gboolean get_widgets (RecurrencePage *rpage) { + CompEditorPage *page = COMP_EDITOR_PAGE (rpage); RecurrencePagePrivate *priv; + GSList *accel_groups; + GtkWidget *toplevel; priv = rpage->priv; @@ -1809,6 +1829,15 @@ get_widgets (RecurrencePage *rpage) if (!priv->main) return FALSE; + /* Get the GtkAccelGroup from the toplevel window, so we can install + it when the notebook page is mapped. */ + toplevel = gtk_widget_get_toplevel (priv->main); + accel_groups = gtk_accel_groups_from_object (GTK_OBJECT (toplevel)); + if (accel_groups) { + page->accel_group = accel_groups->data; + gtk_accel_group_ref (page->accel_group); + } + gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); diff --git a/calendar/gui/dialogs/schedule-page.c b/calendar/gui/dialogs/schedule-page.c index 3da74ad6a1..577190b619 100644 --- a/calendar/gui/dialogs/schedule-page.c +++ b/calendar/gui/dialogs/schedule-page.c @@ -336,7 +336,10 @@ schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) static gboolean get_widgets (SchedulePage *spage) { + CompEditorPage *page = COMP_EDITOR_PAGE (spage); SchedulePagePrivate *priv; + GSList *accel_groups; + GtkWidget *toplevel; priv = spage->priv; @@ -346,6 +349,15 @@ get_widgets (SchedulePage *spage) if (!priv->main) return FALSE; + /* Get the GtkAccelGroup from the toplevel window, so we can install + it when the notebook page is mapped. */ + toplevel = gtk_widget_get_toplevel (priv->main); + accel_groups = gtk_accel_groups_from_object (GTK_OBJECT (toplevel)); + if (accel_groups) { + page->accel_group = accel_groups->data; + gtk_accel_group_ref (page->accel_group); + } + gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); diff --git a/calendar/gui/dialogs/task-details-page.c b/calendar/gui/dialogs/task-details-page.c index 474b80da12..fda85f0aa5 100644 --- a/calendar/gui/dialogs/task-details-page.c +++ b/calendar/gui/dialogs/task-details-page.c @@ -446,7 +446,10 @@ task_details_page_fill_component (CompEditorPage *page, CalComponent *comp) static gboolean get_widgets (TaskDetailsPage *tdpage) { + CompEditorPage *page = COMP_EDITOR_PAGE (tdpage); TaskDetailsPagePrivate *priv; + GSList *accel_groups; + GtkWidget *toplevel; priv = tdpage->priv; @@ -456,6 +459,15 @@ get_widgets (TaskDetailsPage *tdpage) if (!priv->main) return FALSE; + /* Get the GtkAccelGroup from the toplevel window, so we can install + it when the notebook page is mapped. */ + toplevel = gtk_widget_get_toplevel (priv->main); + accel_groups = gtk_accel_groups_from_object (GTK_OBJECT (toplevel)); + if (accel_groups) { + page->accel_group = accel_groups->data; + gtk_accel_group_ref (page->accel_group); + } + gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); diff --git a/calendar/gui/dialogs/task-page.c b/calendar/gui/dialogs/task-page.c index dd2b3839cc..d60ca5ba5b 100644 --- a/calendar/gui/dialogs/task-page.c +++ b/calendar/gui/dialogs/task-page.c @@ -599,7 +599,10 @@ task_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) static gboolean get_widgets (TaskPage *tpage) { + CompEditorPage *page = COMP_EDITOR_PAGE (tpage); TaskPagePrivate *priv; + GSList *accel_groups; + GtkWidget *toplevel; priv = tpage->priv; @@ -609,6 +612,15 @@ get_widgets (TaskPage *tpage) if (!priv->main) return FALSE; + /* Get the GtkAccelGroup from the toplevel window, so we can install + it when the notebook page is mapped. */ + toplevel = gtk_widget_get_toplevel (priv->main); + accel_groups = gtk_accel_groups_from_object (GTK_OBJECT (toplevel)); + if (accel_groups) { + page->accel_group = accel_groups->data; + gtk_accel_group_ref (page->accel_group); + } + gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); diff --git a/calendar/gui/dialogs/task-page.glade b/calendar/gui/dialogs/task-page.glade index 10e0180eff..31a7ba2cbe 100644 --- a/calendar/gui/dialogs/task-page.glade +++ b/calendar/gui/dialogs/task-page.glade @@ -140,6 +140,7 @@ 0.5 0 0 + start-date 0 1 @@ -166,6 +167,7 @@ 0.5 0 0 + due-date 0 1 @@ -185,6 +187,7 @@ Custom due-date + True task_page_create_date_edit 0 0 @@ -208,6 +211,7 @@ Custom start-date + True task_page_create_date_edit 0 0 @@ -382,7 +386,7 @@ GtkRadioButton classification-confidential True - + False True classification_radio_group @@ -410,6 +414,7 @@ GtkButton contacts-button True + GTK_RELIEF_NORMAL 0 False @@ -447,6 +452,7 @@ GtkButton categories-button True + GTK_RELIEF_NORMAL 0 False -- cgit v1.2.3