diff options
Diffstat (limited to 'shell/e-shortcuts-view.c')
-rw-r--r-- | shell/e-shortcuts-view.c | 139 |
1 files changed, 138 insertions, 1 deletions
diff --git a/shell/e-shortcuts-view.c b/shell/e-shortcuts-view.c index ca36020c69..86c386bf72 100644 --- a/shell/e-shortcuts-view.c +++ b/shell/e-shortcuts-view.c @@ -47,6 +47,138 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; +/* View initialization. */ + +static const char * +get_storage_set_path_from_uri (const char *uri) +{ + const char *colon; + + if (g_path_is_absolute (uri)) + return NULL; + + colon = strchr (uri, ':'); + if (colon == NULL || colon == uri || colon[1] == '\0') + return NULL; + + if (! g_path_is_absolute (colon + 1)) + return NULL; + + if (g_strncasecmp (uri, "evolution", colon - uri) != 0) + return NULL; + + return colon + 1; +} + +static void +load_group (EShortcutsView *shortcuts_view, + const char *group_title, + int group_num) +{ + EShortcutsViewPrivate *priv; + EShortcuts *shortcuts; + EStorageSet *storage_set; + GList *shortcut_list; + GList *p; + + priv = shortcuts_view->priv; + shortcuts = priv->shortcuts; + + storage_set = e_shortcuts_get_storage_set (shortcuts); + g_assert (storage_set != NULL); + + shortcut_list = e_shortcuts_get_shortcuts_in_group (shortcuts, group_title); + if (shortcut_list == NULL) + return; + + for (p = shortcut_list; p != NULL; p = p->next) { + EFolder *folder; + const char *path; + const char *uri; + const char *name; + + uri = (const char *) p->data; + path = get_storage_set_path_from_uri (uri); + if (path != NULL) + folder = e_storage_set_get_folder (storage_set, path); + + if (path == NULL || folder == NULL) { + /* FIXME */ + g_warning ("Invalid link while loading shortcut bar view -- %s\n", + uri); + continue; + } + + name = e_folder_get_name (folder); + e_shortcut_bar_add_item (E_SHORTCUT_BAR (shortcuts_view), group_num, uri, name); + } + + e_free_string_list (shortcut_list); +} + +static void +load_all_shortcuts (EShortcutsView *shortcuts_view) +{ + EShortcutsViewPrivate *priv; + EShortcuts *shortcuts; + GList *group_titles; + GList *p; + int group_num; + + priv = shortcuts_view->priv; + shortcuts = priv->shortcuts; + + group_titles = e_shortcuts_get_group_titles (shortcuts); + + for (p = group_titles; p != NULL; p = p->next) { + const char *group_title; + + group_title = (const char *) p->data; + group_num = e_shortcut_bar_add_group (E_SHORTCUT_BAR (shortcuts_view), + group_title); + + load_group (shortcuts_view, group_title, group_num); + } + + e_free_string_list (group_titles); +} + +/* Icon callback for the shortcut bar. */ +static GdkPixbuf * +icon_callback (EShortcutBar *shortcut_bar, + const char *uri, + gpointer data) +{ + EFolderTypeRepository *folder_type_repository; + EShortcuts *shortcuts; + EStorageSet *storage_set; + EFolder *folder; + GdkPixbuf *pixbuf; + const char *type; + + shortcuts = E_SHORTCUTS (data); + + storage_set = e_shortcuts_get_storage_set (shortcuts); + folder_type_repository = e_storage_set_get_folder_type_repository (storage_set); + + folder = e_storage_set_get_folder (storage_set, + get_storage_set_path_from_uri (uri)); + + if (folder == NULL) + return NULL; + + type = e_folder_get_type_string (folder); + if (type == NULL) + return NULL; + + pixbuf = e_folder_type_repository_get_icon_for_type (folder_type_repository, type); + if (pixbuf != NULL) + gdk_pixbuf_ref (pixbuf); + + return pixbuf; +} + + static void destroy (GtkObject *object) { @@ -133,9 +265,14 @@ e_shortcuts_view_construct (EShortcutsView *shortcuts_view, g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); priv = shortcuts_view->priv; - priv->shortcuts = shortcuts; gtk_object_ref (GTK_OBJECT (shortcuts)); + priv->shortcuts = shortcuts; + + e_shortcut_bar_set_icon_callback (E_SHORTCUT_BAR (shortcuts_view), icon_callback, + shortcuts); + + load_all_shortcuts (shortcuts_view); } GtkWidget * |