#include "intl.h"
#include "folder.h"
+#include "folderview.h"
#include "session.h"
#include "imap.h"
#include "news.h"
static gchar *folder_get_list_path (void);
static void folder_write_list_recursive (GNode *node,
gpointer data);
+static void folder_update_op_count_rec (GNode *node);
Folder *folder_new(FolderType type, const gchar *name, const gchar *path)
item->no_sub = FALSE;
item->no_select = FALSE;
item->collapsed = FALSE;
+ item->threaded = TRUE;
+ item->ret_rcpt = FALSE;
item->parent = NULL;
item->folder = NULL;
item->data = NULL;
{
GNode *node;
XMLNode *xmlnode;
+ gchar *path;
- node = xml_parse_file(folder_get_list_path());
+ path = folder_get_list_path();
+ if (!is_file_exist(path)) return -1;
+ node = xml_parse_file(path);
if (!node) return -1;
xmlnode = node->data;
num = folder->move_msgs_with_dest(folder, dest, msglist);
if (num > 0) dest->last_num = num;
+ else dest->op_count = 0;
return num;
}
num = folder->copy_msgs_with_dest(folder, dest, msglist);
if (num > 0) dest->last_num = num;
+ else dest->op_count = 0;
return num;
}
gint folder_item_remove_msg(FolderItem *item, gint num)
{
Folder *folder;
- gint result;
+ gint ret;
g_return_val_if_fail(item != NULL, -1);
folder = item->folder;
-
- g_return_val_if_fail(folder->scan != NULL, -1);
- g_return_val_if_fail(folder->remove_msg != NULL, -1);
-
- if (folder->finished_remove)
- folder->finished_remove(folder, item);
-
- result = folder->remove_msg(folder, item, num);
-
if (item->last_num < 0) folder->scan(folder, item);
- if (result == 0){
- if (folder->finished_remove)
- folder->finished_remove(folder, item);
- }
+ ret = folder->remove_msg(folder, item, num);
+ if (ret == 0 && num == item->last_num)
+ folder->scan(folder, item);
- return result;
+ return ret;
}
gint folder_item_remove_all_msg(FolderItem *item)
const gchar *name = NULL;
const gchar *path = NULL;
PrefsAccount *account = NULL;
- gboolean no_sub = FALSE, no_select = FALSE, collapsed = FALSE;
+ gboolean no_sub = FALSE, no_select = FALSE, collapsed = FALSE,
+ threaded = TRUE, ret_rcpt = FALSE;
gint mtime = 0, new = 0, unread = 0, total = 0;
g_return_val_if_fail(node->data != NULL, FALSE);
no_select = *attr->value == '1' ? TRUE : FALSE;
else if (!strcmp(attr->name, "collapsed"))
collapsed = *attr->value == '1' ? TRUE : FALSE;
+ else if (!strcmp(attr->name, "threaded"))
+ threaded = *attr->value == '1' ? TRUE : FALSE;
+ else if (!strcmp(attr->name, "reqretrcpt"))
+ ret_rcpt = *attr->value == '1' ? TRUE : FALSE;
}
item = folder_item_new(name, path);
item->no_sub = no_sub;
item->no_select = no_select;
item->collapsed = collapsed;
+ item->threaded = threaded;
+ item->ret_rcpt = ret_rcpt;
item->parent = FOLDER_ITEM(node->parent->data);
item->folder = folder;
switch (stype) {
const gchar *name = NULL;
const gchar *path = NULL;
PrefsAccount *account = NULL;
- gboolean collapsed = FALSE;
+ gboolean collapsed = FALSE, threaded = TRUE, ret_rcpt = FALSE;
if (g_node_depth(node) != 2) return FALSE;
g_return_val_if_fail(node->data != NULL, FALSE);
attr->value);
} else if (!strcmp(attr->name, "collapsed"))
collapsed = *attr->value == '1' ? TRUE : FALSE;
+ else if (!strcmp(attr->name, "threaded"))
+ threaded = *attr->value == '1' ? TRUE : FALSE;
+ else if (!strcmp(attr->name, "reqretrcpt"))
+ ret_rcpt = *attr->value == '1' ? TRUE : FALSE;
}
folder = folder_new(type, name, path);
folder->node = node;
folder_add(folder);
FOLDER_ITEM(node->data)->collapsed = collapsed;
+ FOLDER_ITEM(node->data)->threaded = threaded;
+ FOLDER_ITEM(node->data)->ret_rcpt = ret_rcpt;
g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
folder_build_tree, folder);
folder->account->account_id);
if (item->collapsed && node->children)
fputs(" collapsed=\"1\"", fp);
+ if (item->ret_rcpt)
+ fputs(" reqretrcpt=\"1\"", fp);
} else {
fprintf(fp, "<folderitem type=\"%s\"",
folder_item_stype_str[item->stype]);
fputs(" no_select=\"1\"", fp);
if (item->collapsed && node->children)
fputs(" collapsed=\"1\"", fp);
+ if (item->threaded)
+ fputs(" threaded=\"1\"", fp);
+ else
+ fputs(" threaded=\"0\"", fp);
+ if (item->ret_rcpt)
+ fputs(" reqretrcpt=\"1\"", fp);
fprintf(fp,
" mtime=\"%ld\" new=\"%d\" unread=\"%d\" total=\"%d\"",
item->mtime, item->new, item->unread, item->total);
fputs(" />\n", fp);
}
+static void folder_update_op_count_rec(GNode *node) {
+ FolderItem *fitem = FOLDER_ITEM(node->data);
+
+ if (g_node_depth(node) > 0) {
+ if (fitem->op_count > 0) {
+ fitem->op_count = 0;
+ folderview_update_item(fitem, 0);
+ }
+ if (node->children) {
+ GNode *child;
+
+ child = node->children;
+ while (child) {
+ GNode *cur;
+
+ cur = child;
+ child = cur->next;
+ folder_update_op_count_rec(cur);
+ }
+ }
+ }
+}
+
+void folder_update_op_count() {
+ GList *cur;
+ Folder *folder;
+
+ for (cur = folder_list; cur != NULL; cur = cur->next) {
+ folder = cur->data;
+ folder_update_op_count_rec(folder->node);
+ }
+}
+
typedef struct _type_str {
gchar * str;
gint type;