aboutsummaryrefslogtreecommitdiffstats
path: root/calendar
diff options
context:
space:
mode:
Diffstat (limited to 'calendar')
-rw-r--r--calendar/ChangeLog1
-rw-r--r--calendar/gui/calendar-config-keys.h1
-rw-r--r--calendar/gui/calendar-config.c113
-rw-r--r--calendar/gui/calendar-config.h4
-rw-r--r--calendar/gui/dialogs/cal-prefs-dialog.c35
-rw-r--r--calendar/gui/dialogs/cal-prefs-dialog.glade30
-rw-r--r--calendar/gui/dialogs/cal-prefs-dialog.h1
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;