diff options
Diffstat (limited to 'modules/calendar/e-cal-shell-settings.c')
-rw-r--r-- | modules/calendar/e-cal-shell-settings.c | 638 |
1 files changed, 636 insertions, 2 deletions
diff --git a/modules/calendar/e-cal-shell-settings.c b/modules/calendar/e-cal-shell-settings.c index 39581a5181..dbb11ff0f9 100644 --- a/modules/calendar/e-cal-shell-settings.c +++ b/modules/calendar/e-cal-shell-settings.c @@ -22,6 +22,452 @@ #include "e-cal-shell-settings.h" #include <gconf/gconf-client.h> +#include <libecal/e-cal-util.h> + +static gboolean +transform_string_to_icaltimezone (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gboolean use_system_timezone; + const gchar *location = NULL; + icaltimezone *timezone = NULL; + + shell_settings = E_SHELL_SETTINGS (user_data); + + use_system_timezone = e_shell_settings_get_boolean ( + shell_settings, "cal-use-system-timezone"); + + if (use_system_timezone) + timezone = e_cal_util_get_system_timezone (); + else + location = g_value_get_string (src_value); + + if (location != NULL && *location != '\0') + timezone = icaltimezone_get_builtin_timezone (location); + + if (timezone == NULL) + timezone = icaltimezone_get_utc_timezone (); + + g_value_set_pointer (dst_value, timezone); + + return TRUE; +} + +static gboolean +transform_icaltimezone_to_string (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + const gchar *location = NULL; + icaltimezone *timezone; + + timezone = g_value_get_pointer (src_value); + + if (timezone != NULL) + location = icaltimezone_get_location (timezone); + + if (location == NULL) + location = "UTC"; + + g_value_set_string (dst_value, location); + + return TRUE; +} + +static gboolean +transform_weekdays_gconf_to_evolution (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + GDateWeekday weekday; + + /* XXX At some point, Evolution changed its weekday numbering + * from 0 = Sunday to 0 = Monday, but did not migrate the + * "week_start_day" key. Both enumerations are of course + * different from GDateWeekday. We should have saved the + * weekday as a string instead. */ + + /* This is purposefully verbose for better readability. */ + + /* GConf numbering */ + switch (g_value_get_int (src_value)) { + case 0: + weekday = G_DATE_SUNDAY; + break; + case 1: + weekday = G_DATE_MONDAY; + break; + case 2: + weekday = G_DATE_TUESDAY; + break; + case 3: + weekday = G_DATE_WEDNESDAY; + break; + case 4: + weekday = G_DATE_THURSDAY; + break; + case 5: + weekday = G_DATE_FRIDAY; + break; + case 6: + weekday = G_DATE_SATURDAY; + break; + default: + return FALSE; + } + + /* Evolution numbering */ + switch (weekday) { + case G_DATE_MONDAY: + g_value_set_int (dst_value, 0); + break; + case G_DATE_TUESDAY: + g_value_set_int (dst_value, 1); + break; + case G_DATE_WEDNESDAY: + g_value_set_int (dst_value, 2); + break; + case G_DATE_THURSDAY: + g_value_set_int (dst_value, 3); + break; + case G_DATE_FRIDAY: + g_value_set_int (dst_value, 4); + break; + case G_DATE_SATURDAY: + g_value_set_int (dst_value, 5); + break; + case G_DATE_SUNDAY: + g_value_set_int (dst_value, 6); + break; + default: + return FALSE; + } + + return TRUE; +} + +static gboolean +transform_weekdays_evolution_to_gconf (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + GDateWeekday weekday; + + /* XXX At some point, Evolution changed its weekday numbering + * from 0 = Sunday to 0 = Monday, but did not migrate the + * "week_start_day" key. Both enumerations are of course + * different from GDateWeekday. We should have saved the + * weekday as a string instead. */ + + /* This is purposefully verbose for better readability. */ + + /* GConf numbering */ + switch (g_value_get_int (src_value)) { + case 0: + weekday = G_DATE_MONDAY; + break; + case 1: + weekday = G_DATE_TUESDAY; + break; + case 2: + weekday = G_DATE_WEDNESDAY; + break; + case 3: + weekday = G_DATE_THURSDAY; + break; + case 4: + weekday = G_DATE_FRIDAY; + break; + case 5: + weekday = G_DATE_SATURDAY; + break; + case 6: + weekday = G_DATE_SUNDAY; + break; + default: + return FALSE; + } + + /* Evolution numbering */ + switch (weekday) { + case G_DATE_MONDAY: + g_value_set_int (dst_value, 1); + break; + case G_DATE_TUESDAY: + g_value_set_int (dst_value, 2); + break; + case G_DATE_WEDNESDAY: + g_value_set_int (dst_value, 3); + break; + case G_DATE_THURSDAY: + g_value_set_int (dst_value, 4); + break; + case G_DATE_FRIDAY: + g_value_set_int (dst_value, 5); + break; + case G_DATE_SATURDAY: + g_value_set_int (dst_value, 6); + break; + case G_DATE_SUNDAY: + g_value_set_int (dst_value, 0); + break; + default: + return FALSE; + } + + return TRUE; +} + +/* Working day flags */ +enum { + WORKING_DAY_SUNDAY = 1 << 0, + WORKING_DAY_MONDAY = 1 << 1, + WORKING_DAY_TUESDAY = 1 << 2, + WORKING_DAY_WEDNESDAY = 1 << 3, + WORKING_DAY_THURSDAY = 1 << 4, + WORKING_DAY_FRIDAY = 1 << 5, + WORKING_DAY_SATURDAY = 1 << 6 +}; + +static gboolean +transform_working_days_bitset_to_sunday (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + gint bitset; + gboolean working_day; + + bitset = g_value_get_int (src_value); + working_day = ((bitset & WORKING_DAY_SUNDAY) != 0); + g_value_set_boolean (dst_value, working_day); + + return TRUE; +} + +static gboolean +transform_working_days_sunday_to_bitset (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gint bitset, bit; + + shell_settings = E_SHELL_SETTINGS (user_data); + + bitset = e_shell_settings_get_int ( + shell_settings, "cal-working-days-bitset"); + + bit = g_value_get_boolean (src_value) ? WORKING_DAY_SUNDAY : 0; + g_value_set_int (dst_value, (bitset & ~WORKING_DAY_SUNDAY) | bit); + + return TRUE; +} + +static gboolean +transform_working_days_bitset_to_monday (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + gint bitset; + gboolean working_day; + + bitset = g_value_get_int (src_value); + working_day = ((bitset & WORKING_DAY_MONDAY) != 0); + g_value_set_boolean (dst_value, working_day); + + return TRUE; +} + +static gboolean +transform_working_days_monday_to_bitset (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gint bitset, bit; + + shell_settings = E_SHELL_SETTINGS (user_data); + + bitset = e_shell_settings_get_int ( + shell_settings, "cal-working-days-bitset"); + + bit = g_value_get_boolean (src_value) ? WORKING_DAY_MONDAY : 0; + g_value_set_int (dst_value, (bitset & ~WORKING_DAY_MONDAY) | bit); + + return TRUE; +} + +static gboolean +transform_working_days_bitset_to_tuesday (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + gint bitset; + gboolean working_day; + + bitset = g_value_get_int (src_value); + working_day = ((bitset & WORKING_DAY_TUESDAY) != 0); + g_value_set_boolean (dst_value, working_day); + + return TRUE; +} + +static gboolean +transform_working_days_tuesday_to_bitset (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gint bitset, bit; + + shell_settings = E_SHELL_SETTINGS (user_data); + + bitset = e_shell_settings_get_int ( + shell_settings, "cal-working-days-bitset"); + + bit = g_value_get_boolean (src_value) ? WORKING_DAY_TUESDAY : 0; + g_value_set_int (dst_value, (bitset & ~WORKING_DAY_TUESDAY) | bit); + + return TRUE; +} + +static gboolean +transform_working_days_bitset_to_wednesday (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + gint bitset; + gboolean working_day; + + bitset = g_value_get_int (src_value); + working_day = ((bitset & WORKING_DAY_WEDNESDAY) != 0); + g_value_set_boolean (dst_value, working_day); + + return TRUE; +} + +static gboolean +transform_working_days_wednesday_to_bitset (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gint bitset, bit; + + shell_settings = E_SHELL_SETTINGS (user_data); + + bitset = e_shell_settings_get_int ( + shell_settings, "cal-working-days-bitset"); + + bit = g_value_get_boolean (src_value) ? WORKING_DAY_WEDNESDAY : 0; + g_value_set_int (dst_value, (bitset & ~WORKING_DAY_WEDNESDAY) | bit); + + return TRUE; +} + +static gboolean +transform_working_days_bitset_to_thursday (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + gint bitset; + gboolean working_day; + + bitset = g_value_get_int (src_value); + working_day = ((bitset & WORKING_DAY_THURSDAY) != 0); + g_value_set_boolean (dst_value, working_day); + + return TRUE; +} + +static gboolean +transform_working_days_thursday_to_bitset (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gint bitset, bit; + + shell_settings = E_SHELL_SETTINGS (user_data); + + bitset = e_shell_settings_get_int ( + shell_settings, "cal-working-days-bitset"); + + bit = g_value_get_boolean (src_value) ? WORKING_DAY_THURSDAY : 0; + g_value_set_int (dst_value, (bitset & ~WORKING_DAY_THURSDAY) | bit); + + return TRUE; +} + +static gboolean +transform_working_days_bitset_to_friday (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + gint bitset; + gboolean working_day; + + bitset = g_value_get_int (src_value); + working_day = ((bitset & WORKING_DAY_FRIDAY) != 0); + g_value_set_boolean (dst_value, working_day); + + return TRUE; +} + +static gboolean +transform_working_days_friday_to_bitset (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gint bitset, bit; + + shell_settings = E_SHELL_SETTINGS (user_data); + + bitset = e_shell_settings_get_int ( + shell_settings, "cal-working-days-bitset"); + + bit = g_value_get_boolean (src_value) ? WORKING_DAY_FRIDAY : 0; + g_value_set_int (dst_value, (bitset & ~WORKING_DAY_FRIDAY) | bit); + + return TRUE; +} + +static gboolean +transform_working_days_bitset_to_saturday (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + gint bitset; + gboolean working_day; + + bitset = g_value_get_int (src_value); + working_day = ((bitset & WORKING_DAY_SATURDAY) != 0); + g_value_set_boolean (dst_value, working_day); + + return TRUE; +} + +static gboolean +transform_working_days_saturday_to_bitset (const GValue *src_value, + GValue *dst_value, + gpointer user_data) +{ + EShellSettings *shell_settings; + gint bitset, bit; + + shell_settings = E_SHELL_SETTINGS (user_data); + + bitset = e_shell_settings_get_int ( + shell_settings, "cal-working-days-bitset"); + + bit = g_value_get_boolean (src_value) ? WORKING_DAY_SATURDAY : 0; + g_value_set_int (dst_value, (bitset & ~WORKING_DAY_SATURDAY) | bit); + + return TRUE; +} void e_cal_shell_backend_init_settings (EShell *shell) @@ -35,6 +481,34 @@ e_cal_shell_backend_init_settings (EShell *shell) "/apps/evolution/calendar/display/compress_weekend"); e_shell_settings_install_property_for_key ( + "cal-confirm-delete", + "/apps/evolution/calendar/prompts/confirm_delete"); + + e_shell_settings_install_property_for_key ( + "cal-confirm-purge", + "/apps/evolution/calendar/prompts/confirm_purge"); + + e_shell_settings_install_property_for_key ( + "cal-date-navigator-show-week-numbers", + "/apps/evolution/calendar/date_navigator/show_week_numbers"); + + e_shell_settings_install_property_for_key ( + "cal-day-view-show-week-numbers", + "/apps/evolution/calendar/display/day_view_show_week_number"); + + e_shell_settings_install_property_for_key ( + "cal-hide-completed-tasks", + "/apps/evolution/calendar/tasks/hide_completed"); + + e_shell_settings_install_property_for_key ( + "cal-hide-completed-tasks-units", + "/apps/evolution/calendar/tasks/hide_completed_units"); + + e_shell_settings_install_property_for_key ( + "cal-hide-completed-tasks-value", + "/apps/evolution/calendar/tasks/hide_completed_value"); + + e_shell_settings_install_property_for_key ( "cal-marcus-bains-day-view-color", "/apps/evolution/calendar/display/marcus_bains_color_dayview"); @@ -55,9 +529,22 @@ e_cal_shell_backend_init_settings (EShell *shell) "/apps/evolution/calendar/display/show_event_end"); e_shell_settings_install_property_for_key ( + "cal-tasks-color-due-today", + "/apps/evolution/calendar/tasks/colors/due_today"); + + e_shell_settings_install_property_for_key ( + "cal-tasks-color-overdue", + "/apps/evolution/calendar/tasks/colors/overdue"); + + e_shell_settings_install_property_for_key ( "cal-time-divisions", "/apps/evolution/calendar/display/time_divisions"); + /* Do not bind to this. Use "cal-timezone" instead. */ + e_shell_settings_install_property_for_key ( + "cal-timezone-string", + "/apps/evolution/calendar/display/timezone"); + e_shell_settings_install_property_for_key ( "cal-use-24-hour-format", "/apps/evolution/calendar/display/use_24hour_format"); @@ -66,8 +553,9 @@ e_cal_shell_backend_init_settings (EShell *shell) "cal-use-system-timezone", "/apps/evolution/calendar/display/use_system_timezone"); + /* Do not bind to this. Use "cal-week-start-day" instead. */ e_shell_settings_install_property_for_key ( - "cal-week-start-day", + "cal-week-start-day-gconf", "/apps/evolution/calendar/display/week_start_day"); e_shell_settings_install_property_for_key ( @@ -87,6 +575,152 @@ e_cal_shell_backend_init_settings (EShell *shell) "/apps/evolution/calendar/display/day_start_minute"); e_shell_settings_install_property_for_key ( - "cal-working-days", + "cal-working-days-bitset", "/apps/evolution/calendar/display/working_days"); + + /* These properties use transform functions to convert + * GConf values to forms more useful to Evolution. We + * have to use separate properties because GConfBridge + * does not support transform functions. Much of this + * is backward-compatibility cruft for poorly designed + * GConf schemas. */ + + e_shell_settings_install_property ( + g_param_spec_pointer ( + "cal-timezone", + NULL, + NULL, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-timezone-string", + G_OBJECT (shell_settings), "cal-timezone", + transform_string_to_icaltimezone, + transform_icaltimezone_to_string, + (GDestroyNotify) NULL, shell_settings); + + e_shell_settings_install_property ( + g_param_spec_int ( + "cal-week-start-day", + NULL, + NULL, + 0, /* Monday */ + 6, /* Sunday */ + 0, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-week-start-day-gconf", + G_OBJECT (shell_settings), "cal-week-start-day", + transform_weekdays_gconf_to_evolution, + transform_weekdays_evolution_to_gconf, + (GDestroyNotify) NULL, NULL); + + /* XXX These are my favorite. Storing a bit array in GConf + * instead of separate boolean keys. Brilliant move. */ + + e_shell_settings_install_property ( + g_param_spec_boolean ( + "cal-working-days-sunday", + NULL, + NULL, + FALSE, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-working-days-bitset", + G_OBJECT (shell_settings), "cal-working-days-sunday", + transform_working_days_bitset_to_sunday, + transform_working_days_sunday_to_bitset, + (GDestroyNotify) NULL, shell_settings); + + e_shell_settings_install_property ( + g_param_spec_boolean ( + "cal-working-days-monday", + NULL, + NULL, + TRUE, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-working-days-bitset", + G_OBJECT (shell_settings), "cal-working-days-monday", + transform_working_days_bitset_to_monday, + transform_working_days_monday_to_bitset, + (GDestroyNotify) NULL, shell_settings); + + e_shell_settings_install_property ( + g_param_spec_boolean ( + "cal-working-days-tuesday", + NULL, + NULL, + TRUE, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-working-days-bitset", + G_OBJECT (shell_settings), "cal-working-days-tuesday", + transform_working_days_bitset_to_tuesday, + transform_working_days_tuesday_to_bitset, + (GDestroyNotify) NULL, shell_settings); + + e_shell_settings_install_property ( + g_param_spec_boolean ( + "cal-working-days-wednesday", + NULL, + NULL, + TRUE, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-working-days-bitset", + G_OBJECT (shell_settings), "cal-working-days-wednesday", + transform_working_days_bitset_to_wednesday, + transform_working_days_wednesday_to_bitset, + (GDestroyNotify) NULL, shell_settings); + + e_shell_settings_install_property ( + g_param_spec_boolean ( + "cal-working-days-thursday", + NULL, + NULL, + TRUE, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-working-days-bitset", + G_OBJECT (shell_settings), "cal-working-days-thursday", + transform_working_days_bitset_to_thursday, + transform_working_days_thursday_to_bitset, + (GDestroyNotify) NULL, shell_settings); + + e_shell_settings_install_property ( + g_param_spec_boolean ( + "cal-working-days-friday", + NULL, + NULL, + TRUE, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-working-days-bitset", + G_OBJECT (shell_settings), "cal-working-days-friday", + transform_working_days_bitset_to_friday, + transform_working_days_friday_to_bitset, + (GDestroyNotify) NULL, shell_settings); + + e_shell_settings_install_property ( + g_param_spec_boolean ( + "cal-working-days-saturday", + NULL, + NULL, + FALSE, + G_PARAM_READWRITE)); + + e_mutual_binding_new_full ( + G_OBJECT (shell_settings), "cal-working-days-bitset", + G_OBJECT (shell_settings), "cal-working-days-saturday", + transform_working_days_bitset_to_saturday, + transform_working_days_saturday_to_bitset, + (GDestroyNotify) NULL, shell_settings); } |