diff options
Diffstat (limited to 'calendar/gui/calendar-component.c')
-rw-r--r-- | calendar/gui/calendar-component.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c index 02bf9a0072..b207c028a6 100644 --- a/calendar/gui/calendar-component.c +++ b/calendar/gui/calendar-component.c @@ -126,6 +126,160 @@ calcomp_vpane_resized (GtkWidget *vpane, GdkEventButton *e, CalendarComponentVie return FALSE; } +<<<<<<< HEAD:calendar/gui/calendar-component.c +======= +static void +ensure_sources (CalendarComponent *component) +{ + ESourceList *source_list; + ESourceGroup *on_this_computer; + ESourceGroup *contacts; + ESource *personal_source; + ESource *birthdays_source; + gchar *base_uri, *base_uri_proto, base_uri_proto_seventh; + const gchar *base_dir; + gchar *create_source; + + 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_dir = calendar_component_peek_base_directory (component); + base_uri = g_build_filename (base_dir, "local", NULL); + + base_uri_proto = g_filename_to_uri (base_uri, NULL, NULL); + if (strlen (base_uri_proto) > 7) { + /* compare only file:// part. If user home dir name changes we do not want to create + one more group */ + base_uri_proto_seventh = base_uri_proto[7]; + base_uri_proto[7] = 0; + } else { + base_uri_proto_seventh = -1; + } + + on_this_computer = e_source_list_ensure_group (source_list, _("On This Computer"), base_uri_proto, TRUE); + contacts = e_source_list_ensure_group (source_list, _("Contacts"), CONTACTS_BASE_URI, TRUE); + e_source_list_ensure_group (source_list, _("On The Web"), WEB_BASE_URI, FALSE); + e_source_list_ensure_group (source_list, _("Weather"), WEATHER_BASE_URI, FALSE); + + if (base_uri_proto_seventh != -1) { + base_uri_proto[7] = base_uri_proto_seventh; + } + + 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); + const gchar *relative_uri; + + relative_uri = e_source_peek_relative_uri (source); + if (relative_uri == NULL) + continue; + if (!strcmp (PERSONAL_RELATIVE_URI, relative_uri)) { + 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); + } + } + + if (personal_source) { + /* ensure the source name is in current locale, not read from configuration */ + e_source_set_name (personal_source, _("Personal")); + } else { + gchar *primary_calendar = calendar_config_get_primary_calendar(); + GSList *calendars_selected; + + /* 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); + g_object_unref (personal_source); + + calendars_selected = calendar_config_get_calendars_selected (); + if (!primary_calendar && !calendars_selected) { + GSList selected; + + calendar_config_set_primary_calendar (e_source_peek_uid (personal_source)); + + selected.data = (gpointer)e_source_peek_uid (personal_source); + selected.next = NULL; + calendar_config_set_calendars_selected (&selected); + } + + if (calendars_selected) { + g_slist_foreach (calendars_selected, (GFunc) g_free, NULL); + g_slist_free (calendars_selected); + } + + g_free (primary_calendar); + e_source_set_color_spec (personal_source, "#BECEDD"); + } + + 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*/ + + if (sources->next) { + /* Ensure we have only one contacts source - we was able to create more than one before */ + GSList *l = NULL, *p; + + for (p = sources->next; p; p = p->next) + l = g_slist_prepend (l, p->data); + + for (p = l; p; p = p->next) + e_source_group_remove_source (contacts, p->data); + + g_slist_free (l); + } + } + } + + create_source = e_source_group_get_property (contacts, "create_source"); + if (!create_source) + e_source_group_set_property (contacts, "create_source", "no"); + g_free (create_source); + + if (birthdays_source) { + /* ensure the source name is in current locale, not read from configuration */ + e_source_set_name (birthdays_source, _("Birthdays & Anniversaries")); + } else { + birthdays_source = e_source_new (_("Birthdays & Anniversaries"), "/"); + e_source_group_add_source (contacts, birthdays_source, -1); + g_object_unref (birthdays_source); + } + + if (!e_source_get_property (birthdays_source, "delete")) + e_source_set_property(birthdays_source, "delete", "no"); + + if (e_source_peek_color_spec (birthdays_source) == NULL) + e_source_set_color_spec (birthdays_source, "#DDBECE"); + + component->priv->source_list = source_list; + + g_object_unref (on_this_computer); + g_object_unref (contacts); + g_free (base_uri_proto); + g_free (base_uri); +} + +>>>>>>> master:calendar/gui/calendar-component.c /* Utility functions. */ static gboolean |