diff options
-rw-r--r-- | calendar/ChangeLog | 16 | ||||
-rw-r--r-- | calendar/gui/calendar-component.c | 151 | ||||
-rw-r--r-- | calendar/gui/tasks-component.c | 106 |
3 files changed, 261 insertions, 12 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 11ea448a03..a4c2d3400d 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,19 @@ +2005-02-19 Sivaiah Nallagatla <snallagatla@novell.com> + + * gui/calendar-component.c (ensure_sources) : + Make sure all the default source groups and sources + are present by adding missing ones. Also update the + base uri of "On This Computer" group to take care + of change in user home dir. + (calendar_component_init) : call ensure_sources + + * gui/tasks-component.c (ensure_sources) + (tasks_component_init) : ditto + + Takes care of #67411 & #67724 for + calendar and tasks components. + + 2005-02-18 Rodrigo Moya <rodrigo@novell.com> * gui/alarm-notify/alarm-notify.c (cal_opened_cb): if opening 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 */ |