aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/calendar-component.c84
-rw-r--r--calendar/gui/calendar-config-keys.h2
-rw-r--r--calendar/gui/calendar-config.c50
-rw-r--r--calendar/gui/calendar-config.h10
-rw-r--r--calendar/gui/tasks-component.c90
5 files changed, 200 insertions, 36 deletions
diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c
index 6305cda984..97e6b2654b 100644
--- a/calendar/gui/calendar-component.c
+++ b/calendar/gui/calendar-component.c
@@ -117,6 +117,26 @@ is_in_uids (GSList *uids, ESource *source)
return FALSE;
}
+static ESource *
+find_first_source (ESourceList *source_list)
+{
+ GSList *groups, *sources, *l, *m;
+
+ groups = e_source_list_peek_groups (source_list);
+ for (l = groups; l; l = l->next) {
+ ESourceGroup *group = l->data;
+
+ sources = e_source_group_peek_sources (group);
+ for (m = sources; m; m = m->next) {
+ ESource *source = m->data;
+
+ return source;
+ }
+ }
+
+ return NULL;
+}
+
static void
update_uris_for_selection (CalendarComponent *calendar_component)
{
@@ -150,6 +170,28 @@ update_uris_for_selection (CalendarComponent *calendar_component)
}
static void
+update_uri_for_primary_selection (CalendarComponent *calendar_component)
+{
+ CalendarComponentPrivate *priv;
+ ESource *source;
+ char *uri;
+
+ priv = calendar_component->priv;
+
+ source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->source_selector));
+ if (!source)
+ return;
+
+ /* Set the default */
+ uri = e_source_get_uri (source);
+ gnome_calendar_set_default_uri (priv->calendar, uri);
+ g_free (uri);
+
+ /* Save the selection for next time we start up */
+ calendar_config_set_primary_calendar (e_source_peek_uid (source));
+}
+
+static void
update_selection (CalendarComponent *calendar_component)
{
CalendarComponentPrivate *priv;
@@ -186,6 +228,31 @@ update_selection (CalendarComponent *calendar_component)
g_slist_free (uids_selected);
}
+static void
+update_primary_selection (CalendarComponent *calendar_component)
+{
+ CalendarComponentPrivate *priv;
+ ESource *source;
+ char *uid;
+
+ priv = calendar_component->priv;
+
+ uid = calendar_config_get_primary_calendar ();
+ if (uid) {
+ source = e_source_list_peek_source_by_uid (priv->source_list, uid);
+ g_free (uid);
+
+ e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (priv->source_selector), source);
+ } else {
+ ESource *source;
+
+ /* Try to create a default if there isn't one */
+ source = find_first_source (priv->source_list);
+ if (source)
+ e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (priv->source_selector), source);
+ }
+}
+
/* FIXME This is duplicated from comp-editor-factory.c, should it go in comp-util? */
static ECalComponent *
get_default_event (ECal *client, gboolean all_day)
@@ -354,21 +421,7 @@ static void
primary_source_selection_changed_cb (ESourceSelector *selector,
CalendarComponent *calendar_component)
{
- CalendarComponentPrivate *priv;
- ESource *source;
- char *uri;
-
- priv = calendar_component->priv;
-
- source = e_source_selector_peek_primary_selection (selector);
- if (!source)
- return;
-
- /* Set the default */
- uri = e_source_get_uri (source);
- gnome_calendar_set_default_uri (priv->calendar, uri);
- g_free (uri);
-
+ update_uri_for_primary_selection (calendar_component);
}
static void
@@ -497,6 +550,7 @@ impl_createControls (PortableServer_Servant servant,
/* Load the selection from the last run */
update_selection (calendar_component);
+ update_primary_selection (calendar_component);
/* If it gets fiddled with, ie from another evolution window, update it */
priv->selected_not = calendar_config_add_notification_calendars_selected (config_selection_changed_cb,
diff --git a/calendar/gui/calendar-config-keys.h b/calendar/gui/calendar-config-keys.h
index 6d0754db6f..55181d2769 100644
--- a/calendar/gui/calendar-config-keys.h
+++ b/calendar/gui/calendar-config-keys.h
@@ -30,6 +30,7 @@ G_BEGIN_DECLS
/* Display settings */
#define CALENDAR_CONFIG_TIMEZONE CALENDAR_CONFIG_PREFIX "/display/timezone"
#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"
#define CALENDAR_CONFIG_WEEK_START CALENDAR_CONFIG_PREFIX "/display/week_start_day"
#define CALENDAR_CONFIG_DAY_START_HOUR CALENDAR_CONFIG_PREFIX "/display/day_start_hour"
@@ -53,6 +54,7 @@ G_BEGIN_DECLS
/* Task display settings */
#define CALENDAR_CONFIG_TASKS_SELECTED_TASKS CALENDAR_CONFIG_PREFIX "/tasks/selected_tasks"
+#define CALENDAR_CONFIG_PRIMARY_TASKS CALENDAR_CONFIG_PREFIX "/display/primary_tasks"
#define CALENDAR_CONFIG_TASKS_HIDE_COMPLETED CALENDAR_CONFIG_PREFIX "/tasks/hide_completed"
#define CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_UNITS CALENDAR_CONFIG_PREFIX "/tasks/hide_completed_units"
#define CALENDAR_CONFIG_TASKS_HIDE_COMPLETED_VALUE CALENDAR_CONFIG_PREFIX "/tasks/hide_completed_value"
diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c
index 913af4acbc..3c12c381ac 100644
--- a/calendar/gui/calendar-config.c
+++ b/calendar/gui/calendar-config.c
@@ -119,6 +119,7 @@ units_to_string (CalUnits units)
* Calendar Settings.
*/
+/* The current list of calendars selected */
GSList *
calendar_config_get_calendars_selected (void)
{
@@ -141,6 +142,31 @@ calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func,
return id;
}
+/* The primary calendar */
+char *
+calendar_config_get_primary_calendar (void)
+{
+ return gconf_client_get_string (config, CALENDAR_CONFIG_PRIMARY_CALENDAR, NULL);
+}
+
+void
+calendar_config_set_primary_calendar (const char *primary_uid)
+{
+ gconf_client_set_string (config, CALENDAR_CONFIG_PRIMARY_CALENDAR, primary_uid, NULL);
+}
+
+
+guint
+calendar_config_add_notification_primary_calendar (GConfClientNotifyFunc func, gpointer data)
+{
+ guint id;
+
+ id = gconf_client_notify_add (config, CALENDAR_CONFIG_PRIMARY_CALENDAR, func, data, NULL, NULL);
+
+ return id;
+}
+
+
/* The current timezone, e.g. "Europe/London". It may be NULL, in which case
you should assume UTC (though Evolution will show the timezone-setting
dialog the next time a calendar or task folder is selected). */
@@ -463,6 +489,30 @@ calendar_config_add_notification_tasks_selected (GConfClientNotifyFunc func, gpo
return id;
}
+/* The primary task list */
+char *
+calendar_config_get_primary_tasks (void)
+{
+ return gconf_client_get_string (config, CALENDAR_CONFIG_PRIMARY_TASKS, NULL);
+}
+
+void
+calendar_config_set_primary_tasks (const char *primary_uid)
+{
+ gconf_client_set_string (config, CALENDAR_CONFIG_PRIMARY_TASKS, primary_uid, NULL);
+}
+
+
+guint
+calendar_config_add_notification_primary_tasks (GConfClientNotifyFunc func, gpointer data)
+{
+ guint id;
+
+ id = gconf_client_notify_add (config, CALENDAR_CONFIG_PRIMARY_TASKS, func, data, NULL, NULL);
+
+ return id;
+}
+
gint
calendar_config_get_task_vpane_pos (void)
{
diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h
index c7c8dae998..ff34febd91 100644
--- a/calendar/gui/calendar-config.h
+++ b/calendar/gui/calendar-config.h
@@ -73,6 +73,11 @@ GSList *calendar_config_get_calendars_selected (void);
void calendar_config_set_calendars_selected (GSList *selected);
guint calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func, gpointer data);
+/* The primary calendar */
+char *calendar_config_get_primary_calendar (void);
+void calendar_config_set_primary_calendar (const char *primary_uid);
+guint calendar_config_add_notification_primary_calendar (GConfClientNotifyFunc func, gpointer data);
+
/* The current timezone, e.g. "Europe/London". */
gchar* calendar_config_get_timezone (void);
void calendar_config_set_timezone (gchar *timezone);
@@ -152,6 +157,11 @@ GSList *calendar_config_get_tasks_selected (void);
void calendar_config_set_tasks_selected (GSList *selected);
guint calendar_config_add_notification_tasks_selected (GConfClientNotifyFunc func, gpointer data);
+/* The primary calendar */
+char *calendar_config_get_primary_tasks (void);
+void calendar_config_set_primary_tasks (const char *primary_uid);
+guint calendar_config_add_notification_primary_tasks (GConfClientNotifyFunc func, gpointer data);
+
/* The pane position */
gint calendar_config_get_task_vpane_pos (void);
void calendar_config_set_task_vpane_pos (gint vpane_pos);
diff --git a/calendar/gui/tasks-component.c b/calendar/gui/tasks-component.c
index e548326b3a..95ebd55304 100644
--- a/calendar/gui/tasks-component.c
+++ b/calendar/gui/tasks-component.c
@@ -117,6 +117,26 @@ is_in_uids (GSList *uids, ESource *source)
return FALSE;
}
+static ESource *
+find_first_source (ESourceList *source_list)
+{
+ GSList *groups, *sources, *l, *m;
+
+ groups = e_source_list_peek_groups (source_list);
+ for (l = groups; l; l = l->next) {
+ ESourceGroup *group = l->data;
+
+ sources = e_source_group_peek_sources (group);
+ for (m = sources; m; m = m->next) {
+ ESource *source = m->data;
+
+ return source;
+ }
+ }
+
+ return NULL;
+}
+
static void
update_uris_for_selection (TasksComponent *component)
{
@@ -150,6 +170,28 @@ update_uris_for_selection (TasksComponent *component)
}
static void
+update_uri_for_primary_selection (TasksComponent *component)
+{
+ TasksComponentPrivate *priv;
+ ESource *source;
+ char *uri;
+
+ priv = component->priv;
+
+ source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->source_selector));
+ if (!source)
+ return;
+
+ /* Set the default */
+ uri = e_source_get_uri (source);
+ e_tasks_set_default_uri (priv->tasks, uri);
+ g_free (uri);
+
+ /* Save the selection for next time we start up */
+ calendar_config_set_primary_tasks (e_source_peek_uid (source));
+}
+
+static void
update_selection (TasksComponent *task_component)
{
TasksComponentPrivate *priv;
@@ -186,6 +228,31 @@ update_selection (TasksComponent *task_component)
g_slist_free (uids_selected);
}
+static void
+update_primary_selection (TasksComponent *component)
+{
+ TasksComponentPrivate *priv;
+ ESource *source;
+ char *uid;
+
+ priv = component->priv;
+
+ uid = calendar_config_get_primary_tasks ();
+ if (uid) {
+ source = e_source_list_peek_source_by_uid (priv->source_list, uid);
+ g_free (uid);
+
+ e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (priv->source_selector), source);
+ } else {
+ ESource *source;
+
+ /* Try to create a default if there isn't one */
+ source = find_first_source (priv->source_list);
+ if (source)
+ e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (priv->source_selector), source);
+ }
+}
+
/* FIXME This is duplicated from comp-editor-factory.c, should it go in comp-util? */
static ECalComponent *
get_default_task (ECal *ecal)
@@ -325,27 +392,7 @@ source_selection_changed_cb (ESourceSelector *selector, TasksComponent *componen
static void
primary_source_selection_changed_cb (ESourceSelector *selector, TasksComponent *component)
{
- TasksComponentPrivate *priv;
- ESource *source;
- ECal *client;
- char *uri;
- ECalModel *model;
-
- priv = component->priv;
-
- source = e_source_selector_peek_primary_selection (selector);
- if (!source)
- return;
-
- /* Set the default */
- uri = e_source_get_uri (source);
- model = e_calendar_table_get_model (e_tasks_get_calendar_table (E_TASKS (priv->tasks)));
- client = e_cal_model_get_client_for_uri (model, uri);
- if (client)
- e_cal_model_set_default_client (model, client);
-
- g_free (uri);
-
+ update_uri_for_primary_selection (component);
}
static void
@@ -461,6 +508,7 @@ impl_createControls (PortableServer_Servant servant,
/* Load the selection from the last run */
update_selection (component);
+ update_primary_selection (component);
/* If it gets fiddled with, ie from another evolution window, update it */
priv->selected_not = calendar_config_add_notification_calendars_selected (config_selection_changed_cb,