aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/calendar-component.c151
-rw-r--r--calendar/gui/tasks-component.c106
2 files changed, 245 insertions, 12 deletions
diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c
index 2f641bcd4b..97b8b18846 100644
--- a/calendar/gui/calendar-component.c
+++ b/calendar/gui/calendar-component.c
@@ -62,6 +62,10 @@
#define CREATE_MEETING_ID "meeting"
#define CREATE_ALLDAY_EVENT_ID "allday-event"
#define CREATE_CALENDAR_ID "calendar"
+#define WEB_BASE_URI "webcal://"
+#define CONTACTS_BASE_URI "contacts://"
+#define WEATHER_BASE_URI "weather://"
+#define PERSONAL_RELATIVE_URI "system"
enum DndTargetType {
DND_TARGET_TYPE_CALENDAR_LIST,
@@ -121,6 +125,142 @@ struct _CalendarComponentPrivate {
/* FIXME This should be gnome cal likely */
extern ECompEditorRegistry *comp_editor_registry;
+static void
+ensure_sources (CalendarComponent *component)
+{
+ GSList *groups;
+ ESourceList *source_list;
+ ESourceGroup *group;
+ ESourceGroup *on_this_computer;
+ ESourceGroup *on_the_web;
+ ESourceGroup *contacts;
+ ESourceGroup *weather;
+ ESource *personal_source;
+ ESource *birthdays_source;
+ char *base_uri, *base_uri_proto;
+
+ on_this_computer = NULL;
+ on_the_web = NULL;
+ contacts = NULL;
+ weather = NULL;
+ personal_source = NULL;
+ birthdays_source = NULL;
+
+ if (!e_cal_get_sources (&source_list, E_CAL_SOURCE_TYPE_EVENT, NULL)) {
+ g_warning ("Could not get calendar source list from GConf!");
+ return;
+ }
+
+ base_uri = g_build_filename (calendar_component_peek_base_directory (component),
+ "calendar", "local",
+ NULL);
+
+ base_uri_proto = g_strconcat ("file://", base_uri, NULL);
+
+ groups = e_source_list_peek_groups (source_list);
+ if (groups) {
+ /* groups are already there, we need to search for things... */
+ GSList *g;
+
+ for (g = groups; g; g = g->next) {
+
+ group = E_SOURCE_GROUP (g->data);
+
+ /* compare only file:// part. If user home dir name changes we do not want to create
+ one more group */
+
+ if (!on_this_computer && !strncmp (base_uri_proto, e_source_group_peek_base_uri (group), 7))
+ on_this_computer = group;
+ else if (!on_the_web && !strcmp (WEB_BASE_URI, e_source_group_peek_base_uri (group)))
+ on_the_web = group;
+ else if (!contacts && !strcmp (CONTACTS_BASE_URI, e_source_group_peek_base_uri (group)))
+ contacts = group;
+ else if (!weather && !strcmp (WEATHER_BASE_URI, e_source_group_peek_base_uri (group)))
+ weather = group;
+ }
+ }
+
+ if (on_this_computer) {
+ /* make sure "Personal" shows up as a source under
+ this group */
+ GSList *sources = e_source_group_peek_sources (on_this_computer);
+ GSList *s;
+ for (s = sources; s; s = s->next) {
+ ESource *source = E_SOURCE (s->data);
+ if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) {
+ personal_source = source;
+ break;
+ }
+ }
+ /* Make sure we have the correct base uri. This can change when user's
+ homedir name changes */
+ if (strcmp (base_uri_proto, e_source_group_peek_base_uri (on_this_computer))) {
+ e_source_group_set_base_uri (on_this_computer, base_uri_proto);
+
+ /* *sigh* . We shouldn't need this sync call here as set_base_uri
+ call results in synching to gconf, but that happens in idle loop
+ and too late to prevent user seeing "Can not Open ... because of invalid uri" error.*/
+ e_source_list_sync (source_list,NULL);
+ }
+ }
+ else {
+ /* create the local source group */
+ group = e_source_group_new (_("On This Computer"), base_uri_proto);
+ e_source_list_add_group (source_list, group, -1);
+
+ on_this_computer = group;
+ }
+
+ if (!personal_source) {
+ /* Create the default Person addressbook */
+ personal_source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
+ e_source_group_add_source (on_this_computer, personal_source, -1);
+
+ }
+
+ if (!on_the_web) {
+ /* Create the On the web source group */
+ group = e_source_group_new (_("On The Web"), WEB_BASE_URI);
+ e_source_list_add_group (source_list, group, -1);
+
+ on_the_web = group;
+ }
+ if (contacts) {
+ GSList *sources = e_source_group_peek_sources (contacts);
+ if (sources)
+ birthdays_source = E_SOURCE (sources->data); /* There is only one source under Contacts Group*/
+ }
+ else {
+ /* Create the contacts group */
+ group = e_source_group_new (_("Contacts"), CONTACTS_BASE_URI);
+ e_source_list_add_group (source_list, group, -1);
+ contacts = group;
+ }
+
+ if (!birthdays_source) {
+ birthdays_source = e_source_new (_("Birthdays & Anniversaries"), "/");
+ e_source_group_add_source (contacts, birthdays_source, -1);
+ }
+
+ if (!weather) {
+ /* Create the weather group */
+ group = e_source_group_new (_("Weather"), WEATHER_BASE_URI);
+ e_source_list_add_group (source_list, group, -1);
+ weather = group;
+ }
+
+ component->priv->source_list = source_list;
+
+ if (personal_source)
+ g_object_unref (personal_source);
+ if (birthdays_source)
+ g_object_unref (birthdays_source);
+
+ g_free (base_uri_proto);
+ g_free (base_uri);
+}
+
+
/* Utility functions. */
static gboolean
@@ -1466,19 +1606,14 @@ calendar_component_init (CalendarComponent *component)
* calendar_component_peek_gconf_client(). */
priv->gconf_client = gconf_client_get_default ();
-
- if (!e_cal_get_sources (&priv->source_list, E_CAL_SOURCE_TYPE_EVENT, NULL))
- ;
-
- if (!e_cal_get_sources (&priv->task_source_list, E_CAL_SOURCE_TYPE_TODO, NULL))
- ;
-
not = calendar_config_add_notification_primary_calendar (config_primary_selection_changed_cb,
component);
priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not));
-
component->priv = priv;
+ ensure_sources (component);
+ if (!e_cal_get_sources (&priv->task_source_list, E_CAL_SOURCE_TYPE_TODO, NULL))
+ ;
}
diff --git a/calendar/gui/tasks-component.c b/calendar/gui/tasks-component.c
index 60ac1cd868..1cb4dabef6 100644
--- a/calendar/gui/tasks-component.c
+++ b/calendar/gui/tasks-component.c
@@ -60,6 +60,9 @@ enum DndTargetType {
};
#define CALENDAR_TYPE "text/calendar"
#define XCALENDAR_TYPE "text/x-calendar"
+#define WEB_BASE_URI "webcal://"
+#define PERSONAL_RELATIVE_URI "system"
+
static GtkTargetEntry drag_types[] = {
{ CALENDAR_TYPE, 0, DND_TARGET_TYPE_CALENDAR_LIST },
{ XCALENDAR_TYPE, 0, DND_TARGET_TYPE_CALENDAR_LIST }
@@ -112,6 +115,103 @@ struct _TasksComponentPrivate {
GList *notifications;
};
+static void
+ensure_sources (TasksComponent *component)
+{
+ GSList *groups;
+ ESourceList *source_list;
+ ESourceGroup *group;
+ ESourceGroup *on_this_computer;
+ ESourceGroup *on_the_web;
+ ESource *personal_source;
+ char *base_uri, *base_uri_proto;
+
+ on_this_computer = NULL;
+ on_the_web = NULL;
+ personal_source = NULL;
+
+ if (!e_cal_get_sources (&source_list, E_CAL_SOURCE_TYPE_TODO, NULL)) {
+ g_warning ("Could not get addressbook source list from GConf!");
+ return;
+ }
+
+ base_uri = g_build_filename (tasks_component_peek_base_directory (component),
+ "tasks", "local",
+ NULL);
+
+ base_uri_proto = g_strconcat ("file://", base_uri, NULL);
+
+ groups = e_source_list_peek_groups (source_list);
+ if (groups) {
+ /* groups are already there, we need to search for things... */
+ GSList *g;
+
+ for (g = groups; g; g = g->next) {
+
+ group = E_SOURCE_GROUP (g->data);
+
+ /* compare only file:// part. If user home dir name changes we do not want to create
+ one more group */
+
+ if (!on_this_computer && !strncmp (base_uri_proto, e_source_group_peek_base_uri (group), 7))
+ on_this_computer = group;
+ else if (!on_the_web && !strcmp (WEB_BASE_URI, e_source_group_peek_base_uri (group)))
+ on_the_web = group;
+ }
+ }
+
+ if (on_this_computer) {
+ /* make sure "Personal" shows up as a source under
+ this group */
+ GSList *sources = e_source_group_peek_sources (on_this_computer);
+ GSList *s;
+ for (s = sources; s; s = s->next) {
+ ESource *source = E_SOURCE (s->data);
+ if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) {
+ personal_source = source;
+ break;
+ }
+ }
+ /* Make sure we have the correct base uri. This can change when user's
+ homedir name changes */
+ if (strcmp (base_uri_proto, e_source_group_peek_base_uri (on_this_computer))) {
+ e_source_group_set_base_uri (on_this_computer, base_uri_proto);
+
+ /* *sigh* . We shouldn't need this sync call here as set_base_uri
+ call results in synching to gconf, but that happens in idle loop
+ and too late to prevent user seeing "Can not Open ... because of invalid uri" error.*/
+ e_source_list_sync (source_list,NULL);
+ }
+ }
+ else {
+ /* create the local source group */
+ group = e_source_group_new (_("On This Computer"), base_uri_proto);
+ e_source_list_add_group (source_list, group, -1);
+
+ on_this_computer = group;
+ }
+
+ if (!personal_source) {
+ /* Create the default Person addressbook */
+ ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
+ e_source_group_add_source (on_this_computer, source, -1);
+
+ personal_source = source;
+ }
+
+ if (!on_the_web) {
+ /* Create the LDAP source group */
+ group = e_source_group_new (_("On The Web"), WEB_BASE_URI);
+ e_source_list_add_group (source_list, group, -1);
+
+ on_the_web = group;
+ }
+
+ component->priv->source_list = source_list;
+ g_free (base_uri_proto);
+ g_free (base_uri);
+}
+
/* Utility functions. */
/* FIXME Some of these are duplicated from calendar-component.c */
static gboolean
@@ -1173,11 +1273,9 @@ tasks_component_init (TasksComponent *component, TasksComponentClass *klass)
priv->config_directory = g_build_filename (g_get_home_dir (),
".evolution", "tasks", "config",
NULL);
-
- if (!e_cal_get_sources (&priv->source_list, E_CAL_SOURCE_TYPE_TODO, NULL))
- ;
-
+
component->priv = priv;
+ ensure_sources (component);
}
/* Public API */