diff options
author | Ettore Perazzoli <ettore@src.gnome.org> | 2001-07-01 13:11:43 +0800 |
---|---|---|
committer | Ettore Perazzoli <ettore@src.gnome.org> | 2001-07-01 13:11:43 +0800 |
commit | d801d2df671bea7e08711f0027fbf8f3dc873b01 (patch) | |
tree | 01fbaeffccb8f6167971b7cd90f5688254de21f8 /shell/e-shortcuts.c | |
parent | a0afdf4f53224a55425a8826c0563faa510fa6c5 (diff) | |
download | gsoc2013-evolution-d801d2df671bea7e08711f0027fbf8f3dc873b01.tar.gz gsoc2013-evolution-d801d2df671bea7e08711f0027fbf8f3dc873b01.tar.zst gsoc2013-evolution-d801d2df671bea7e08711f0027fbf8f3dc873b01.zip |
Change the internal structure for shortucts, so that it contains a
type and a name too. The name will allow renaming shortcuts (thus
decoupling the name of the folder the shortcuts points to from the
name of the shortcut); the type member is used to cache the type of
the folder we point to so that we can still display the right icon
even if the folder is currently not in the storage (e.g. this happens
for IMAP folders when you haven't opened the corresponding IMAP node
yet).
I don't like the way this is designed at all (mainly, the
responsibility for saving the values should be moved elsewhere), but
I'll fix it later.
Also, I added an "Open in New Window" right-click menu item for
shortcuts.
svn path=/trunk/; revision=10649
Diffstat (limited to 'shell/e-shortcuts.c')
-rw-r--r-- | shell/e-shortcuts.c | 190 |
1 files changed, 176 insertions, 14 deletions
diff --git a/shell/e-shortcuts.c b/shell/e-shortcuts.c index 18d79b330f..60453eae4b 100644 --- a/shell/e-shortcuts.c +++ b/shell/e-shortcuts.c @@ -138,6 +138,31 @@ shortcut_item_new (const char *uri, } static void +shortcut_item_update (EShortcutItem *shortcut_item, + const char *uri, + const char *name, + const char *type) +{ + if (name == NULL) + name = g_basename (uri); + + if (shortcut_item->uri != uri) { + g_free (shortcut_item->uri); + shortcut_item->uri = g_strdup (uri); + } + + if (shortcut_item->name != name) { + g_free (shortcut_item->name); + shortcut_item->name = g_strdup (name); + } + + if (shortcut_item->type != type) { + g_free (shortcut_item->type); + shortcut_item->type = g_strdup (type); + } +} + +static void shortcut_item_free (EShortcutItem *shortcut_item) { g_free (shortcut_item->uri); @@ -177,6 +202,43 @@ shortcut_group_free (ShortcutGroup *group) /* Utility functions. */ static void +update_shortcut_and_emit_signal (EShortcuts *shortcuts, + EShortcutItem *shortcut_item, + int group_num, + int num, + const char *uri, + const char *name, + const char *type) +{ + shortcut_item_update (shortcut_item, uri, name, type); + gtk_signal_emit (GTK_OBJECT (shortcuts), signals[UPDATE_SHORTCUT], group_num, num); +} + +static void +override_shortcut_name_and_type_from_storage_set (EShortcuts *shortcuts, + EShortcutItem *shortcut_item) +{ + EShortcutsPrivate *priv; + EFolder *folder; + + priv = shortcuts->priv; + + /* If it is not an evolution: link, there is not much we can do. */ + if (strncmp (shortcut_item->uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) + return; + + folder = e_storage_set_get_folder (priv->storage_set, + shortcut_item->uri + E_SHELL_URI_PREFIX_LEN); + if (folder == NULL) + return; + + shortcut_item_update (shortcut_item, + shortcut_item->uri, + NULL, + e_folder_get_type_string (folder)); +} + +static void unload_shortcuts (EShortcuts *shortcuts) { EShortcutsPrivate *priv; @@ -235,12 +297,12 @@ load_shortcuts (EShortcuts *shortcuts, for (p = root->childs; p != NULL; p = p->next) { ShortcutGroup *shortcut_group; - char *shortcut_group_title; + xmlChar *shortcut_group_title; if (strcmp ((char *) p->name, "group") != 0) continue; - shortcut_group_title = (char *) xmlGetProp (p, "title"); + shortcut_group_title = xmlGetProp (p, "title"); if (shortcut_group_title == NULL) continue; @@ -256,15 +318,34 @@ load_shortcuts (EShortcuts *shortcuts, xmlFree (shortcut_group_title); for (q = p->childs; q != NULL; q = q->next) { + EShortcutItem *shortcut_item; xmlChar *uri; + xmlChar *name; + xmlChar *type; if (strcmp ((char *) q->name, "item") != 0) continue; - uri = xmlNodeListGetString (doc, q->childs, 1); + uri = xmlNodeListGetString (doc, q->childs, 1); + name = xmlGetProp (q, "name"); + type = xmlGetProp (q, "type"); + + shortcut_item = shortcut_item_new (uri, name, type); + + /* The name and type are the ones we saved from the + last session. If the folder is in the storage, we + have to get the type and name from this storage. */ + override_shortcut_name_and_type_from_storage_set (shortcuts, shortcut_item); + shortcut_group->shortcuts = g_slist_prepend (shortcut_group->shortcuts, - shortcut_item_new (uri, NULL, NULL)); - xmlFree (uri); + shortcut_item); + + if (uri != NULL) + xmlFree (uri); + if (name != NULL) + xmlFree (name); + if (type != NULL) + xmlFree (type); } shortcut_group->shortcuts = g_slist_reverse (shortcut_group->shortcuts); @@ -276,6 +357,11 @@ load_shortcuts (EShortcuts *shortcuts, xmlFreeDoc (doc); + /* After loading, we always have to re-save ourselves as we have merged + the information we have with the information we got from the + StorageSet. */ + make_dirty (shortcuts); + return TRUE; } @@ -305,9 +391,15 @@ save_shortcuts (EShortcuts *shortcuts, for (q = group->shortcuts; q != NULL; q = q->next) { EShortcutItem *shortcut; + xmlNode *shortcut_node; shortcut = (EShortcutItem *) q->data; - xmlNewChild (group_node, NULL, (xmlChar *) "item", (xmlChar *) shortcut->uri); + shortcut_node = xmlNewChild (group_node, NULL, (xmlChar *) "item", (xmlChar *) shortcut->uri); + + if (shortcut->name != NULL) + xmlSetProp (shortcut_node, (xmlChar *) "name", shortcut->name); + if (shortcut->type != NULL) + xmlSetProp (shortcut_node, (xmlChar *) "type", shortcut->type); } } @@ -384,7 +476,7 @@ schedule_idle (EShortcuts *shortcuts) if (priv->save_idle_id != 0) return; - gtk_idle_add (idle_cb, shortcuts); + priv->save_idle_id = gtk_idle_add (idle_cb, shortcuts); } static void @@ -398,6 +490,48 @@ make_dirty (EShortcuts *shortcuts) schedule_idle (shortcuts); } +static void +update_shortcuts_by_path (EShortcuts *shortcuts, + const char *path) +{ + EShortcutsPrivate *priv; + EFolder *folder; + const GSList *p, *q; + char *evolution_uri; + int group_num, num; + + priv = shortcuts->priv; + folder = e_storage_set_get_folder (priv->storage_set, path); + + evolution_uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); + + group_num = 0; + for (p = priv->groups; p != NULL; p = p->next, group_num++) { + ShortcutGroup *group; + + group = (ShortcutGroup *) p->data; + num = 0; + for (q = group->shortcuts; q != NULL; q = q->next, num++) { + EShortcutItem *shortcut_item; + + shortcut_item = (EShortcutItem *) q->data; + + if (strcmp (shortcut_item->uri, evolution_uri) == 0) + update_shortcut_and_emit_signal (shortcuts, + shortcut_item, + group_num, + num, + evolution_uri, + NULL, + e_folder_get_type_string (folder)); + } + } + + g_free (evolution_uri); + + make_dirty (shortcuts); +} + /* Signal handlers for the views. */ @@ -415,6 +549,35 @@ view_destroyed_cb (GtkObject *object, } +/* Signal handlers for the EStorageSet. */ + +static void +storage_set_new_folder_callback (EStorageSet *storage_set, + const char *path, + void *data) +{ + EShortcuts *shortcuts; + + shortcuts = E_SHORTCUTS (data); + + update_shortcuts_by_path (shortcuts, path); + make_dirty (shortcuts); +} + +static void +storage_set_updated_folder_callback (EStorageSet *storage_set, + const char *path, + void *data) +{ + EShortcuts *shortcuts; + + shortcuts = E_SHORTCUTS (data); + + update_shortcuts_by_path (shortcuts, path); + make_dirty (shortcuts); +} + + /* GtkObject methods. */ static void @@ -547,10 +710,14 @@ e_shortcuts_construct (EShortcuts *shortcuts, priv = shortcuts->priv; - /* FIXME: Get rid of the storage set, we dont' need it here. */ gtk_object_ref (GTK_OBJECT (storage_set)); priv->storage_set = storage_set; + gtk_signal_connect (GTK_OBJECT (storage_set), "new_folder", + GTK_SIGNAL_FUNC (storage_set_new_folder_callback), shortcuts); + gtk_signal_connect (GTK_OBJECT (storage_set), "updated_folder", + GTK_SIGNAL_FUNC (storage_set_updated_folder_callback), shortcuts); + gtk_object_ref (GTK_OBJECT (folder_type_registry)); priv->folder_type_registry = folder_type_registry; } @@ -804,13 +971,8 @@ e_shortcuts_update_shortcut (EShortcuts *shortcuts, g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); shortcut_item = get_item (shortcuts, group_num, num); - g_free (shortcut_item->uri); - shortcut_item->uri = g_strdup (uri); - shortcut_item->name = g_strdup (name); - shortcut_item->type = g_strdup (type); - - gtk_signal_emit (GTK_OBJECT (shortcuts), signals[UPDATE_SHORTCUT], group_num, num); + update_shortcut_and_emit_signal (shortcuts, shortcut_item, group_num, num, uri, name, type); } |