0.9.4claws64
authorChristoph Hohmann <reboot@gmx.ch>
Fri, 5 Sep 2003 21:07:17 +0000 (21:07 +0000)
committerChristoph Hohmann <reboot@gmx.ch>
Fri, 5 Sep 2003 21:07:17 +0000 (21:07 +0000)
* src/folder.c
* src/messageview.[ch]
* src/procmsg.[ch]
* src/summaryview.c
        extend MSGINFO_UPDATE_HOOK to send delete notifications. Used
        by MessageView to clear it when the message is deleted. Should
        work even if messages are deleted in MainWindow or by
        processing.

ChangeLog.claws
configure.ac
src/folder.c
src/messageview.c
src/messageview.h
src/procmsg.c
src/procmsg.h
src/summaryview.c

index ed53f53..e97b968 100644 (file)
@@ -1,3 +1,14 @@
+2003-09-03 [christoph] 0.9.4claws64
+
+       * src/folder.c
+       * src/messageview.[ch]
+       * src/procmsg.[ch]
+       * src/summaryview.c
+               extend MSGINFO_UPDATE_HOOK to send delete notifications. Used
+               by MessageView to clear it when the message is deleted. Should
+               work even if messages are deleted in MainWindow or by
+               processing.
+
 2003-09-03 [alfons]    0.9.4claws63
 
        * src/messageview.c
index ab2ee62..d9a1daf 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=4
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=63
+EXTRA_VERSION=64
 if test $EXTRA_VERSION -eq 0; then
     VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws
 else
index 38fd83f..01ff936 100644 (file)
@@ -1671,6 +1671,8 @@ static void add_msginfo_to_cache(FolderItem *item, MsgInfo *newmsginfo, MsgInfo
 
 static void remove_msginfo_from_cache(FolderItem *item, MsgInfo *msginfo)
 {
+       MsgInfoUpdate msginfo_update;
+
        if (!item->cache)
                folder_item_read_cache(item);
 
@@ -1682,6 +1684,10 @@ static void remove_msginfo_from_cache(FolderItem *item, MsgInfo *msginfo)
                msginfo->folder->unreadmarked_msgs--;
        msginfo->folder->total_msgs--;
 
+       msginfo_update.msginfo = msginfo;
+       msginfo_update.flags = MSGINFO_UPDATE_DELETED;
+       hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
+
        msgcache_remove_msg(item->cache, msginfo->msgnum);
        folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT);
 }
index 11fead4..495efc6 100644 (file)
@@ -60,6 +60,7 @@
 #include "rfc2015.h"
 #include "send_message.h"
 #include "stock_pixmap.h"
+#include "hooks.h"
 
 static GList *messageview_list = NULL;
 
@@ -128,14 +129,11 @@ static void create_filter_cb              (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
 
-static void messageview_menubar_cb     (MessageView    *msgview,
-                                        guint           action, 
-                                        GtkWidget      *widget);
 static void about_cb                   (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
 static void messageview_update         (MessageView *msgview);
-static void messageview_update_all     (MessageView *msgview);
+static gboolean messageview_update_msg (gpointer source, gpointer data);
 
 static GList *msgview_list = NULL;
 static GtkItemFactoryEntry msgview_entries[] =
@@ -328,6 +326,8 @@ MessageView *messageview_create(MainWindow *mainwin)
        messageview->mimeview   = mimeview;
        messageview->noticeview = noticeview;
        messageview->mainwin    = mainwin;
+       messageview->msginfo_update_callback_id =
+               hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, messageview_update_msg, (gpointer) messageview);
 
        return messageview;
 }
@@ -736,6 +736,9 @@ void messageview_destroy(MessageView *messageview)
        debug_print("destroy messageview\n");
        messageview_list = g_list_remove(messageview_list, messageview);
 
+       hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST,
+                             messageview->msginfo_update_callback_id);
+
        headerview_destroy(messageview->headerview);
        textview_destroy(messageview->textview);
        mimeview_destroy(messageview->mimeview);
@@ -758,60 +761,19 @@ void messageview_destroy(MessageView *messageview)
 
 void messageview_delete(MessageView *msgview)
 {
-       MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
+       MsgInfo *msginfo = (MsgInfo *) msgview->msginfo;
        FolderItem *trash = folder_get_default_trash();
-       GSList *msg_list;
 
        g_return_if_fail(msginfo != NULL);
        g_return_if_fail(trash   != NULL);
-       
-       msg_list = folder_item_get_msg_list(msginfo->folder);
-       
-       if (msg_list == NULL) {
-               alertpanel_error(_("Message already removed from folder."));
-               return;
-       }
-       
-       for (; msg_list != NULL; msg_list = msg_list->next) {
-               MsgInfo *msginfo_list = (MsgInfo*)msg_list->data;
-               
-               if (msginfo->msgnum == msginfo_list->msgnum) {
-
-                       if (prefs_common.immediate_exec)
-                               folder_item_move_msg(trash, msginfo);
-                       else {
-                               procmsg_msginfo_set_to_folder(msginfo, trash);
-                               procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
-                               /* NOTE: does not update to next message in summaryview
-                                */
-                       }
-                               
-                       messageview_update_all(msgview);
-                       break;
-               }
-       }
-}
 
