aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/dialogs/alarm-page.c12
-rw-r--r--calendar/gui/dialogs/comp-editor-page.c6
-rw-r--r--calendar/gui/dialogs/comp-editor-page.h6
-rw-r--r--calendar/gui/dialogs/comp-editor.c70
-rw-r--r--calendar/gui/dialogs/event-page.c12
-rw-r--r--calendar/gui/dialogs/event-page.glade6
-rw-r--r--calendar/gui/dialogs/meeting-page.c12
-rw-r--r--calendar/gui/dialogs/recurrence-page.c63
-rw-r--r--calendar/gui/dialogs/schedule-page.c12
-rw-r--r--calendar/gui/dialogs/task-details-page.c12
-rw-r--r--calendar/gui/dialogs/task-page.c12
-rw-r--r--calendar/gui/dialogs/task-page.glade8
12 files changed, 187 insertions, 44 deletions
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 @@
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
+ <focus_target>start-time</focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@@ -158,6 +159,7 @@
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
+ <focus_target>end-time</focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@@ -177,6 +179,7 @@
<widget>
<class>Custom</class>
<name>start-time</name>
+ <can_focus>True</can_focus>
<creation_function>make_date_edit</creation_function>
<string1></string1>
<string2></string2>
@@ -202,6 +205,7 @@
<widget>
<class>Custom</class>
<name>end-time</name>
+ <can_focus>True</can_focus>
<creation_function>make_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
@@ -467,6 +471,7 @@
<class>GtkButton</class>
<name>contacts-button</name>
<can_focus>True</can_focus>
+ <relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@@ -504,6 +509,7 @@
<class>GtkButton</class>
<name>categories-button</name>
<can_focus>True</can_focus>
+ <relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
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 @@
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
+ <focus_target>start-date</focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@@ -166,6 +167,7 @@
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
+ <focus_target>due-date</focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@@ -185,6 +187,7 @@
<widget>
<class>Custom</class>
<name>due-date</name>
+ <can_focus>True</can_focus>
<creation_function>task_page_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
@@ -208,6 +211,7 @@
<widget>
<class>Custom</class>
<name>start-date</name>
+ <can_focus>True</can_focus>
<creation_function>task_page_create_date_edit</creation_function>
<int1>0</int1>
<int2>0</int2>
@@ -382,7 +386,7 @@
<class>GtkRadioButton</class>
<name>classification-confidential</name>
<can_focus>True</can_focus>
- <label>_Confidential</label>
+ <label>Con_fidential</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
<group>classification_radio_group</group>
@@ -410,6 +414,7 @@
<class>GtkButton</class>
<name>contacts-button</name>
<can_focus>True</can_focus>
+ <relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
@@ -447,6 +452,7 @@
<class>GtkButton</class>
<name>categories-button</name>
<can_focus>True</can_focus>
+ <relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>