/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the program; if not, see * * * Authors: * Damon Chaplin * Ettore Perazzoli * David Trowbridge * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * */ #ifdef HAVE_CONFIG_H #include #endif #include "e-calendar-preferences.h" #include #include #include "calendar/gui/e-cal-config.h" #include "calendar/gui/e-timezone-entry.h" #include "calendar/gui/calendar-config.h" #include "shell/e-shell-utils.h" /* same is used for Birthdays & Anniversaries calendar */ static const gint default_reminder_units_map[] = { E_DURATION_MINUTES, E_DURATION_HOURS, E_DURATION_DAYS, -1 }; G_DEFINE_DYNAMIC_TYPE ( ECalendarPreferences, e_calendar_preferences, GTK_TYPE_VBOX) static gboolean calendar_preferences_map_string_to_integer (GValue *value, GVariant *variant, gpointer user_data) { GEnumClass *enum_class = G_ENUM_CLASS (user_data); GEnumValue *enum_value; const gchar *nick; /* XXX GSettings should know how to bind enum settings to * integer properties. I filed a bug asking for this: * https://bugzilla.gnome.org/show_bug.cgi?id=695217 */ nick = g_variant_get_string (variant, NULL); enum_value = g_enum_get_value_by_nick (enum_class, nick); g_return_val_if_fail (enum_value != NULL, FALSE); g_value_set_int (value, enum_value->value); return TRUE; } static GVariant * calendar_preferences_map_integer_to_string (const GValue *value, const GVariantType *expected_type, gpointer user_data) { GEnumClass *enum_class = G_ENUM_CLASS (user_data); GEnumValue *enum_value; /* XXX GSettings should know how to bind enum settings to * integer properties. I filed a bug asking for this: * https://bugzilla.gnome.org/show_bug.cgi?id=695217 */ enum_value = g_enum_get_value (enum_class, g_value_get_int (value)); g_return_val_if_fail (enum_value != NULL, NULL); return g_variant_new_string (enum_value->value_nick); } static gboolean calendar_preferences_map_string_to_icaltimezone (GValue *value, GVariant *variant, gpointer user_data) { GSettings *settings; const gchar *location = NULL; icaltimezone *timezone = NULL; settings = g_settings_new ("org.gnome.evolution.calendar"); if (g_settings_get_boolean (settings, "use-system-timezone")) timezone = e_cal_util_get_system_timezone (); else location = g_variant_get_string (variant, NULL); if (location != NULL && *location != '\0') timezone = icaltimezone_get_builtin_timezone (location); if (timezone == NULL) timezone = icaltimezone_get_utc_timezone (); g_value_set_pointer (value, timezone); g_object_unref (settings); return TRUE; } static GVariant * calendar_preferences_map_icaltimezone_to_string (const GValue *value, const GVariantType *expected_type, gpointer user_data) { GVariant *variant; GSettings *settings; const gchar *location = NULL; gchar *location_str = NULL; icaltimezone *timezone; settings = g_settings_new ("org.gnome.evolution.calendar"); if (g_settings_get_boolean (settings, "use-system-timezone")) { location_str = g_settings_get_string (settings, "timezone"); location = location_str; } else { timezone = g_value_get_pointer (value); if (timezone != NULL) location = icaltimezone_get_location (timezone); } if (location == NULL) location = "UTC"; variant = g_variant_new_string (location); g_free (location_str); g_object_unref (settings); return variant; } static gboolean calendar_preferences_map_time_divisions_to_index (GValue *value, GVariant *variant, gpointer user_data) { gboolean success = TRUE; switch (g_variant_get_int32 (variant)) { case 60: g_value_set_int (value, 0); break; case 30: g_value_set_int (value, 1); break; case 15: g_value_set_int (value, 2); break; case 10: g_value_set_int (value, 3); break; case 5: g_value_set_int (value, 4); break; default: success = FALSE; } return success; } static GVariant * calendar_preferences_map_index_to_time_divisions (const GValue *value, const GVariantType *expected_type, gpointer user_data) { switch (g_value_get_int (value)) { case 0: return g_variant_new_int32 (60); case 1: return g_variant_new_int32 (30); case 2: return g_variant_new_int32 (15); case 3: return g_variant_new_int32 (10); case 4: return g_variant_new_int32 (5); default: break; } return NULL; } static gboolean calendar_preferences_map_string_to_gdk_color (GValue *value, GVariant *variant, gpointer user_data) { GdkColor color; const gchar *string; gboolean success = FALSE; string = g_variant_get_string (variant, NULL); if (gdk_color_parse (string, &color)) { g_value_set_boxed (value, &color); success = TRUE; } return success; } static GVariant * calendar_preferences_map_gdk_color_to_string (const GValue *value, const GVariantType *expected_type, gpointer user_data) { GVariant *variant; const GdkColor *color; color = g_value_get_boxed (value); if (color == NULL) { variant = g_variant_new_string (""); } else { gchar *string; string = gdk_color_to_string (color); variant = g_variant_new_string (string); g_free (string); } return variant; } static void calendar_preferences_dispose (GObject *object) { ECalendarPreferences *prefs = (ECalendarPreferences *) object; if (prefs->builder != NULL) { g_object_unref (prefs->builder); prefs->builder = NULL; } if (prefs->registry != NULL) { g_object_unref (prefs->registry); prefs->registry = NULL; } /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (e_calendar_preferences_parent_class)->dispose (object); } static void e_calendar_preferences_class_init (ECalendarPreferencesClass *class) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (class); object_class->dispose = calendar_preferences_dispose; } static void e_calendar_preferences_class_finalize (ECalendarPreferencesClass *class) { } static void e_calendar_preferences_init (ECalendarPreferences *preferences) { } static GtkWidget * calendar_preferences_get_config_widget (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gint position, gpointer data) { ECalendarPreferences *preferences = data; return e_builder_get_widget (preferences->builder, item->label); } static void update_day_second_zone_caption (ECalendarPreferences *prefs) { gchar *location; const gchar *caption; icaltimezone *zone; g_return_if_fail (prefs != NULL); /* Translators: "None" indicates no second time zone set for a day view */ caption = C_("cal-second-zone", "None"); location = calendar_config_get_day_second_zone (); if (location && *location) { zone = icaltimezone_get_builtin_timezone (location); if (zone && icaltimezone_get_display_name (zone)) { caption = icaltimezone_get_display_name (zone); } } g_free (location); gtk_button_set_label (GTK_BUTTON (prefs->day_second_zone), caption); } static void on_set_day_second_zone (GtkWidget *item, ECalendarPreferences *prefs) { if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (item))) return; calendar_config_set_day_second_zone (g_object_get_data (G_OBJECT (item), "timezone")); update_day_second_zone_caption (prefs); } static void on_select_day_second_zone (GtkWidget *item, ECalendarPreferences *prefs) { g_return_if_fail (prefs != NULL); calendar_config_select_day_second_zone (); update_day_second_zone_caption (prefs); } static void day_second_zone_clicked (GtkWidget *widget, ECalendarPreferences *prefs) { GtkWidget *menu, *item; GSList *group = NULL, *recent_zones, *s; gchar *location; icaltimezone *zone, *second_zone = NULL; menu = gtk_menu_new (); location = calendar_config_get_day_second_zone (); if (location && *location) second_zone = icaltimezone_get_builtin_timezone (location); g_free (location); group = NULL; item = gtk_radio_menu_item_new_with_label (group, C_("cal-second-zone", "None")); group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item)); if (!second_zone) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); g_signal_connect ( item, "toggled", G_CALLBACK (on_set_day_second_zone), prefs); recent_zones = calendar_config_get_day_second_zones (); for (s = recent_zones; s != NULL; s = s->next) { zone = icaltimezone_get_builtin_timezone (s->data); if (!zone) continue; item = gtk_radio_menu_item_new_with_label (group, icaltimezone_get_display_name (zone)); group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item)); /* both comes from builtin, thus no problem to compare pointers */ if (zone == second_zone) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); g_object_set_data_full (G_OBJECT (item), "timezone", g_strdup (s->data), g_free); g_signal_connect ( item, "toggled", G_CALLBACK (on_set_day_second_zone), prefs); } calendar_config_free_day_second_zones (recent_zones); item = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); item = gtk_menu_item_new_with_label (_("Select...")); g_signal_connect ( item, "activate", G_CALLBACK (on_select_day_second_zone), prefs); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show_all (menu); gtk_menu_popup ( GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ()); } static void start_of_day_changed (GtkWidget *widget, ECalendarPreferences *prefs) { EDateEdit *start, *end; GSettings *settings; gint start_hour; gint start_minute; gint end_hour; gint end_minute; start = E_DATE_EDIT (prefs->start_of_day); end = E_DATE_EDIT (prefs->end_of_day); e_date_edit_get_time_of_day (start, &start_hour, &start_minute); e_date_edit_get_time_of_day (end, &end_hour, &end_minute); if ((start_hour > end_hour) || (start_hour == end_hour && start_minute > end_minute)) { if (start_hour < 23) e_date_edit_set_time_of_day (end, start_hour + 1, start_minute); else e_date_edit_set_time_of_day (end, 23, 59); return; } settings = g_settings_new ("org.gnome.evolution.calendar"); g_settings_set_int (settings, "day-start-hour", start_hour); g_settings_set_int (settings, "day-start-minute", start_minute); g_object_unref (settings); } static void end_of_day_changed (GtkWidget *widget, ECalendarPreferences *prefs) { EDateEdit *start, *end; GSettings *settings; gint start_hour; gint start_minute; gint end_hour; gint end_minute; start = E_DATE_EDIT (prefs->start_of_day); end = E_DATE_EDIT (prefs->end_of_day); e_date_edit_get_time_of_day (start, &start_hour, &start_minute); e_date_edit_get_time_of_day (end, &end_hour, &end_minute); if ((end_hour < start_hour) || (end_hour == start_hour && end_minute < start_minute)) { if (end_hour < 1) e_date_edit_set_time_of_day (start, 0, 0); else e_date_edit_set_time_of_day (start, end_hour - 1, end_minute); return; } settings = g_settings_new ("org.gnome.evolution.calendar"); g_settings_set_int (settings, "day-end-hour", end_hour); g_settings_set_int (settings, "day-end-minute", end_minute); g_object_unref (settings); } static void update_system_tz_widgets (GtkCheckButton *button, ECalendarPreferences *prefs) { GtkWidget *widget; icaltimezone *zone; const gchar *display_name; gchar *text; widget = e_builder_get_widget (prefs->builder, "system-tz-label"); g_return_if_fail (GTK_IS_LABEL (widget)); zone = e_cal_util_get_system_timezone (); if (zone != NULL) display_name = gettext (icaltimezone_get_display_name (zone)); else display_name = "UTC"; text = g_strdup_printf ("(%s)", display_name); gtk_label_set_text (GTK_LABEL (widget), text); g_free (text); } static void setup_changes (ECalendarPreferences *prefs) { g_signal_connect ( prefs->day_second_zone, "clicked", G_CALLBACK (day_second_zone_clicked), prefs); g_signal_connect ( prefs->start_of_day, "changed", G_CALLBACK (start_of_day_changed), prefs); g_signal_connect ( prefs->end_of_day, "changed", G_CALLBACK (end_of_day_changed), prefs); } static void show_alarms_config (ECalendarPreferences *prefs) { GtkWidget *widget; widget = e_alarm_selector_new (prefs->registry); atk_object_set_name ( gtk_widget_get_accessible (widget), _("Selected Calendars for Alarms")); gtk_container_add (GTK_CONTAINER (prefs->scrolled_window), widget); gtk_widget_show (widget); } /* Shows the current config settings in the dialog. */ static void show_config (ECalendarPreferences *prefs) { GSettings *settings; settings = g_settings_new ("org.gnome.evolution.calendar"); /* Day's second zone */ update_day_second_zone_caption (prefs); /* Start of Day. */ e_date_edit_set_time_of_day ( E_DATE_EDIT (prefs->start_of_day), g_settings_get_int (settings, "day-start-hour"), g_settings_get_int (settings, "day-start-minute")); /* End of Day. */ e_date_edit_set_time_of_day ( E_DATE_EDIT (prefs->end_of_day), g_settings_get_int (settings, "day-end-hour"), g_settings_get_int (settings, "day-end-minute")); /* Alarms list */ show_alarms_config (prefs); g_object_unref (settings); } /* plugin meta-data */ static ECalConfigItem eccp_items[] = { { E_CONFIG_BOOK, (gchar *) "", (gchar *) "toplevel-notebook", calendar_preferences_get_config_widget }, { E_CONFIG_PAGE, (gchar *) "00.general", (gchar *) "general", calendar_preferences_get_config_widget }, { E_CONFIG_SECTION_TABLE, (gchar *) "00.general/00.time", (gchar *) "time", calendar_preferences_get_config_widget }, { E_CONFIG_SECTION_TABLE, (gchar *) "00.general/10.workWeek", (gchar *) "workWeek", calendar_preferences_get_config_widget }, { E_CONFIG_SECTION, (gchar *) "00.general/20.alerts", (gchar *) "alerts", calendar_preferences_get_config_widget }, { E_CONFIG_PAGE, (gchar *) "10.display", (gchar *) "display", calendar_preferences_get_config_widget }, { E_CONFIG_SECTION, (gchar *) "10.display/00.general", (gchar *) "displayGeneral", calendar_preferences_get_config_widget }, { E_CONFIG_SECTION, (gchar *) "10.display/10.taskList", (gchar *) "taskList", calendar_preferences_get_config_widget }, { E_CONFIG_PAGE, (gchar *) "12.tasks", (gchar *) "tasks-vbox", calendar_preferences_get_config_widget }, { E_CONFIG_PAGE, (gchar *) "15.alarms", (gchar *) "alarms", calendar_preferences_get_config_widget }, { E_CONFIG_PAGE, (gchar *) "20.freeBusy", (gchar *) "freebusy", calendar_preferences_get_config_widget }, { E_CONFIG_SECTION, (gchar *) "20.freeBusy/00.defaultServer", (gchar *) "default-freebusy-vbox", calendar_preferences_get_config_widget }, }; static void eccp_free (EConfig *ec, GSList *items, gpointer data) { g_slist_free (items); } static void calendar_preferences_construct (ECalendarPreferences *prefs, EShell *shell) { ECalConfig *ec; ECalConfigTargetPrefs *target; GSettings *settings; GSettings *eds_settings; gboolean locale_supports_12_hour_format; gint i; GtkWidget *toplevel; GtkWidget *widget; GtkWidget *table; GSList *l; settings = g_settings_new ("org.gnome.evolution.calendar"); locale_supports_12_hour_format = calendar_config_locale_supports_12_hour_format (); /* Force 24 hour format for locales which don't support 12 hour format */ if (!locale_supports_12_hour_format) g_settings_set_boolean (settings, "use-24hour-format", TRUE); /* Make sure our custom widget classes are registered with * GType before we load the GtkBuilder definition file. */ g_type_ensure (E_TYPE_DATE_EDIT); g_type_ensure (E_TYPE_TIMEZONE_ENTRY); prefs->builder = gtk_builder_new (); e_load_ui_builder_definition (prefs->builder, "e-calendar-preferences.ui"); /** @HookPoint-ECalConfig: Calendar Preferences Page * @Id: org.gnome.evolution.calendar.prefs * @Class: org.gnome.evolution.calendar.config:1.0 * @Target: ECalConfigTargetPrefs * * The mail calendar preferences page */ ec = e_cal_config_new ("org.gnome.evolution.calendar.prefs"); l = NULL; for (i = 0; i < G_N_ELEMENTS (eccp_items); i++) l = g_slist_prepend (l, &eccp_items[i]); e_config_add_items ((EConfig *) ec, l, eccp_free, prefs); widget = e_builder_get_widget (prefs->builder, "use-system-tz-check"); g_settings_bind ( settings, "use-system-timezone", widget, "active", G_SETTINGS_BIND_DEFAULT); g_signal_connect ( widget, "toggled", G_CALLBACK (update_system_tz_widgets), prefs); update_system_tz_widgets (GTK_CHECK_BUTTON (widget), prefs); widget = e_builder_get_widget (prefs->builder, "timezone"); g_settings_bind_with_mapping ( settings, "timezone", widget, "timezone", G_SETTINGS_BIND_DEFAULT, calendar_preferences_map_string_to_icaltimezone, calendar_preferences_map_icaltimezone_to_string, NULL, (GDestroyNotify) NULL); g_settings_bind ( settings, "use-system-timezone", widget, "sensitive", G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN); /* General tab */ prefs->day_second_zone = e_builder_get_widget (prefs->builder, "day_second_zone"); widget = e_builder_get_widget (prefs->builder, "sun_button"); g_settings_bind ( settings, "work-day-sunday", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "mon_button"); g_settings_bind ( settings, "work-day-monday", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "tue_button"); g_settings_bind ( settings, "work-day-tuesday", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "wed_button"); g_settings_bind ( settings, "work-day-wednesday", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "thu_button"); g_settings_bind ( settings, "work-day-thursday", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "fri_button"); g_settings_bind ( settings, "work-day-friday", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "sat_button"); g_settings_bind ( settings, "work-day-saturday", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "week_start_day"); g_settings_bind ( settings, "week-start-day-name", widget, "active-id", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "start_of_day"); prefs->start_of_day = widget; /* XXX delete this */ if (locale_supports_12_hour_format) g_settings_bind ( settings, "use-24hour-format", widget, "use-24-hour-format", G_SETTINGS_BIND_GET); widget = e_builder_get_widget (prefs->builder, "end_of_day"); prefs->end_of_day = widget; /* XXX delete this */ if (locale_supports_12_hour_format) g_settings_bind ( settings, "use-24hour-format", widget, "use-24-hour-format", G_SETTINGS_BIND_GET); widget = e_builder_get_widget (prefs->builder, "use_12_hour"); gtk_widget_set_sensitive (widget, locale_supports_12_hour_format); g_settings_bind ( settings, "use-24hour-format", widget, "active", G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN); widget = e_builder_get_widget (prefs->builder, "use_24_hour"); gtk_widget_set_sensitive (widget, locale_supports_12_hour_format); g_settings_bind ( settings, "use-24hour-format", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "confirm_delete"); g_settings_bind ( settings, "confirm-delete", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "default_reminder"); g_settings_bind ( settings, "use-default-reminder", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "default_reminder_interval"); g_settings_bind ( settings, "default-reminder-interval", widget, "value", G_SETTINGS_BIND_DEFAULT); g_settings_bind ( settings, "use-default-reminder", widget, "sensitive", G_SETTINGS_BIND_GET); widget = e_builder_get_widget (prefs->builder, "default_reminder_units"); g_settings_bind_with_mapping ( settings, "default-reminder-units", widget, "active", G_SETTINGS_BIND_DEFAULT, calendar_preferences_map_string_to_integer, calendar_preferences_map_integer_to_string, g_type_class_ref (E_TYPE_DURATION_TYPE), (GDestroyNotify) g_type_class_unref); g_settings_bind ( settings, "use-default-reminder", widget, "sensitive", G_SETTINGS_BIND_GET); /* These settings control the "Birthdays & Anniversaries" backend. */ eds_settings = g_settings_new ("org.gnome.evolution-data-server.calendar"); widget = e_builder_get_widget (prefs->builder, "ba_reminder"); g_settings_bind ( eds_settings, "contacts-reminder-enabled", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "ba_reminder_interval"); g_settings_bind ( eds_settings, "contacts-reminder-interval", widget, "value", G_SETTINGS_BIND_DEFAULT); g_settings_bind ( eds_settings, "contacts-reminder-enabled", widget, "sensitive", G_SETTINGS_BIND_GET); widget = e_builder_get_widget (prefs->builder, "ba_reminder_units"); g_settings_bind_with_mapping ( eds_settings, "contacts-reminder-units", widget, "active", G_SETTINGS_BIND_DEFAULT, calendar_preferences_map_string_to_integer, calendar_preferences_map_integer_to_string, g_type_class_ref (E_TYPE_DURATION_TYPE), (GDestroyNotify) g_type_class_unref); g_settings_bind ( eds_settings, "contacts-reminder-enabled", widget, "sensitive", G_SETTINGS_BIND_GET); g_object_unref (eds_settings); /* Display tab */ widget = e_builder_get_widget (prefs->builder, "time_divisions"); g_settings_bind_with_mapping ( settings, "time-divisions", widget, "active", G_SETTINGS_BIND_DEFAULT, calendar_preferences_map_time_divisions_to_index, calendar_preferences_map_index_to_time_divisions, NULL, (GDestroyNotify) NULL); widget = e_builder_get_widget (prefs->builder, "show_end_times"); g_settings_bind ( settings, "show-event-end", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "compress_weekend"); g_settings_bind ( settings, "compress-weekend", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "show_week_numbers"); g_settings_bind ( settings, "show-week-numbers", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "recur_events_italic"); g_settings_bind ( settings, "recur-events-italic", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "month_scroll_by_week"); g_settings_bind ( settings, "month-scroll-by-week", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "tasks_due_today_highlight"); g_settings_bind ( settings, "task-due-today-highlight", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "tasks_due_today_color"); g_settings_bind_with_mapping ( settings, "task-due-today-color", widget, "color", G_SETTINGS_BIND_DEFAULT, calendar_preferences_map_string_to_gdk_color, calendar_preferences_map_gdk_color_to_string, NULL, (GDestroyNotify) NULL); g_settings_bind ( settings, "task-due-today-highlight", widget, "sensitive", G_SETTINGS_BIND_GET); widget = e_builder_get_widget (prefs->builder, "tasks_overdue_highlight"); g_settings_bind ( settings, "task-overdue-highlight", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "tasks_overdue_color"); g_settings_bind_with_mapping ( settings, "task-overdue-color", widget, "color", G_SETTINGS_BIND_DEFAULT, calendar_preferences_map_string_to_gdk_color, calendar_preferences_map_gdk_color_to_string, NULL, (GDestroyNotify) NULL); g_settings_bind ( settings, "task-overdue-highlight", widget, "sensitive", G_SETTINGS_BIND_GET); widget = e_builder_get_widget (prefs->builder, "tasks_hide_completed"); g_settings_bind ( settings, "hide-completed-tasks", widget, "active", G_SETTINGS_BIND_DEFAULT); widget = e_builder_get_widget (prefs->builder, "tasks_hide_completed_interval"); g_settings_bind ( settings, "hide-completed-tasks-value", widget, "value", G_SETTINGS_BIND_DEFAULT); g_settings_bind ( settings, "hide-completed-tasks", widget, "sensitive", G_SETTINGS_BIND_GET); widget = e_builder_get_widget (prefs->builder, "tasks_hide_completed_units"); g_settings_bind_with_mapping ( settings, "hide-completed-tasks-units", widget, "active", G_SETTINGS_BIND_DEFAULT, calendar_preferences_map_string_to_integer, calendar_preferences_map_integer_to_string, g_type_class_ref (E_TYPE_DURATION_TYPE), (GDestroyNotify) g_type_class_unref); g_settings_bind ( settings, "hide-completed-tasks", widget, "sensitive", G_SETTINGS_BIND_GET); /* Alarms tab */ widget = e_builder_get_widget (prefs->builder, "notify_with_tray"); g_settings_bind ( settings, "notify-with-tray", widget, "active", G_SETTINGS_BIND_DEFAULT); prefs->scrolled_window = e_builder_get_widget (prefs->builder, "calendar-source-scrolled-window"); /* Free/Busy tab */ widget = e_builder_get_widget (prefs->builder, "template_url"); g_settings_bind ( settings, "publish-template", widget, "text", G_SETTINGS_BIND_DEFAULT); /* date/time format */ table = e_builder_get_widget (prefs->builder, "datetime_format_table"); e_datetime_format_add_setup_widget (table, 0, "calendar", "table", DTFormatKindDateTime, _("Ti_me and date:")); e_datetime_format_add_setup_widget (table, 1, "calendar", "table", DTFormatKindDate, _("_Date only:")); /* Hook up and add the toplevel widget */ target = e_cal_config_target_new_prefs (ec); e_config_set_target ((EConfig *) ec, (EConfigTarget *) target); toplevel = e_config_create_widget ((EConfig *) ec); gtk_container_add (GTK_CONTAINER (prefs), toplevel); show_config (prefs); /* FIXME: weakref? */ setup_changes (prefs); g_object_unref (settings); } void e_calendar_preferences_type_register (GTypeModule *type_module) { /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration * function, so we have to wrap it with a public function in * order to register types from a separate compilation unit. */ e_calendar_preferences_register_type (type_module); } GtkWidget * e_calendar_preferences_new (EPreferencesWindow *window) { EShell *shell; ESourceRegistry *registry; ECalendarPreferences *preferences; shell = e_preferences_window_get_shell (window); registry = e_shell_get_registry (shell); g_return_val_if_fail (E_IS_SHELL (shell), NULL); preferences = g_object_new (E_TYPE_CALENDAR_PREFERENCES, NULL); preferences->registry = g_object_ref (registry); /* FIXME Kill this function. */ calendar_preferences_construct (preferences, shell); return GTK_WIDGET (preferences); }