/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2002 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2003 Hiroyuki Yamamoto
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
/* Create root folder item */
item = folder_item_new(folder, name, NULL);
item->folder = folder;
- folder->node = g_node_new(item);
+ folder->node = item->node = g_node_new(item);
folder->data = NULL;
return folder;
item->threaded = TRUE;
item->ret_rcpt = FALSE;
item->opened = FALSE;
+ item->node = NULL;
item->parent = NULL;
item->folder = NULL;
item->account = NULL;
void folder_item_append(FolderItem *parent, FolderItem *item)
{
- GNode *node;
-
g_return_if_fail(parent != NULL);
g_return_if_fail(parent->folder != NULL);
+ g_return_if_fail(parent->node != NULL);
g_return_if_fail(item != NULL);
- node = parent->folder->node;
- node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, parent);
- g_return_if_fail(node != NULL);
-
item->parent = parent;
item->folder = parent->folder;
- g_node_append_data(node, item);
+ item->node = g_node_append_data(parent->node, item);
+}
+
+static gboolean folder_item_remove_func(GNode *node, gpointer data)
+{
+ FolderItem *item = FOLDER_ITEM(node->data);
+
+ folder_item_destroy(item);
+ return FALSE;
}
void folder_item_remove(FolderItem *item)
g_return_if_fail(item != NULL);
g_return_if_fail(item->folder != NULL);
+ g_return_if_fail(item->node != NULL);
- node = item->folder->node;
- node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
- g_return_if_fail(node != NULL);
+ node = item->node;
- /* TODO: free all FolderItem's first */
if (item->folder->node == node)
item->folder->node = NULL;
+
+ g_node_traverse(node, G_POST_ORDER, G_TRAVERSE_ALL, -1,
+ folder_item_remove_func, NULL);
g_node_destroy(node);
}
void folder_item_destroy(FolderItem *item)
{
+ Folder *folder;
+
g_return_if_fail(item != NULL);
- debug_print("Destroying folder item %s\n", item->path);
+ folder = item->folder;
+ if (folder) {
+ if (folder->inbox == item)
+ folder->inbox = NULL;
+ else if (folder->outbox == item)
+ folder->outbox = NULL;
+ else if (folder->draft == item)
+ folder->draft = NULL;
+ else if (folder->queue == item)
+ folder->queue = NULL;
+ else if (folder->trash == item)
+ folder->trash = NULL;
+ }
if (item->cache)
folder_item_free_cache(item);
void folder_tree_destroy(Folder *folder)
{
g_return_if_fail(folder != NULL);
- g_return_if_fail(folder->node != NULL);
prefs_scoring_clear_folder(folder);
prefs_filtering_clear_folder(folder);
- g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_tree_destroy_func, NULL);
if (folder->node)
- g_node_destroy(folder->node);
-
- folder->inbox = NULL;
- folder->outbox = NULL;
- folder->draft = NULL;
- folder->queue = NULL;
- folder->trash = NULL;
- folder->node = NULL;
+ folder_item_remove(FOLDER_ITEM(folder->node->data));
}
void folder_add(Folder *folder)
item->ret_rcpt = ret_rcpt;
item->sort_key = sort_key;
item->sort_type = sort_type;
+ item->node = node;
item->parent = FOLDER_ITEM(node->parent->data);
item->folder = folder;
switch (stype) {
static gboolean folder_read_folder_func(GNode *node, gpointer data)
{
Folder *folder;
+ FolderItem *item;
XMLNode *xmlnode;
GList *list;
FolderClass *class = NULL;
folder->account = account;
if (account != NULL)
account->folder = REMOTE_FOLDER(folder);
- node->data = folder->node->data;
+ item = FOLDER_ITEM(folder->node->data);
+ node->data = item;
+ item->node = node;
g_node_destroy(folder->node);
folder->node = node;
folder_add(folder);
- FOLDER_ITEM(node->data)->collapsed = collapsed;
- FOLDER_ITEM(node->data)->thread_collapsed = thread_collapsed;
- FOLDER_ITEM(node->data)->threaded = threaded;
- FOLDER_ITEM(node->data)->account = account;
- FOLDER_ITEM(node->data)->apply_sub = apply_sub;
- FOLDER_ITEM(node->data)->ret_rcpt = ret_rcpt;
+ item->collapsed = collapsed;
+ item->thread_collapsed = thread_collapsed;
+ item->threaded = threaded;
+ item->account = account;
+ item->apply_sub = apply_sub;
+ item->ret_rcpt = ret_rcpt;
g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
folder_build_tree, folder);