* src/folder.c
[claws.git] / src / folder.c
index f96777f428c971d32f4cf1b3ebe9d6d0a685a9d6..de8a42c2c3236dc659bf9d9642989c80e6ed9f76 100644 (file)
@@ -47,7 +47,8 @@
 #include "scoring.h"
 #include "prefs_folder_item.h"
 #include "procheader.h"
-#include "statusbar.h"
+#include "hooks.h"
+#include "log.h"
 
 /* Dependecies to be removed ?! */
 #include "prefs_common.h"
@@ -1538,13 +1539,11 @@ FolderItem *folder_item_move_recursive (FolderItem *src, FolderItem *dest)
                MsgInfo * msginfo;
                cnt++;
                if (cnt%500)
-                       statusbar_print_all(_("Moving %s to %s (%d%%)..."), src->name, 
+                       log_message(_("Moving %s to %s (%d%%)...\n"), src->name, 
                                        new_item->path,
                                        100*cnt/g_slist_length(mlist));
                msginfo = (MsgInfo *) cur->data;
                folder_item_move_msg(new_item, msginfo);
-               if (cnt%500)
-                       statusbar_pop_all();
 
                procmsg_msginfo_free(msginfo);
        }
@@ -1590,8 +1589,8 @@ FolderItem *folder_item_move_recursive (FolderItem *src, FolderItem *dest)
 gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_item)
 {
        FolderItem *tmp = dest->parent;
-       char * src_identifier, * dst_identifier, * new_identifier;
-       char * phys_srcpath, * phys_dstpath;
+       gchar * src_identifier, * dst_identifier;
+       gchar * phys_srcpath, * phys_dstpath;
        GNode *src_node;
        
        while (tmp) {
@@ -1615,6 +1614,10 @@ gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_ite
                return F_MOVE_FAILED;
        }
 
+       if (src->folder != dest->folder) {
+               return F_MOVE_FAILED_DEST_OUTSIDE_MAILBOX;
+       }
+
        phys_srcpath = folder_item_get_path(src);
        phys_dstpath = g_strconcat(folder_item_get_path(dest),G_DIR_SEPARATOR_S,g_basename(phys_srcpath),NULL);
 
@@ -2726,74 +2729,24 @@ void folder_item_apply_processing(FolderItem *item)
 /*
  *  Callback handling for FolderItem content changes
  */
-GSList *folder_item_update_callbacks_list = NULL;
-gint   folder_item_update_callbacks_nextid = 0;
-
-struct FolderItemUpdateCallback
-{
-       gint                    id;
-       FolderItemUpdateFunc    func;
-       gpointer                data;
-};
-
-gint folder_item_update_callback_register(FolderItemUpdateFunc func, gpointer data)
-{
-       struct FolderItemUpdateCallback *callback;
-
-       g_return_val_if_fail(func != NULL, -1);
-
-       folder_item_update_callbacks_nextid++;
-
-       callback = g_new0(struct FolderItemUpdateCallback, 1);
-       callback->id = folder_item_update_callbacks_nextid;
-       callback->func = func;
-       callback->data = data;
-
-       folder_item_update_callbacks_list =
-               g_slist_append(folder_item_update_callbacks_list, callback);
-
-       return folder_item_update_callbacks_nextid;
-}
-
-void folder_item_update_callback_unregister(gint id)
-{
-       GSList *list, *next;
-
-       for (list = folder_item_update_callbacks_list; list != NULL; list = next) {
-               struct FolderItemUpdateCallback *callback;
-
-               next = list->next;
-
-               callback = list->data;
-               if (callback->id == id) {
-                       folder_item_update_callbacks_list =
-                               g_slist_remove(folder_item_update_callbacks_list, callback);
-                       g_free(callback);
-               }
-       }
-}
-
-static void folder_item_update_callback_execute(FolderItem *item, gboolean contentchange)
-{
-       GSList *list;
-
-       for (list = folder_item_update_callbacks_list; list != NULL; list = list->next) {
-               struct FolderItemUpdateCallback *callback;
-
-               callback = list->data;
-               callback->func(item, contentchange, callback->data);
-       }
-}
-
 void folder_update_item(FolderItem *item, gboolean contentchange)
 {
-       folder_item_update_callback_execute(item, contentchange);
+       FolderItemUpdateData source;
+       
+       source.item = item;
+       source.content_change = contentchange;
+       hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source);
 }
 
 static void folder_update_item_func(FolderItem *item, gpointer contentchange)
 {
+       FolderItemUpdateData source;
+
        if (item->need_update) {
-               folder_item_update_callback_execute(item, GPOINTER_TO_INT(contentchange));
+               source.item = item;
+               source.content_change = GPOINTER_TO_INT(contentchange);
+               hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source);
+
                item->need_update = FALSE;
        }
 }
@@ -2806,13 +2759,21 @@ void folder_update_items_when_required(gboolean contentchange)
 void folder_update_item_recursive(FolderItem *item, gboolean update_summary)
 {
        GNode *node = item->folder->node;       
+       FolderItemUpdateData source;
+
        node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
        node = node->children;
-       folder_item_update_callback_execute(item, update_summary);
+
+       source.item = item;
+       source.content_change = update_summary; 
+       hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source);
        while (node != NULL) {
                if (node && node->data) {
                        FolderItem *next_item = (FolderItem*) node->data;
-                       folder_item_update_callback_execute(next_item, update_summary);
+
+                       source.item = next_item;
+                       source.content_change = update_summary; 
+                       hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source);
                }
                node = node->next;
        }