diff options
Diffstat (limited to 'calendar')
-rw-r--r-- | calendar/ChangeLog | 1 | ||||
-rw-r--r-- | calendar/gui/calendar-config-keys.h | 1 | ||||
-rw-r--r-- | calendar/gui/calendar-config.c | 113 | ||||
-rw-r--r-- | calendar/gui/calendar-config.h | 4 | ||||
-rw-r--r-- | calendar/gui/dialogs/cal-prefs-dialog.c | 35 | ||||
-rw-r--r-- | calendar/gui/dialogs/cal-prefs-dialog.glade | 30 | ||||
-rw-r--r-- | calendar/gui/dialogs/cal-prefs-dialog.h | 1 |
7 files changed, 175 insertions, 10 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 973136dba8..49f7b11489 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -38,7 +38,6 @@ (alarm_to_malarm_widgets); (populate_widgets_from_alarm): Handle mail alarm. ->>>>>>> 1.3068 2006-06-30 Johnny Jacob <jjohnny@novell.com> * gui/cal-search-bar.c: (get_current_category), (get_category_sexp), (notify_e_cal_view_contains), diff --git a/calendar/gui/calendar-config-keys.h b/calendar/gui/calendar-config-keys.h index e1f8a49470..80a1eca606 100644 --- a/calendar/gui/calendar-config-keys.h +++ b/calendar/gui/calendar-config-keys.h @@ -29,6 +29,7 @@ G_BEGIN_DECLS /* Display settings */ #define CALENDAR_CONFIG_TIMEZONE CALENDAR_CONFIG_PREFIX "/display/timezone" +#define CALENDAR_CONFIG_DAYLIGHT_SAVING CALENDAR_CONFIG_PREFIX "/display/use_daylight_saving" #define CALENDAR_CONFIG_SELECTED_CALENDARS CALENDAR_CONFIG_PREFIX "/display/selected_calendars" #define CALENDAR_CONFIG_PRIMARY_CALENDAR CALENDAR_CONFIG_PREFIX "/display/primary_calendar" #define CALENDAR_CONFIG_24HOUR CALENDAR_CONFIG_PREFIX "/display/use_24hour_format" diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c index b93e589194..2377f237ed 100644 --- a/calendar/gui/calendar-config.c +++ b/calendar/gui/calendar-config.c @@ -44,6 +44,9 @@ static GConfClient *config = NULL; +/* Store the zones here, this is not destroyed as the ical timezones */ +static GHashTable *custom_zones = NULL; + static void on_timezone_set (GnomeDialog *dialog, int button, ETimezoneDialog *etd); @@ -187,6 +190,27 @@ calendar_config_get_timezone (void) return gconf_client_get_string (config, CALENDAR_CONFIG_TIMEZONE, NULL); } +static void +set_standard_offsets (icalcomponent *zone_comp, int offset) +{ + icalcomponent *dl_comp, *s_comp; + icalproperty *offset_from, *offset_to; + + /* Set the offset of the standard component to all the daylight components also */ + for (dl_comp = icalcomponent_get_first_component (zone_comp, ICAL_XDAYLIGHT_COMPONENT); dl_comp != NULL; + dl_comp = icalcomponent_get_next_component (zone_comp, ICAL_XDAYLIGHT_COMPONENT)) { + offset_to = icalcomponent_get_first_property (dl_comp, ICAL_TZOFFSETTO_PROPERTY); + icalproperty_set_tzoffsetto (offset_to, offset); + } + + /* Set the tzto offset of the standard component to tzfrom */ + for (s_comp = icalcomponent_get_first_component (zone_comp, ICAL_XSTANDARD_COMPONENT); s_comp != NULL; + s_comp = icalcomponent_get_next_component (zone_comp, ICAL_XSTANDARD_COMPONENT)) { + offset_from = icalcomponent_get_first_property (s_comp, ICAL_TZOFFSETFROM_PROPERTY); + icalproperty_set_tzoffsetfrom (offset_from, offset); + } +} + icaltimezone * calendar_config_get_icaltimezone (void) { @@ -197,12 +221,66 @@ calendar_config_get_icaltimezone (void) location = calendar_config_get_timezone (); if (location) { + icalcomponent *icalcomp, *dl_comp; + zone = icaltimezone_get_builtin_timezone (location); + icalcomp = icaltimezone_get_component (zone); + + + if (!(dl_comp = icalcomponent_get_first_component (icalcomp, ICAL_XDAYLIGHT_COMPONENT))) { + return zone; + } + + if (!calendar_config_get_daylight_saving () && zone) { + icalcomponent *zone_comp, *s_comp; + icalproperty *tz_prop, *offset_to; + icaltimezone *st_zone = NULL; + int offset; + char *n_tzid, *tzid; + + tzid = icaltimezone_get_tzid (zone); + n_tzid = g_strconcat (tzid, "-(Standard)", NULL); + + if (!custom_zones) { + custom_zones = g_hash_table_new (g_str_hash, g_str_equal); + } else if ((st_zone = g_hash_table_lookup (custom_zones, n_tzid))) { + g_free (n_tzid); + + return st_zone; + } + + zone_comp = icalcomponent_new_clone (icalcomp); + s_comp = icalcomponent_get_first_component (zone_comp, ICAL_XSTANDARD_COMPONENT); + + if (!s_comp) { + g_free (n_tzid); + icalcomponent_free (zone_comp); + + return zone; + } + + offset_to = icalcomponent_get_first_property (s_comp, ICAL_TZOFFSETTO_PROPERTY); + offset = icalproperty_get_tzoffsetto (offset_to); + + set_standard_offsets (zone_comp, offset); + + tz_prop = icalcomponent_get_first_property (zone_comp, ICAL_TZID_PROPERTY); + if (tz_prop) { + icalcomponent_remove_property (zone_comp, tz_prop); + } + + tz_prop = icalproperty_new_tzid (n_tzid); + icalcomponent_add_property (zone_comp, tz_prop); + + st_zone = icaltimezone_new (); + icaltimezone_set_component (st_zone, zone_comp); + + zone = st_zone; + g_hash_table_insert (custom_zones, n_tzid, zone); + } + g_free (location); } - if (!zone) - zone = icaltimezone_get_utc_timezone (); - return zone; } @@ -232,6 +310,35 @@ calendar_config_add_notification_timezone (GConfClientNotifyFunc func, gpointer return id; } +gboolean +calendar_config_get_daylight_saving (void) +{ + calendar_config_init (); + + return gconf_client_get_bool (config, CALENDAR_CONFIG_DAYLIGHT_SAVING, NULL); + +} + +void +calendar_config_set_daylight_saving (gboolean daylight_saving) +{ + calendar_config_init (); + + gconf_client_set_bool (config, CALENDAR_CONFIG_DAYLIGHT_SAVING, daylight_saving, NULL); +} + +guint +calendar_config_add_notification_daylight_saving (GConfClientNotifyFunc func, gpointer data) +{ + guint id; + + calendar_config_init (); + + id = gconf_client_notify_add (config, CALENDAR_CONFIG_DAYLIGHT_SAVING, func, data, NULL, NULL); + + return id; +} + /* Whether we use 24-hour format or 12-hour format (AM/PM). */ gboolean calendar_config_get_24_hour_format (void) diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h index 4fd1fa4bd4..d4f6f9d52b 100644 --- a/calendar/gui/calendar-config.h +++ b/calendar/gui/calendar-config.h @@ -255,4 +255,8 @@ gboolean calendar_config_locale_supports_12_hour_format(void); void calendar_config_set_dir_path (const char *); char * calendar_config_get_dir_path (void); +gboolean calendar_config_get_daylight_saving (void); +void calendar_config_set_daylight_saving (gboolean daylight_saving); +guint calendar_config_add_notification_daylight_saving (GConfClientNotifyFunc func, gpointer data); + #endif /* _CALENDAR_CONFIG_H_ */ diff --git a/calendar/gui/dialogs/cal-prefs-dialog.c b/calendar/gui/dialogs/cal-prefs-dialog.c index c88f14c85d..6e1aa165d3 100644 --- a/calendar/gui/dialogs/cal-prefs-dialog.c +++ b/calendar/gui/dialogs/cal-prefs-dialog.c @@ -130,12 +130,28 @@ static void timezone_changed (GtkWidget *widget, CalendarPrefsDialog *prefs) { icaltimezone *zone; + icalcomponent *icalcomp, *dl_comp; zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (prefs->timezone)); + icalcomp = icaltimezone_get_component (zone); + + if (!(dl_comp = icalcomponent_get_first_component (icalcomp, ICAL_XDAYLIGHT_COMPONENT))) + gtk_widget_set_sensitive ((GtkWidget *) prefs->daylight_saving, FALSE); + else + gtk_widget_set_sensitive ((GtkWidget *) prefs->daylight_saving, TRUE); + calendar_config_set_timezone (icaltimezone_get_location (zone)); } static void +daylight_saving_changed (GtkWidget *widget, CalendarPrefsDialog *prefs) +{ + gboolean set = gtk_toggle_button_get_active ((GtkToggleButton *) prefs->daylight_saving); + calendar_config_set_daylight_saving (set); + timezone_changed (widget, prefs); +} + +static void start_of_day_changed (GtkWidget *widget, CalendarPrefsDialog *prefs) { int start_hour, start_minute, end_hour, end_minute; @@ -351,6 +367,7 @@ setup_changes (CalendarPrefsDialog *prefs) g_signal_connect (G_OBJECT (prefs->working_days[i]), "toggled", G_CALLBACK (working_days_changed), prefs); g_signal_connect (G_OBJECT (prefs->timezone), "changed", G_CALLBACK (timezone_changed), prefs); + g_signal_connect (G_OBJECT (prefs->daylight_saving), "toggled", G_CALLBACK (daylight_saving_changed), prefs); g_signal_connect (G_OBJECT (prefs->start_of_day), "changed", G_CALLBACK (start_of_day_changed), prefs); g_signal_connect (G_OBJECT (prefs->end_of_day), "changed", G_CALLBACK (end_of_day_changed), prefs); @@ -479,12 +496,25 @@ show_config (CalendarPrefsDialog *prefs) CalWeekdays working_days; gint mask, day, week_start_day, time_divisions; icaltimezone *zone; - gboolean sensitive; + gboolean sensitive, set = FALSE; + icalcomponent *icalcomp, *dl_comp; + char *location; /* Timezone. */ - zone = calendar_config_get_icaltimezone (); + location = calendar_config_get_timezone (); + zone = icaltimezone_get_builtin_timezone (location); e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (prefs->timezone), zone); + g_free (location); + icalcomp = icaltimezone_get_component (zone); + if (!(dl_comp = icalcomponent_get_first_component (icalcomp, ICAL_XDAYLIGHT_COMPONENT))) + gtk_widget_set_sensitive ((GtkWidget *) prefs->daylight_saving, FALSE); + else + gtk_widget_set_sensitive ((GtkWidget *) prefs->daylight_saving, TRUE); + + set = calendar_config_get_daylight_saving (); + gtk_toggle_button_set_active ((GtkToggleButton *) prefs->daylight_saving, set); + /* Working Days. */ working_days = calendar_config_get_working_days (); mask = 1 << 0; @@ -609,6 +639,7 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs) /* General tab */ prefs->timezone = glade_xml_get_widget (gui, "timezone"); + prefs->daylight_saving = glade_xml_get_widget (gui, "daylight_cb"); for (i = 0; i < 7; i++) prefs->working_days[i] = glade_xml_get_widget (gui, working_day_names[i]); prefs->week_start_day = glade_xml_get_widget (gui, "week_start_day"); diff --git a/calendar/gui/dialogs/cal-prefs-dialog.glade b/calendar/gui/dialogs/cal-prefs-dialog.glade index 4d3d33b5e0..92ca58e1c6 100644 --- a/calendar/gui/dialogs/cal-prefs-dialog.glade +++ b/calendar/gui/dialogs/cal-prefs-dialog.glade @@ -96,7 +96,7 @@ <child> <widget class="GtkTable" id="time"> <property name="visible">True</property> - <property name="n_rows">2</property> + <property name="n_rows">3</property> <property name="n_columns">2</property> <property name="homogeneous">False</property> <property name="row_spacing">6</property> @@ -151,8 +151,8 @@ <packing> <property name="left_attach">0</property> <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">fill</property> <property name="y_options"></property> </packing> @@ -226,10 +226,32 @@ <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="daylight_cb"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Adjust for daylight sa_ving time</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">fill</property> - <property name="y_options">fill</property> + <property name="y_options"></property> </packing> </child> </widget> diff --git a/calendar/gui/dialogs/cal-prefs-dialog.h b/calendar/gui/dialogs/cal-prefs-dialog.h index 3575e9baca..4bf2c32790 100644 --- a/calendar/gui/dialogs/cal-prefs-dialog.h +++ b/calendar/gui/dialogs/cal-prefs-dialog.h @@ -45,6 +45,7 @@ struct _CalendarPrefsDialog { /* General tab */ GtkWidget *timezone; + GtkWidget *daylight_saving; GtkWidget *working_days[7]; GtkWidget *week_start_day; GtkWidget *start_of_day; |