fix bug [14] where new mail notification worked incorrectly with IMAP accounts
[claws.git] / src / folderview.c
index 4fb7377a53298a268705099fa13458dd838e6b4c..3bbf251d7591b778d415657ad0b50b94c30f9974 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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
@@ -62,6 +62,7 @@
 #include "foldersel.h"
 #include "inc.h"
 #include "statusbar.h"
+#include "hooks.h"
 
 typedef enum
 {
@@ -259,9 +260,8 @@ static void folderview_drag_data_get     (GtkWidget        *widget,
 
 void folderview_create_folder_node       (FolderView       *folderview, 
                                          FolderItem       *item);
-void folderview_update_item             (FolderItem       *item,
-                                          gboolean         update_summary,
-                                         gpointer          data);
+gboolean folderview_update_item                 (gpointer          source,
+                                         gpointer          data);
 
 static void folderview_scoring_cb(FolderView *folderview, guint action,
                                  GtkWidget *widget);
@@ -506,7 +506,7 @@ FolderView *folderview_create(void)
        folderview->mbox_factory = mbox_factory;
 
        folderview->folder_item_update_callback_id =
-               folder_item_update_callback_register(folderview_update_item, (gpointer) folderview);
+               hooks_register_hook(FOLDER_ITEM_UPDATE_HOOKLIST, folderview_update_item, (gpointer) folderview);
 
        gtk_widget_show_all(scrolledwin);
 
@@ -769,6 +769,9 @@ static void folderview_scan_tree_func(Folder *folder, FolderItem *item,
        else if (folder->type == F_IMAP && folder->account &&
                 folder->account->recv_server)
                rootpath = folder->account->recv_server;
+       else if (folder->type == F_NEWS && folder->account &&
+                folder->account->nntp_server)
+               rootpath = folder->account->nntp_server;
        else
                return;
 
@@ -871,13 +874,14 @@ void folderview_rescan_all(void)
 }
 #endif
 
-void folderview_check_new(Folder *folder)
+gint folderview_check_new(Folder *folder)
 {
        GList *list;
        FolderItem *item;
        FolderView *folderview;
        GtkCTree *ctree;
        GtkCTreeNode *node;
+       gint new_msgs = 0;
 
        for (list = folderview_list; list != NULL; list = list->next) {
                folderview = (FolderView *)list->data;
@@ -901,6 +905,7 @@ void folderview_check_new(Folder *folder)
                                        break;
                        }
                        folderview_update_node(folderview, node);
+                       new_msgs += item->new;
                }
 
                gtk_widget_set_sensitive(folderview->ctree, TRUE);
@@ -909,6 +914,7 @@ void folderview_check_new(Folder *folder)
        }
 
        folder_write_list();
+       return new_msgs;
 }
 
 void folderview_check_new_all(void)
@@ -1255,29 +1261,32 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
 
        gtk_ctree_node_set_row_style(ctree, node, style);
 
-       item->need_update = FALSE;
-
        if ((node = gtkut_ctree_find_collapsed_parent(ctree, node)) != NULL)
                folderview_update_node(folderview, node);
 }
 
-void folderview_update_item(FolderItem *item, gboolean update_summary, gpointer data)
+gboolean folderview_update_item(gpointer source, gpointer data)
 {
+       FolderItemUpdateData *update_info = (FolderItemUpdateData *)source;
        FolderView *folderview = (FolderView *)data;
        GtkCTree *ctree;
        GtkCTreeNode *node;
 
-       g_return_if_fail(folderview != NULL);
-       g_return_if_fail(item != NULL);
+       g_return_val_if_fail(update_info != NULL, TRUE);
+       g_return_val_if_fail(update_info->item != NULL, TRUE);
+       g_return_val_if_fail(folderview != NULL, FALSE);
 
        ctree = GTK_CTREE(folderview->ctree);
 
-       node = gtk_ctree_find_by_row_data(ctree, NULL, item);
+       node = gtk_ctree_find_by_row_data(ctree, NULL, update_info->item);
        if (node) {
-               folderview_update_node(folderview, node);
-               if (update_summary && folderview->opened == node)
-                       summary_show(folderview->summaryview, item);
+               if (update_info->update_flags & F_ITEM_UPDATE_MSGCNT)
+                       folderview_update_node(folderview, node);
+               if ((update_info->update_flags & F_ITEM_UPDATE_CONTENT) && (folderview->opened == node))
+                       summary_show(folderview->summaryview, update_info->item);
        }
+       
+       return FALSE;
 }
 
 static gboolean folderview_gnode_func(GtkCTree *ctree, guint depth,
@@ -1845,12 +1854,6 @@ static void folderview_update_tree_cb(FolderView *folderview, guint action,
                folderview_check_new(item->folder);
        else
                folderview_rescan_tree(item->folder);
-       
-       if (folderview->opened) {
-               item = gtk_ctree_node_get_row_data(ctree, folderview->opened);
-               if (item)
-                       folder_update_item(item, TRUE);
-       }
 }
 
 void folderview_create_folder_node_recursive(FolderView *folderview, FolderItem *item)
@@ -2510,17 +2513,10 @@ static void folderview_property_cb(FolderView *folderview, guint action,
        g_return_if_fail(item != NULL);
        g_return_if_fail(item->folder != NULL);
 
-#if CLAWS
-       prefs_folder_item_create(folderview, item);
-#else
-       /*
-        * CLAWS: wait till Hiro has completed his stuff
-        */
        if (item->parent == NULL && item->folder->account)
                account_open(item->folder->account);
        else
-               prefs_folder_item_open(item);
-#endif 
+               prefs_folder_item_create(folderview, item);
 }
 
 static void folderview_recollapse_nodes(FolderView *folderview, GtkCTreeNode *node)
@@ -2580,7 +2576,9 @@ static void folderview_move_to(FolderView *folderview, FolderItem *from_folder,
        gtk_widget_set_sensitive(GTK_WIDGET(folderview->ctree), FALSE);
        inc_lock();
        main_window_cursor_wait(folderview->mainwin);
+       statusbar_verbosity_set(TRUE);
        if ((status = folder_item_move_to(from_folder, to_folder, &new_folder)) == F_MOVE_OK) {
+               statusbar_verbosity_set(FALSE);
                main_window_cursor_normal(folderview->mainwin);
                STATUSBAR_POP(folderview->mainwin);
                if (src_node)
@@ -2589,13 +2587,12 @@ static void folderview_move_to(FolderView *folderview, FolderItem *from_folder,
                        debug_print("can't remove src node: is null\n");
 
                folderview_create_folder_node_recursive(folderview, new_folder);
-               folder_update_item(from_parent, TRUE);
-               folder_update_item_recursive(new_folder, TRUE); 
                folderview_sort_folders(folderview, 
                        gtk_ctree_find_by_row_data(GTK_CTREE(folderview->ctree), 
                                NULL, new_folder->parent), new_folder->folder);
                folderview_select(folderview, new_folder);
        } else {
+               statusbar_verbosity_set(FALSE);         
                main_window_cursor_normal(folderview->mainwin);
                STATUSBAR_POP(folderview->mainwin);
                switch (status) {
@@ -2754,10 +2751,6 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
        } else {
                /* comes from folderview */
                char *source;
-               char *buf;
-               gint status;
-               GtkCTreeNode *src_node;
-               FolderItem *new_item, *src_parent;
                
                source = data->data + 17;
                if (gtk_clist_get_selection_info