aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-shortcuts-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/e-shortcuts-view.c')
-rw-r--r--shell/e-shortcuts-view.c139
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 *