2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU Lesser General Public License as published by
4 * the Free Software Foundation.
6 * This program is distributed in the hope that it will be useful, but
7 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
8 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * You should have received a copy of the GNU Lesser General Public License
12 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 * Damon Chaplin <damon@ximian.com>
17 * Ettore Perazzoli <ettore@ximian.com>
18 * David Trowbridge <trowbrds cs colorado edu>
20 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
24 #include "evolution-config.h"
26 #include "e-calendar-preferences.h"
29 #include <glib/gi18n.h>
31 #include "calendar/gui/e-cal-config.h"
32 #include "calendar/gui/e-timezone-entry.h"
33 #include "calendar/gui/calendar-config.h"
34 #include "shell/e-shell-utils.h"
36 #define ITIP_FORMATTER_CONF_KEY_DELETE "delete-processed"
38 struct _ECalendarPreferencesPrivate
{
40 ESourceRegistry
*registry
;
43 GtkWidget
*day_second_zone
;
44 GtkWidget
*start_of_day
;
45 GtkWidget
*end_of_day
;
48 GtkWidget
*reminder_calendars_scrolled_window
;
49 GtkWidget
*reminder_memos_scrolled_window
;
50 GtkWidget
*reminder_tasks_scrolled_window
;
53 G_DEFINE_DYNAMIC_TYPE (
55 e_calendar_preferences
,
59 calendar_preferences_map_string_to_integer (GValue
*value
,
63 GEnumClass
*enum_class
= G_ENUM_CLASS (user_data
);
64 GEnumValue
*enum_value
;
67 /* XXX GSettings should know how to bind enum settings to
68 * integer properties. I filed a bug asking for this:
69 * https://bugzilla.gnome.org/show_bug.cgi?id=695217 */
71 nick
= g_variant_get_string (variant
, NULL
);
72 enum_value
= g_enum_get_value_by_nick (enum_class
, nick
);
73 g_return_val_if_fail (enum_value
!= NULL
, FALSE
);
74 g_value_set_int (value
, enum_value
->value
);
80 calendar_preferences_map_integer_to_string (const GValue
*value
,
81 const GVariantType
*expected_type
,
84 GEnumClass
*enum_class
= G_ENUM_CLASS (user_data
);
85 GEnumValue
*enum_value
;
87 /* XXX GSettings should know how to bind enum settings to
88 * integer properties. I filed a bug asking for this:
89 * https://bugzilla.gnome.org/show_bug.cgi?id=695217 */
91 enum_value
= g_enum_get_value (enum_class
, g_value_get_int (value
));
92 g_return_val_if_fail (enum_value
!= NULL
, NULL
);
94 return g_variant_new_string (enum_value
->value_nick
);
98 calendar_preferences_map_string_to_icaltimezone (GValue
*value
,
103 const gchar
*location
= NULL
;
104 icaltimezone
*timezone
= NULL
;
106 settings
= e_util_ref_settings ("org.gnome.evolution.calendar");
108 if (g_settings_get_boolean (settings
, "use-system-timezone"))
109 timezone
= e_cal_util_get_system_timezone ();
111 location
= g_variant_get_string (variant
, NULL
);
113 if (location
!= NULL
&& *location
!= '\0')
114 timezone
= icaltimezone_get_builtin_timezone (location
);
116 if (timezone
== NULL
)
117 timezone
= icaltimezone_get_utc_timezone ();
119 g_value_set_pointer (value
, timezone
);
121 g_object_unref (settings
);
127 calendar_preferences_map_icaltimezone_to_string (const GValue
*value
,
128 const GVariantType
*expected_type
,
133 const gchar
*location
= NULL
;
134 gchar
*location_str
= NULL
;
135 icaltimezone
*timezone
;
137 settings
= e_util_ref_settings ("org.gnome.evolution.calendar");
139 if (g_settings_get_boolean (settings
, "use-system-timezone")) {
140 location_str
= g_settings_get_string (settings
, "timezone");
141 location
= location_str
;
143 timezone
= g_value_get_pointer (value
);
145 if (timezone
!= NULL
)
146 location
= icaltimezone_get_location (timezone
);
149 if (location
== NULL
)
152 variant
= g_variant_new_string (location
);
154 g_free (location_str
);
156 g_object_unref (settings
);
162 calendar_preferences_map_time_divisions_to_index (GValue
*value
,
166 gboolean success
= TRUE
;
168 switch (g_variant_get_int32 (variant
)) {
170 g_value_set_int (value
, 0);
173 g_value_set_int (value
, 1);
176 g_value_set_int (value
, 2);
179 g_value_set_int (value
, 3);
182 g_value_set_int (value
, 4);
192 calendar_preferences_map_index_to_time_divisions (const GValue
*value
,
193 const GVariantType
*expected_type
,
196 switch (g_value_get_int (value
)) {
198 return g_variant_new_int32 (60);
200 return g_variant_new_int32 (30);
202 return g_variant_new_int32 (15);
204 return g_variant_new_int32 (10);
206 return g_variant_new_int32 (5);
215 calendar_preferences_map_string_to_gdk_color (GValue
*value
,
221 gboolean success
= FALSE
;
223 string
= g_variant_get_string (variant
, NULL
);
224 if (gdk_color_parse (string
, &color
)) {
225 g_value_set_boxed (value
, &color
);
233 calendar_preferences_map_gdk_color_to_string (const GValue
*value
,
234 const GVariantType
*expected_type
,
238 const GdkColor
*color
;
240 color
= g_value_get_boxed (value
);
242 variant
= g_variant_new_string ("");
246 string
= gdk_color_to_string (color
);
247 variant
= g_variant_new_string (string
);
255 calendar_preferences_dispose (GObject
*object
)
257 ECalendarPreferences
*prefs
= E_CALENDAR_PREFERENCES (object
);
259 g_clear_object (&prefs
->priv
->builder
);
260 g_clear_object (&prefs
->priv
->registry
);
262 /* Chain up to parent's dispose() method. */
263 G_OBJECT_CLASS (e_calendar_preferences_parent_class
)->dispose (object
);
267 e_calendar_preferences_class_init (ECalendarPreferencesClass
*class)
269 GObjectClass
*object_class
;
271 g_type_class_add_private (class, sizeof (ECalendarPreferencesPrivate
));
273 object_class
= G_OBJECT_CLASS (class);
274 object_class
->dispose
= calendar_preferences_dispose
;
278 e_calendar_preferences_class_finalize (ECalendarPreferencesClass
*class)
283 e_calendar_preferences_init (ECalendarPreferences
*preferences
)
285 preferences
->priv
= G_TYPE_INSTANCE_GET_PRIVATE (preferences
, E_TYPE_CALENDAR_PREFERENCES
, ECalendarPreferencesPrivate
);
287 gtk_orientable_set_orientation (GTK_ORIENTABLE (preferences
), GTK_ORIENTATION_VERTICAL
);
291 calendar_preferences_get_config_widget (EConfig
*ec
,
298 ECalendarPreferences
*preferences
= data
;
300 return e_builder_get_widget (preferences
->priv
->builder
, item
->label
);
304 update_day_second_zone_caption (ECalendarPreferences
*prefs
)
307 const gchar
*caption
;
310 g_return_if_fail (prefs
!= NULL
);
312 /* Translators: "None" indicates no second time zone set for a day view */
313 caption
= C_("cal-second-zone", "None");
315 location
= calendar_config_get_day_second_zone ();
316 if (location
&& *location
) {
317 zone
= icaltimezone_get_builtin_timezone (location
);
318 if (zone
&& icaltimezone_get_display_name (zone
)) {
319 caption
= icaltimezone_get_display_name (zone
);
324 gtk_button_set_label (GTK_BUTTON (prefs
->priv
->day_second_zone
), caption
);
328 on_set_day_second_zone (GtkWidget
*item
,
329 ECalendarPreferences
*prefs
)
331 if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (item
)))
334 calendar_config_set_day_second_zone (g_object_get_data (G_OBJECT (item
), "timezone"));
335 update_day_second_zone_caption (prefs
);
339 on_select_day_second_zone (GtkWidget
*item
,
340 ECalendarPreferences
*prefs
)
342 g_return_if_fail (prefs
!= NULL
);
344 calendar_config_select_day_second_zone ();
345 update_day_second_zone_caption (prefs
);
349 day_second_zone_clicked (GtkWidget
*widget
,
350 ECalendarPreferences
*prefs
)
352 GtkWidget
*menu
, *item
;
353 GSList
*group
= NULL
, *recent_zones
, *s
;
355 icaltimezone
*zone
, *second_zone
= NULL
;
357 menu
= gtk_menu_new ();
359 location
= calendar_config_get_day_second_zone ();
360 if (location
&& *location
)
361 second_zone
= icaltimezone_get_builtin_timezone (location
);
365 item
= gtk_radio_menu_item_new_with_label (group
, C_("cal-second-zone", "None"));
366 group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item
));
368 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item
), TRUE
);
369 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), item
);
372 G_CALLBACK (on_set_day_second_zone
), prefs
);
374 recent_zones
= calendar_config_get_day_second_zones ();
375 for (s
= recent_zones
; s
!= NULL
; s
= s
->next
) {
376 zone
= icaltimezone_get_builtin_timezone (s
->data
);
380 item
= gtk_radio_menu_item_new_with_label (group
, icaltimezone_get_display_name (zone
));
381 group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item
));
382 /* both comes from builtin, thus no problem to compare pointers */
383 if (zone
== second_zone
)
384 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item
), TRUE
);
385 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), item
);
386 g_object_set_data_full (G_OBJECT (item
), "timezone", g_strdup (s
->data
), g_free
);
389 G_CALLBACK (on_set_day_second_zone
), prefs
);
391 calendar_config_free_day_second_zones (recent_zones
);
393 item
= gtk_separator_menu_item_new ();
394 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), item
);
396 item
= gtk_menu_item_new_with_label (_("Select..."));
399 G_CALLBACK (on_select_day_second_zone
), prefs
);
400 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), item
);
402 gtk_widget_show_all (menu
);
404 gtk_menu_attach_to_widget (GTK_MENU (menu
), widget
, NULL
);
405 g_signal_connect (menu
, "deactivate", G_CALLBACK (gtk_menu_detach
), NULL
);
406 gtk_menu_popup_at_pointer (GTK_MENU (menu
), NULL
);
410 start_of_day_changed (GtkWidget
*widget
,
411 ECalendarPreferences
*prefs
)
413 EDateEdit
*start
, *end
;
420 start
= E_DATE_EDIT (prefs
->priv
->start_of_day
);
421 end
= E_DATE_EDIT (prefs
->priv
->end_of_day
);
423 e_date_edit_get_time_of_day (start
, &start_hour
, &start_minute
);
424 e_date_edit_get_time_of_day (end
, &end_hour
, &end_minute
);
426 if ((start_hour
> end_hour
) || (start_hour
== end_hour
&& start_minute
> end_minute
)) {
428 e_date_edit_set_time_of_day (end
, start_hour
+ 1, start_minute
);
430 e_date_edit_set_time_of_day (end
, 23, 59);
435 settings
= e_util_ref_settings ("org.gnome.evolution.calendar");
437 g_settings_set_int (settings
, "day-start-hour", start_hour
);
438 g_settings_set_int (settings
, "day-start-minute", start_minute
);
440 g_object_unref (settings
);
444 end_of_day_changed (GtkWidget
*widget
,
445 ECalendarPreferences
*prefs
)
447 EDateEdit
*start
, *end
;
454 start
= E_DATE_EDIT (prefs
->priv
->start_of_day
);
455 end
= E_DATE_EDIT (prefs
->priv
->end_of_day
);
457 e_date_edit_get_time_of_day (start
, &start_hour
, &start_minute
);
458 e_date_edit_get_time_of_day (end
, &end_hour
, &end_minute
);
460 if ((end_hour
< start_hour
) || (end_hour
== start_hour
&& end_minute
< start_minute
)) {
462 e_date_edit_set_time_of_day (start
, 0, 0);
464 e_date_edit_set_time_of_day (start
, end_hour
- 1, end_minute
);
469 settings
= e_util_ref_settings ("org.gnome.evolution.calendar");
471 g_settings_set_int (settings
, "day-end-hour", end_hour
);
472 g_settings_set_int (settings
, "day-end-minute", end_minute
);
474 g_object_unref (settings
);
478 update_system_tz_widgets (GtkCheckButton
*button
,
479 ECalendarPreferences
*prefs
)
483 const gchar
*display_name
;
486 widget
= e_builder_get_widget (prefs
->priv
->builder
, "system-tz-label");
487 g_return_if_fail (GTK_IS_LABEL (widget
));
489 zone
= e_cal_util_get_system_timezone ();
491 display_name
= gettext (icaltimezone_get_display_name (zone
));
493 display_name
= "UTC";
495 text
= g_strdup_printf ("(%s)", display_name
);
496 gtk_label_set_text (GTK_LABEL (widget
), text
);
501 setup_changes (ECalendarPreferences
*prefs
)
504 prefs
->priv
->day_second_zone
, "clicked",
505 G_CALLBACK (day_second_zone_clicked
), prefs
);
508 prefs
->priv
->start_of_day
, "changed",
509 G_CALLBACK (start_of_day_changed
), prefs
);
512 prefs
->priv
->end_of_day
, "changed",
513 G_CALLBACK (end_of_day_changed
), prefs
);
517 show_alarms_config (ECalendarPreferences
*prefs
)
521 widget
= e_alarm_selector_new (prefs
->priv
->registry
, E_SOURCE_EXTENSION_CALENDAR
);
522 atk_object_set_name (
523 gtk_widget_get_accessible (widget
),
524 _("Selected Calendars for Notifications of Reminders"));
525 gtk_container_add (GTK_CONTAINER (prefs
->priv
->reminder_calendars_scrolled_window
), widget
);
526 gtk_widget_show (widget
);
528 widget
= e_alarm_selector_new (prefs
->priv
->registry
, E_SOURCE_EXTENSION_MEMO_LIST
);
529 atk_object_set_name (
530 gtk_widget_get_accessible (widget
),
531 _("Selected Memo Lists for Notifications of Reminders"));
532 gtk_container_add (GTK_CONTAINER (prefs
->priv
->reminder_memos_scrolled_window
), widget
);
533 gtk_widget_show (widget
);
535 widget
= e_alarm_selector_new (prefs
->priv
->registry
, E_SOURCE_EXTENSION_TASK_LIST
);
536 atk_object_set_name (
537 gtk_widget_get_accessible (widget
),
538 _("Selected Task Lists for Notifications of Reminders"));
539 gtk_container_add (GTK_CONTAINER (prefs
->priv
->reminder_tasks_scrolled_window
), widget
);
540 gtk_widget_show (widget
);
543 /* Shows the current config settings in the dialog. */
545 show_config (ECalendarPreferences
*prefs
)
549 settings
= e_util_ref_settings ("org.gnome.evolution.calendar");
551 /* Day's second zone */
552 update_day_second_zone_caption (prefs
);
555 e_date_edit_set_time_of_day (
556 E_DATE_EDIT (prefs
->priv
->start_of_day
),
557 g_settings_get_int (settings
, "day-start-hour"),
558 g_settings_get_int (settings
, "day-start-minute"));
561 e_date_edit_set_time_of_day (
562 E_DATE_EDIT (prefs
->priv
->end_of_day
),
563 g_settings_get_int (settings
, "day-end-hour"),
564 g_settings_get_int (settings
, "day-end-minute"));
567 show_alarms_config (prefs
);
569 g_object_unref (settings
);
572 /* plugin meta-data */
573 static ECalConfigItem eccp_items
[] = {
574 { E_CONFIG_BOOK
, (gchar
*) "", (gchar
*) "toplevel-notebook", calendar_preferences_get_config_widget
},
575 { E_CONFIG_PAGE
, (gchar
*) "00.general", (gchar
*) "general", calendar_preferences_get_config_widget
},
576 { E_CONFIG_SECTION_TABLE
, (gchar
*) "00.general/00.time", (gchar
*) "time", calendar_preferences_get_config_widget
},
577 { E_CONFIG_SECTION_TABLE
, (gchar
*) "00.general/10.workWeek", (gchar
*) "workWeek", calendar_preferences_get_config_widget
},
578 { E_CONFIG_SECTION
, (gchar
*) "00.general/20.alerts", (gchar
*) "alerts", calendar_preferences_get_config_widget
},
579 { E_CONFIG_PAGE
, (gchar
*) "10.display", (gchar
*) "display", calendar_preferences_get_config_widget
},
580 { E_CONFIG_SECTION
, (gchar
*) "10.display/00.general", (gchar
*) "displayGeneral", calendar_preferences_get_config_widget
},
581 { E_CONFIG_SECTION
, (gchar
*) "10.display/10.taskList", (gchar
*) "taskList", calendar_preferences_get_config_widget
},
582 { E_CONFIG_PAGE
, (gchar
*) "12.tasks", (gchar
*) "tasks-vbox", calendar_preferences_get_config_widget
},
583 { E_CONFIG_PAGE
, (gchar
*) "15.alarms", (gchar
*) "alarms", calendar_preferences_get_config_widget
},
584 { E_CONFIG_PAGE
, (gchar
*) "20.freeBusy", (gchar
*) "freebusy", calendar_preferences_get_config_widget
},
585 { E_CONFIG_SECTION
, (gchar
*) "20.freeBusy/00.defaultServer", (gchar
*) "default-freebusy-vbox", calendar_preferences_get_config_widget
},
589 eccp_free (EConfig
*ec
,
593 g_slist_free (items
);
597 itip_formatter_delete_toggled_cb (GtkWidget
*widget
)
602 settings
= e_util_ref_settings ("org.gnome.evolution.plugin.itip");
603 active
= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget
));
604 g_settings_set_boolean (settings
, ITIP_FORMATTER_CONF_KEY_DELETE
, active
);
605 g_object_unref (settings
);
609 calendar_preferences_add_itip_formatter_page (EShell
*shell
,
612 ESourceRegistry
*registry
;
614 GtkWidget
*tab_label
;
616 GtkWidget
*frame_label
;
617 GtkWidget
*padding_label
;
619 GtkWidget
*inner_vbox
;
623 GtkWidget
*scrolledwin
;
627 g_return_if_fail (GTK_IS_NOTEBOOK (notebook
));
629 registry
= e_shell_get_registry (shell
);
631 /* Create a new notebook page */
632 page
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
633 gtk_container_set_border_width (GTK_CONTAINER (page
), 12);
634 tab_label
= gtk_label_new (_("Meeting Invitations"));
635 gtk_notebook_append_page (GTK_NOTEBOOK (notebook
), page
, tab_label
);
638 frame
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 6);
639 gtk_box_pack_start (GTK_BOX (page
), frame
, FALSE
, FALSE
, 0);
642 frame_label
= gtk_label_new ("");
643 str
= g_strdup_printf ("<span weight=\"bold\">%s</span>", _("General"));
644 gtk_label_set_markup (GTK_LABEL (frame_label
), str
);
646 gtk_misc_set_alignment (GTK_MISC (frame_label
), 0.0, 0.5);
647 gtk_box_pack_start (GTK_BOX (frame
), frame_label
, FALSE
, FALSE
, 0);
650 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 12);
651 gtk_box_pack_start (GTK_BOX (frame
), hbox
, FALSE
, TRUE
, 0);
652 padding_label
= gtk_label_new ("");
653 gtk_box_pack_start (GTK_BOX (hbox
), padding_label
, FALSE
, FALSE
, 0);
654 inner_vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 6);
655 gtk_box_pack_start (GTK_BOX (hbox
), inner_vbox
, FALSE
, FALSE
, 0);
657 /* Delete message after acting */
658 settings
= e_util_ref_settings ("org.gnome.evolution.plugin.itip");
660 check
= gtk_check_button_new_with_mnemonic (_("_Delete message after acting"));
661 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check
), g_settings_get_boolean (settings
, ITIP_FORMATTER_CONF_KEY_DELETE
));
664 G_CALLBACK (itip_formatter_delete_toggled_cb
), NULL
);
665 gtk_box_pack_start (GTK_BOX (inner_vbox
), check
, FALSE
, FALSE
, 0);
667 g_object_unref (settings
);
669 /* "Conflict searching" */
670 frame
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 6);
671 gtk_box_pack_start (GTK_BOX (page
), frame
, TRUE
, TRUE
, 24);
673 frame_label
= gtk_label_new ("");
674 str
= g_strdup_printf ("<span weight=\"bold\">%s</span>", _("Conflict Search"));
675 gtk_label_set_markup (GTK_LABEL (frame_label
), str
);
677 gtk_misc_set_alignment (GTK_MISC (frame_label
), 0.0, 0.5);
678 gtk_box_pack_start (GTK_BOX (frame
), frame_label
, FALSE
, FALSE
, 0);
681 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 12);
682 gtk_box_pack_start (GTK_BOX (frame
), hbox
, TRUE
, TRUE
, 0);
683 padding_label
= gtk_label_new ("");
684 gtk_box_pack_start (GTK_BOX (hbox
), padding_label
, FALSE
, FALSE
, 0);
685 inner_vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 6);
686 gtk_box_pack_start (GTK_BOX (hbox
), inner_vbox
, TRUE
, TRUE
, 0);
688 /* Source selector */
689 label
= gtk_label_new (_("Select the calendars to search for meeting conflicts"));
690 gtk_misc_set_alignment (GTK_MISC (label
), 0, 0.5);
691 gtk_box_pack_start (GTK_BOX (inner_vbox
), label
, FALSE
, FALSE
, 0);
693 scrolledwin
= gtk_scrolled_window_new (NULL
, NULL
);
695 gtk_scrolled_window_set_policy (
696 GTK_SCROLLED_WINDOW (scrolledwin
),
697 GTK_POLICY_AUTOMATIC
,
698 GTK_POLICY_AUTOMATIC
);
699 gtk_scrolled_window_set_shadow_type (
700 GTK_SCROLLED_WINDOW (scrolledwin
),
702 gtk_box_pack_start (GTK_BOX (inner_vbox
), scrolledwin
, TRUE
, TRUE
, 0);
704 ess
= e_conflict_search_selector_new (registry
);
705 atk_object_set_name (gtk_widget_get_accessible (ess
), _("Conflict Search"));
706 gtk_container_add (GTK_CONTAINER (scrolledwin
), ess
);
708 gtk_widget_show_all (page
);
712 calendar_preferences_construct (ECalendarPreferences
*prefs
,
716 ECalConfigTargetPrefs
*target
;
718 GSettings
*eds_settings
;
719 GSettings
*mail_settings
;
720 gboolean locale_supports_12_hour_format
;
727 settings
= e_util_ref_settings ("org.gnome.evolution.calendar");
728 mail_settings
= e_util_ref_settings ("org.gnome.evolution.mail");
730 locale_supports_12_hour_format
=
731 calendar_config_locale_supports_12_hour_format ();
733 /* Force 24 hour format for locales which don't support 12 hour format */
734 if (!locale_supports_12_hour_format
)
735 g_settings_set_boolean (settings
, "use-24hour-format", TRUE
);
737 /* Make sure our custom widget classes are registered with
738 * GType before we load the GtkBuilder definition file. */
739 g_type_ensure (E_TYPE_DATE_EDIT
);
740 g_type_ensure (E_TYPE_TIMEZONE_ENTRY
);
742 prefs
->priv
->builder
= gtk_builder_new ();
743 e_load_ui_builder_definition (prefs
->priv
->builder
, "e-calendar-preferences.ui");
745 /** @HookPoint-ECalConfig: Calendar Preferences Page
746 * @Id: org.gnome.evolution.calendar.prefs
747 * @Class: org.gnome.evolution.calendar.config:1.0
748 * @Target: ECalConfigTargetPrefs
750 * The mail calendar preferences page
752 ec
= e_cal_config_new ("org.gnome.evolution.calendar.prefs");
754 for (i
= 0; i
< G_N_ELEMENTS (eccp_items
); i
++)
755 l
= g_slist_prepend (l
, &eccp_items
[i
]);
756 e_config_add_items ((EConfig
*) ec
, l
, eccp_free
, prefs
);
758 calendar_preferences_add_itip_formatter_page (shell
, e_builder_get_widget (prefs
->priv
->builder
, "toplevel-notebook"));
760 widget
= e_builder_get_widget (prefs
->priv
->builder
, "use-system-tz-check");
762 settings
, "use-system-timezone",
764 G_SETTINGS_BIND_DEFAULT
);
767 G_CALLBACK (update_system_tz_widgets
), prefs
);
768 update_system_tz_widgets (GTK_CHECK_BUTTON (widget
), prefs
);
770 widget
= e_builder_get_widget (prefs
->priv
->builder
, "timezone");
771 g_settings_bind_with_mapping (
772 settings
, "timezone",
774 G_SETTINGS_BIND_DEFAULT
,
775 calendar_preferences_map_string_to_icaltimezone
,
776 calendar_preferences_map_icaltimezone_to_string
,
777 NULL
, (GDestroyNotify
) NULL
);
779 settings
, "use-system-timezone",
781 G_SETTINGS_BIND_DEFAULT
|
782 G_SETTINGS_BIND_INVERT_BOOLEAN
);
785 prefs
->priv
->day_second_zone
= e_builder_get_widget (prefs
->priv
->builder
, "day_second_zone");
787 widget
= e_builder_get_widget (prefs
->priv
->builder
, "sun_button");
789 settings
, "work-day-sunday",
791 G_SETTINGS_BIND_DEFAULT
);
793 widget
= e_builder_get_widget (prefs
->priv
->builder
, "mon_button");
795 settings
, "work-day-monday",
797 G_SETTINGS_BIND_DEFAULT
);
799 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tue_button");
801 settings
, "work-day-tuesday",
803 G_SETTINGS_BIND_DEFAULT
);
805 widget
= e_builder_get_widget (prefs
->priv
->builder
, "wed_button");
807 settings
, "work-day-wednesday",
809 G_SETTINGS_BIND_DEFAULT
);
811 widget
= e_builder_get_widget (prefs
->priv
->builder
, "thu_button");
813 settings
, "work-day-thursday",
815 G_SETTINGS_BIND_DEFAULT
);
817 widget
= e_builder_get_widget (prefs
->priv
->builder
, "fri_button");
819 settings
, "work-day-friday",
821 G_SETTINGS_BIND_DEFAULT
);
823 widget
= e_builder_get_widget (prefs
->priv
->builder
, "sat_button");
825 settings
, "work-day-saturday",
827 G_SETTINGS_BIND_DEFAULT
);
829 widget
= e_builder_get_widget (prefs
->priv
->builder
, "week_start_day");
831 settings
, "week-start-day-name",
833 G_SETTINGS_BIND_DEFAULT
);
835 widget
= e_builder_get_widget (prefs
->priv
->builder
, "start_of_day");
836 prefs
->priv
->start_of_day
= widget
; /* XXX delete this */
837 if (locale_supports_12_hour_format
)
839 settings
, "use-24hour-format",
840 widget
, "use-24-hour-format",
841 G_SETTINGS_BIND_GET
);
843 widget
= e_builder_get_widget (prefs
->priv
->builder
, "end_of_day");
844 prefs
->priv
->end_of_day
= widget
; /* XXX delete this */
845 if (locale_supports_12_hour_format
)
847 settings
, "use-24hour-format",
848 widget
, "use-24-hour-format",
849 G_SETTINGS_BIND_GET
);
851 widget
= e_builder_get_widget (prefs
->priv
->builder
, "use_12_hour");
852 gtk_widget_set_sensitive (widget
, locale_supports_12_hour_format
);
854 settings
, "use-24hour-format",
856 G_SETTINGS_BIND_DEFAULT
|
857 G_SETTINGS_BIND_INVERT_BOOLEAN
);
859 widget
= e_builder_get_widget (prefs
->priv
->builder
, "use_24_hour");
860 gtk_widget_set_sensitive (widget
, locale_supports_12_hour_format
);
862 settings
, "use-24hour-format",
864 G_SETTINGS_BIND_DEFAULT
);
866 widget
= e_builder_get_widget (prefs
->priv
->builder
, "confirm_delete");
868 settings
, "confirm-delete",
870 G_SETTINGS_BIND_DEFAULT
);
872 widget
= e_builder_get_widget (prefs
->priv
->builder
, "default_reminder");
874 settings
, "use-default-reminder",
876 G_SETTINGS_BIND_DEFAULT
);
878 widget
= e_builder_get_widget (prefs
->priv
->builder
, "default_reminder_interval");
880 settings
, "default-reminder-interval",
882 G_SETTINGS_BIND_DEFAULT
);
884 settings
, "use-default-reminder",
886 G_SETTINGS_BIND_GET
);
888 widget
= e_builder_get_widget (prefs
->priv
->builder
, "default_reminder_units");
889 g_settings_bind_with_mapping (
890 settings
, "default-reminder-units",
892 G_SETTINGS_BIND_DEFAULT
,
893 calendar_preferences_map_string_to_integer
,
894 calendar_preferences_map_integer_to_string
,
895 g_type_class_ref (E_TYPE_DURATION_TYPE
),
896 (GDestroyNotify
) g_type_class_unref
);
898 settings
, "use-default-reminder",
900 G_SETTINGS_BIND_GET
);
902 widget
= e_builder_get_widget (prefs
->priv
->builder
, "classify-private");
904 settings
, "classify-private",
906 G_SETTINGS_BIND_DEFAULT
);
908 /* These settings control the "Birthdays & Anniversaries" backend. */
911 e_util_ref_settings ("org.gnome.evolution-data-server.calendar");
913 widget
= e_builder_get_widget (prefs
->priv
->builder
, "ba_reminder");
915 eds_settings
, "contacts-reminder-enabled",
917 G_SETTINGS_BIND_DEFAULT
);
919 widget
= e_builder_get_widget (prefs
->priv
->builder
, "ba_reminder_interval");
921 eds_settings
, "contacts-reminder-interval",
923 G_SETTINGS_BIND_DEFAULT
);
925 eds_settings
, "contacts-reminder-enabled",
927 G_SETTINGS_BIND_GET
);
929 widget
= e_builder_get_widget (prefs
->priv
->builder
, "ba_reminder_units");
930 g_settings_bind_with_mapping (
931 eds_settings
, "contacts-reminder-units",
933 G_SETTINGS_BIND_DEFAULT
,
934 calendar_preferences_map_string_to_integer
,
935 calendar_preferences_map_integer_to_string
,
936 g_type_class_ref (E_TYPE_DURATION_TYPE
),
937 (GDestroyNotify
) g_type_class_unref
);
939 eds_settings
, "contacts-reminder-enabled",
941 G_SETTINGS_BIND_GET
);
943 g_object_unref (eds_settings
);
946 widget
= e_builder_get_widget (prefs
->priv
->builder
, "time_divisions");
947 g_settings_bind_with_mapping (
948 settings
, "time-divisions",
950 G_SETTINGS_BIND_DEFAULT
,
951 calendar_preferences_map_time_divisions_to_index
,
952 calendar_preferences_map_index_to_time_divisions
,
953 NULL
, (GDestroyNotify
) NULL
);
955 widget
= e_builder_get_widget (prefs
->priv
->builder
, "show_end_times");
957 settings
, "show-event-end",
959 G_SETTINGS_BIND_DEFAULT
);
961 widget
= e_builder_get_widget (prefs
->priv
->builder
, "show_icons_month_view");
963 settings
, "show-icons-month-view",
965 G_SETTINGS_BIND_DEFAULT
);
967 widget
= e_builder_get_widget (prefs
->priv
->builder
, "compress_weekend");
969 settings
, "compress-weekend",
971 G_SETTINGS_BIND_DEFAULT
);
973 widget
= e_builder_get_widget (prefs
->priv
->builder
, "show_week_numbers");
975 settings
, "show-week-numbers",
977 G_SETTINGS_BIND_DEFAULT
);
979 widget
= e_builder_get_widget (prefs
->priv
->builder
, "recur_events_italic");
981 settings
, "recur-events-italic",
983 G_SETTINGS_BIND_DEFAULT
);
985 widget
= e_builder_get_widget (prefs
->priv
->builder
, "month_scroll_by_week");
987 settings
, "month-scroll-by-week",
989 G_SETTINGS_BIND_DEFAULT
);
991 widget
= e_builder_get_widget (prefs
->priv
->builder
, "week_view_days_left_to_right");
993 settings
, "week-view-days-left-to-right",
995 G_SETTINGS_BIND_DEFAULT
);
997 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tasks_due_today_highlight");
999 settings
, "task-due-today-highlight",
1001 G_SETTINGS_BIND_DEFAULT
);
1003 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tasks_due_today_color");
1004 g_settings_bind_with_mapping (
1005 settings
, "task-due-today-color",
1007 G_SETTINGS_BIND_DEFAULT
,
1008 calendar_preferences_map_string_to_gdk_color
,
1009 calendar_preferences_map_gdk_color_to_string
,
1010 NULL
, (GDestroyNotify
) NULL
);
1012 settings
, "task-due-today-highlight",
1013 widget
, "sensitive",
1014 G_SETTINGS_BIND_GET
);
1016 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tasks_overdue_highlight");
1018 settings
, "task-overdue-highlight",
1020 G_SETTINGS_BIND_DEFAULT
);
1022 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tasks_overdue_color");
1023 g_settings_bind_with_mapping (
1024 settings
, "task-overdue-color",
1026 G_SETTINGS_BIND_DEFAULT
,
1027 calendar_preferences_map_string_to_gdk_color
,
1028 calendar_preferences_map_gdk_color_to_string
,
1029 NULL
, (GDestroyNotify
) NULL
);
1031 settings
, "task-overdue-highlight",
1032 widget
, "sensitive",
1033 G_SETTINGS_BIND_GET
);
1035 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tasks_hide_completed");
1037 settings
, "hide-completed-tasks",
1039 G_SETTINGS_BIND_DEFAULT
);
1041 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tasks_hide_completed_interval");
1043 settings
, "hide-completed-tasks-value",
1045 G_SETTINGS_BIND_DEFAULT
);
1047 settings
, "hide-completed-tasks",
1048 widget
, "sensitive",
1049 G_SETTINGS_BIND_GET
);
1051 widget
= e_builder_get_widget (prefs
->priv
->builder
, "tasks_hide_completed_units");
1052 g_settings_bind_with_mapping (
1053 settings
, "hide-completed-tasks-units",
1055 G_SETTINGS_BIND_DEFAULT
,
1056 calendar_preferences_map_string_to_integer
,
1057 calendar_preferences_map_integer_to_string
,
1058 g_type_class_ref (E_TYPE_DURATION_TYPE
),
1059 (GDestroyNotify
) g_type_class_unref
);
1061 settings
, "hide-completed-tasks",
1062 widget
, "sensitive",
1063 G_SETTINGS_BIND_GET
);
1065 widget
= e_builder_get_widget (prefs
->priv
->builder
, "to_do_bar_show_no_duedate_tasks");
1067 mail_settings
, "to-do-bar-show-no-duedate-tasks",
1069 G_SETTINGS_BIND_DEFAULT
);
1072 widget
= e_builder_get_widget (prefs
->priv
->builder
, "notify_with_tray");
1074 settings
, "notify-with-tray",
1076 G_SETTINGS_BIND_DEFAULT
);
1078 widget
= e_builder_get_widget (prefs
->priv
->builder
, "notify_window_on_top");
1080 settings
, "notify-window-on-top",
1082 G_SETTINGS_BIND_DEFAULT
);
1084 widget
= e_builder_get_widget (prefs
->priv
->builder
, "task_reminder_for_completed");
1086 settings
, "task-reminder-for-completed",
1088 G_SETTINGS_BIND_DEFAULT
);
1090 widget
= e_builder_get_widget (prefs
->priv
->builder
, "allow-past-reminders");
1092 settings
, "allow-past-reminders",
1094 G_SETTINGS_BIND_DEFAULT
);
1096 widget
= e_builder_get_widget (prefs
->priv
->builder
, "default-snooze-minutes-spin");
1098 settings
, "default-snooze-minutes",
1100 G_SETTINGS_BIND_DEFAULT
);
1102 prefs
->priv
->reminder_calendars_scrolled_window
= e_builder_get_widget (prefs
->priv
->builder
, "reminder-calendars-scrolled-window");
1103 prefs
->priv
->reminder_memos_scrolled_window
= e_builder_get_widget (prefs
->priv
->builder
, "reminder-memos-scrolled-window");
1104 prefs
->priv
->reminder_tasks_scrolled_window
= e_builder_get_widget (prefs
->priv
->builder
, "reminder-tasks-scrolled-window");
1107 widget
= e_builder_get_widget (prefs
->priv
->builder
, "template_url");
1109 settings
, "publish-template",
1111 G_SETTINGS_BIND_DEFAULT
);
1113 /* date/time format */
1114 table
= e_builder_get_widget (prefs
->priv
->builder
, "datetime_format_table");
1115 e_datetime_format_add_setup_widget (table
, 0, "calendar", "table", DTFormatKindDateTime
, _("Ti_me and date:"));
1116 e_datetime_format_add_setup_widget (table
, 1, "calendar", "table", DTFormatKindDate
, _("_Date only:"));
1118 /* Hook up and add the toplevel widget */
1120 target
= e_cal_config_target_new_prefs (ec
);
1121 e_config_set_target ((EConfig
*) ec
, (EConfigTarget
*) target
);
1122 toplevel
= e_config_create_widget ((EConfig
*) ec
);
1123 gtk_box_pack_start (GTK_BOX (prefs
), toplevel
, TRUE
, TRUE
, 0);
1125 show_config (prefs
);
1126 /* FIXME: weakref? */
1127 setup_changes (prefs
);
1129 g_object_unref (mail_settings
);
1130 g_object_unref (settings
);
1134 e_calendar_preferences_type_register (GTypeModule
*type_module
)
1136 /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
1137 * function, so we have to wrap it with a public function in
1138 * order to register types from a separate compilation unit. */
1139 e_calendar_preferences_register_type (type_module
);
1143 e_calendar_preferences_new (EPreferencesWindow
*window
)
1146 ESourceRegistry
*registry
;
1147 ECalendarPreferences
*preferences
;
1149 shell
= e_preferences_window_get_shell (window
);
1151 registry
= e_shell_get_registry (shell
);
1153 g_return_val_if_fail (E_IS_SHELL (shell
), NULL
);
1155 preferences
= g_object_new (E_TYPE_CALENDAR_PREFERENCES
, NULL
);
1157 preferences
->priv
->registry
= g_object_ref (registry
);
1159 /* FIXME Kill this function. */
1160 calendar_preferences_construct (preferences
, shell
);
1162 return GTK_WIDGET (preferences
);