-/*     
- * scan List of MessageViews checking whether there are any Views holding messages 
- * which need to be updated (another view might have deleted the one this MessagView holds)
- */
-static void messageview_update_all(MessageView *msgview)
-{
-       MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
-       GList *cur;
-       
-       g_return_if_fail(msginfo != NULL);
-
-       for (cur = msgview_list; cur != NULL; cur = cur->next) {
-               MessageView *msgview = (MessageView*)cur->data;
-               MsgInfo *msginfo_list = (MsgInfo*)msgview->msginfo;
-               
-               g_return_if_fail(msginfo != NULL);
-               g_return_if_fail(msginfo_list);
-
-               if (msginfo->msgnum == msginfo_list->msgnum)
-                       messageview_update(msgview);
+       if (prefs_common.immediate_exec)
+               /* TODO: Delete from trash */
+               folder_item_move_msg(trash, msginfo);
+       else {
+               procmsg_msginfo_set_to_folder(msginfo, trash);
+               procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
+               /* NOTE: does not update to next message in summaryview */
        }
 }
 
@@ -1110,31 +1072,6 @@ gchar *messageview_get_selection(MessageView *msgview)
        return text;
 }
 
-static void messageview_delete_cb(MessageView *msgview, guint action, GtkWidget *widget)
-{
-       messageview_delete(msgview);
-}
-
-static void messageview_menubar_cb(MessageView *msgview, guint action, GtkWidget *widget)
-{
-       GSList *msginfo_list = NULL;
-       gchar *body;
-       MsgInfo *msginfo;
-
-       g_return_if_fail(msgview != NULL);
-
-       msginfo = (MsgInfo*)msgview->msginfo;
-       g_return_if_fail(msginfo != NULL);
-
-       msginfo_list = g_slist_append(msginfo_list, msginfo);
-       g_return_if_fail(msginfo_list);
-
-       body =  messageview_get_selection(msgview);
-       compose_reply_mode((ComposeMode)action, msginfo_list, body);
-       g_free(body);
-       g_slist_free(msginfo_list);
-}
-
 static void save_as_cb(gpointer data, guint action, GtkWidget *widget)
 {
        MessageView *messageview = (MessageView *)data;
@@ -1393,3 +1330,16 @@ static void about_cb(gpointer data, guint action, GtkWidget *widget)
 {
        about_show();
 }
+
+static gboolean messageview_update_msg(gpointer source, gpointer data)
+{
+       MsgInfoUpdate *msginfo_update = (MsgInfoUpdate *) source;
+       MessageView *messageview = (MessageView *)data;
+
+       if (msginfo_update->flags & MSGINFO_UPDATE_DELETED) {
+               messageview_clear(messageview);
+               messageview_update(messageview);
+       }
+
+       return FALSE;
+}
index 9308b91..6066352 100644 (file)
@@ -71,6 +71,8 @@ struct _MessageView
   
        /* From messageview_show */
        gboolean all_headers;
+    
+       gint msginfo_update_callback_id;
 };
 
 MessageView *messageview_create                        (MainWindow     *mainwin);
index ef9b947..6ebbb54 100644 (file)
@@ -1367,6 +1367,7 @@ void procmsg_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmp
                update_folder_msg_counts(item, msginfo, perm_flags_old);
 
                msginfo_update.msginfo = msginfo;
+               msginfo_update.flags = MSGINFO_UPDATE_FLAGS;
                hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
                folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
        }
@@ -1397,6 +1398,7 @@ void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgT
                update_folder_msg_counts(item, msginfo, perm_flags_old);
 
                msginfo_update.msginfo = msginfo;
+               msginfo_update.flags = MSGINFO_UPDATE_FLAGS;
                hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
                folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
        }
index 650b82d..0bc4169 100644 (file)
@@ -144,6 +144,11 @@ typedef guint32 MsgTmpFlags;
 #define MSGINFO_UPDATE_HOOKLIST "msginfo_update"
 #define MAIL_FILTERING_HOOKLIST "mail_filtering_hooklist"
 
+typedef enum {
+       MSGINFO_UPDATE_FLAGS = 1 << 0,
+       MSGINFO_UPDATE_DELETED = 1 << 1,
+} MsgInfoUpdateFlags;
+
 #include "folder.h"
 #include "procmime.h"
 #include "prefs_filtering.h"
@@ -206,6 +211,7 @@ struct _MsgFileInfo
 
 struct _MsgInfoUpdate {
        MsgInfo *msginfo;
+       MsgInfoUpdateFlags flags;
 };
 
 struct _MailFilteringData
index 71c9e84..575dafb 100644 (file)
@@ -5357,10 +5357,12 @@ static gboolean summary_update_msg(gpointer source, gpointer data)
        g_return_val_if_fail(msginfo_update != NULL, TRUE);
        g_return_val_if_fail(summaryview != NULL, FALSE);
 
-       node = gtk_ctree_find_by_row_data(GTK_CTREE(summaryview->ctree), NULL, msginfo_update->msginfo);
-       
-       if (node) 
-               summary_set_row_marks(summaryview, node);
+       if (msginfo_update->flags & MSGINFO_UPDATE_FLAGS) {
+               node = gtk_ctree_find_by_row_data(GTK_CTREE(summaryview->ctree), NULL, msginfo_update->msginfo);
+
+               if (node) 
+                       summary_set_row_marks(summaryview, node);
+       }
 
        return FALSE;
 }