Re: pending patch



Hi,

On 2001.08.25 12:21 christophe barbe wrote:
> Is there a reason to not commit this patch ?
> Is there a more recent version of it ?

4 is the current version, there appears to be no need to make any changes, I
consider it final. The attached patch is updated fpr current CVS.

Melanie
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/balsa-app.c ./src/balsa-app.c
--- ../balsa-cvs/src/balsa-app.c	Sun Aug 19 19:02:51 2001
+++ ./src/balsa-app.c	Sun Aug 19 19:23:10 2001
@@ -324,6 +324,10 @@
     /* IMAP */
     balsa_app.check_imap = 1;
     balsa_app.check_imap_inbox = 0;
+
+	/* Message filing */
+	balsa_app.folder_mru=NULL;
+	balsa_app.drag_default_is_move=0;
 }
 
 static gint
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/balsa-app.h ./src/balsa-app.h
--- ../balsa-cvs/src/balsa-app.h	Sun Aug 19 19:02:51 2001
+++ ./src/balsa-app.h	Sun Aug 19 19:23:10 2001
@@ -96,6 +96,8 @@
 #define DEFAULT_CHECK_SIG FALSE
 #define DEFAULT_CHECK_QUOTED FALSE
 
+/* Length of the folder MRU list */
+#define FOLDER_MRU_LENGTH	10
 
 enum {
     WHILERETR,
@@ -323,6 +325,9 @@
     BalsaMDNReply mdn_reply_clean;
     BalsaMDNReply mdn_reply_notclean;
 #endif
+
+	GList *folder_mru;
+	gint drag_default_is_move;
 
 } balsa_app;
 
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/balsa-index.c ./src/balsa-index.c
--- ../balsa-cvs/src/balsa-index.c	Sun Aug 19 19:02:51 2001
+++ ./src/balsa-index.c	Sun Aug 19 19:23:10 2001
@@ -58,6 +58,16 @@
 #define DO_CLIST_WORKAROUND(s)
 #endif
 
+struct FolderMRUEntry
+{
+	gchar *name;
+	gchar *url;
+	LibBalsaMailbox *mailbox;
+	BalsaIndex *bindex;
+};
+
+static GList *mru_list=NULL;
+
 /* gtk widget */
 static void balsa_index_class_init(BalsaIndexClass * klass);
 static void balsa_index_init(BalsaIndex * bindex);
@@ -75,6 +85,7 @@
 /* statics */
 static void balsa_index_set_col_images(BalsaIndex *, GtkCTreeNode*,
 				       LibBalsaMessage *);
+static void populate_mru(GtkWidget *menu, BalsaIndex *bindex);
 
 /* mailbox callbacks */
 static void balsa_index_del (BalsaIndex * bindex, LibBalsaMessage * message);
@@ -104,6 +115,9 @@
 static void resize_column_event_cb(GtkCList * clist, gint column,
 				   gint width, gpointer data);
 
+/* Callbacks */
+static gint mru_search_cb(GNode *node, struct FolderMRUEntry *entry);
+static void mru_select_cb(GtkWidget *widget, struct FolderMRUEntry *entry);
 
 /* formerly balsa-index-page stuff */
 enum {
@@ -451,12 +465,12 @@
     return t2-t1;
 }
 
-/* bi_get_largest_selected:
+/* balsa_index_get_largest_selected:
    helper function, finds the message with largest number among selected and
    fails with -1, if the selection is empty.
 */
-static gint
-bi_get_largest_selected(GtkCList * clist)
+gint
+balsa_index_get_largest_selected(GtkCList * clist)
 {
     GList *list;
     gint i = 0;
@@ -491,7 +505,7 @@
     gtk_clist_sort(clist);
     DO_CLIST_WORKAROUND(clist);
 
-    if ((h = bi_get_largest_selected(clist)) >= 0 &&
+    if ((h = balsa_index_get_largest_selected(clist)) >= 0 &&
 	gtk_clist_row_is_visible(clist, h) != GTK_VISIBILITY_FULL)
 	gtk_clist_moveto(clist, h, 0, 1.0, 0.0);
 }
@@ -861,7 +875,7 @@
     clist = GTK_CLIST(bindex->ctree);
 
     /* [MBG] check this part, it might need to be h - 2 instead */
-    if ((h = bi_get_largest_selected(clist)) < 0 || h + 1 >= clist->rows)
+    if ((h = balsa_index_get_largest_selected(clist)) < 0 || h + 1 >= clist->rows)
 	h = clist->rows - 1;
 
     balsa_index_select_row(bindex, h + 1);
@@ -909,7 +923,7 @@
     g_return_if_fail(bindex != NULL);
     clist = GTK_CLIST(bindex->ctree);
 
-    if ((h = bi_get_largest_selected(clist) + 1) <= 0)
+    if ((h = balsa_index_get_largest_selected(clist) + 1) <= 0)
 	h = 0;
 
     if (h >= clist->rows)
@@ -1337,7 +1351,7 @@
     gtk_clist_freeze(clist);
 
     old_message = 
-        gtk_clist_get_row_data(clist, bi_get_largest_selected(clist));
+        gtk_clist_get_row_data(clist, balsa_index_get_largest_selected(clist));
     gtk_clist_unselect_all(clist);
     gtk_clist_clear(clist);
 
@@ -1548,7 +1562,7 @@
 
     /* select the previous message if we're at the bottom of the index */
     if (GTK_CLIST(index->ctree)->rows - 1 == 
-        bi_get_largest_selected(GTK_CLIST(index->ctree)))
+        balsa_index_get_largest_selected(GTK_CLIST(index->ctree)))
         select_next = FALSE;
 
     
@@ -1769,7 +1783,7 @@
     GtkCList *list;
 
     list = GTK_CLIST(index->ctree);
-    row = bi_get_largest_selected (list);
+    row = balsa_index_get_largest_selected (list);
 
     if (row < 0)
 	message = NULL;
@@ -1887,10 +1901,11 @@
 static GtkWidget *
 create_menu(BalsaIndex * bindex)
 {
-    GtkWidget *menu, *menuitem, *submenu, *smenuitem;
+    GtkWidget *menu, *menuitem, *submenu, *smenuitem, *mrumenu, *mruitem;
     GtkWidget *bmbl, *scroll;
     GtkRequisition req;
     LibBalsaMailbox* mailbox;
+	GList *tmp;
     
 
     BALSA_DEBUG();
@@ -1947,9 +1962,29 @@
 
     gtk_menu_append(GTK_MENU(menu), menuitem);
     
-    menuitem = gtk_menu_item_new_with_label(_("Transfer"));
+	for(tmp=mru_list;tmp != NULL;tmp=g_list_next(tmp))
+		g_free(tmp->data);
+	g_list_free(mru_list);
+	mru_list=NULL;
+
+    menuitem = gtk_menu_item_new_with_label(_("Move"));
     gtk_widget_set_sensitive(menuitem, !mailbox->readonly);
+    gtk_menu_append(GTK_MENU(menu), menuitem);
+    gtk_widget_show(menuitem);
+
+	mrumenu = gtk_menu_new();
+	gtk_widget_show(mrumenu);
+    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), mrumenu);
+
+	populate_mru(mrumenu, bindex);
+
+	mruitem = gtk_menu_item_new_with_label(_("Folder"));
+	gtk_widget_show(mruitem);
+
+	gtk_menu_append(GTK_MENU(mrumenu), mruitem);
+
     submenu = gtk_menu_new();
+    gtk_menu_item_set_submenu(GTK_MENU_ITEM(mruitem), submenu);
 
     smenuitem = gtk_menu_item_new();
     gtk_signal_connect (GTK_OBJECT(smenuitem), "button_release_event",
@@ -1983,9 +2018,6 @@
     gtk_widget_show(scroll);
     gtk_widget_show(smenuitem);
 
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
-    gtk_menu_append(GTK_MENU(menu), menuitem);
-    gtk_widget_show(menuitem);
 
     return menu;
 }
@@ -2045,7 +2077,7 @@
 	return;
 
     /* select the previous message if we're at the bottom of the index */
-    if (clist->rows - 1 == bi_get_largest_selected(clist))
+    if (clist->rows - 1 == balsa_index_get_largest_selected(clist))
         select_next = FALSE;
 
 
@@ -2073,6 +2105,8 @@
 
     libbalsa_mailbox_sync_backend(bindex->mailbox_node->mailbox);
 
+	balsa_remove_from_folder_mru(mbnode->mailbox->url);
+	balsa_add_to_folder_mru(mbnode->mailbox->url);
     gtk_object_set_data(GTK_OBJECT(bindex), "transferredp", (gpointer) 1);
 }
 
@@ -2271,5 +2305,119 @@
 	    j++;
 	}
     }
+}
+
+static gint
+mru_search_cb(GNode *gnode, struct FolderMRUEntry *entry)
+{
+    BalsaMailboxNode *node;
+
+    node=gnode->data;
+    if(!node || !BALSA_IS_MAILBOX_NODE(node))
+        return(FALSE);
+
+    if(!node->mailbox)
+        return(FALSE);
+
+    if(!strcmp(LIBBALSA_MAILBOX(node->mailbox)->url, entry->url)) {
+        entry->url=LIBBALSA_MAILBOX(node->mailbox)->url;
+        entry->name=LIBBALSA_MAILBOX(node->mailbox)->name;
+        entry->mailbox=LIBBALSA_MAILBOX(node->mailbox);
+        return(TRUE);
+    }
+
+    return(FALSE);
+}
+
+static void
+populate_mru(GtkWidget * menu, BalsaIndex * bindex)
+{
+    struct FolderMRUEntry *mru_entry;
+    GList *mru, *tmp;
+    GtkWidget *item;
+
+    mru = balsa_app.folder_mru;
+    while (mru) {
+        mru_entry = g_malloc(sizeof(struct FolderMRUEntry));
+        if (!mru_entry)
+            return;
+
+        mru_entry->url = mru->data;
+        mru_entry->mailbox = NULL;
+        mru_entry->bindex = bindex;
+        g_node_traverse(balsa_app.mailbox_nodes, G_IN_ORDER,
+                        G_TRAVERSE_ALL, -1,
+                        (gint(*)(GNode *, gpointer)) mru_search_cb,
+                        mru_entry);
+        if (mru_entry->mailbox == NULL) {
+            g_free(mru_entry);
+            tmp = g_list_next(mru);
+            g_free(mru->data);
+            balsa_app.folder_mru =
+                g_list_remove(balsa_app.folder_mru, mru->data);
+            mru = tmp;
+        } else {
+            mru_list = g_list_append(mru_list, mru_entry);
+            item = gtk_menu_item_new_with_label(mru_entry->name);
+            gtk_widget_show(item);
+            gtk_menu_append(GTK_MENU(menu), item);
+            gtk_signal_connect(GTK_OBJECT(item), "activate",
+                               GTK_SIGNAL_FUNC(mru_select_cb), mru_entry);
+            mru = g_list_next(mru);
+        }
+    }
+}
+
+static void
+mru_select_cb(GtkWidget *widget, struct FolderMRUEntry *entry)
+{
+    GtkCList* clist;
+    BalsaIndex* bindex = NULL;
+    GList *list, *messages;
+    LibBalsaMessage* message;
+    gboolean select_next = TRUE;
+    gint message_count = 0;
+
+    g_return_if_fail(entry != NULL);
+
+    bindex = entry->bindex;
+    clist = GTK_CLIST(bindex->ctree);
+
+   /*Transferring to same mailbox? */
+    if (bindex->mailbox_node->mailbox == entry->mailbox)
+	return;
+
+    /* select the previous message if we're at the bottom of the index */
+    if (clist->rows - 1 == balsa_index_get_largest_selected(clist))
+        select_next = FALSE;
+
+
+    messages=NULL;
+    for (list = clist->selection; list;list = list->next) {
+	message = gtk_ctree_node_get_row_data(GTK_CTREE(bindex->ctree), 
+					      list->data);
+	messages=g_list_append(messages, message);
+	++message_count;
+    }
+
+    if(messages!=NULL) {
+	libbalsa_messages_move(messages, entry->mailbox);
+	g_list_free(messages);
+    }
+   
+    /* select another message depending on where we are in the list */
+    if (clist->rows > message_count) {
+        if (select_next)
+            balsa_index_select_next(bindex);
+        else
+            balsa_index_select_previous(bindex);
+    }
+
+
+    libbalsa_mailbox_sync_backend(bindex->mailbox_node->mailbox);
+
+	balsa_remove_from_folder_mru(entry->mailbox->url);
+	balsa_add_to_folder_mru(entry->mailbox->url);
+    gtk_object_set_data(GTK_OBJECT(bindex), "transferredp", (gpointer) 1);
 }
 
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/balsa-index.h ./src/balsa-index.h
--- ../balsa-cvs/src/balsa-index.h	Sun Aug 19 19:02:51 2001
+++ ./src/balsa-index.h	Sun Aug 19 19:23:10 2001
@@ -132,6 +132,7 @@
 				   gint, gpointer);
     void balsa_index_refresh_size (GtkNotebook *, GtkNotebookPage *,
 				   gint, gpointer);
+	gint balsa_index_get_largest_selected(GtkCList *clist);
 #ifdef __cplusplus
 }
 #endif				/* __cplusplus */
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/balsa-mblist.c ./src/balsa-mblist.c
--- ../balsa-cvs/src/balsa-mblist.c	Sun Aug 19 19:22:06 2001
+++ ./src/balsa-mblist.c	Sun Aug 19 19:23:10 2001
@@ -143,8 +143,16 @@
 balsa_mblist_destroy(GtkObject * obj)
 {
     BalsaMBList *del;
+    GtkCTree *ctree;
 
     del = BALSA_MBLIST(obj);
+
+    ctree = GTK_CTREE(del);
+
+    gtk_ctree_post_recursive(GTK_CTREE(del), NULL,
+			     balsa_mblist_disconnect_mailbox_signals,
+			     NULL); 
+
     /* chain up ... */
     if (GTK_OBJECT_CLASS(parent_class)->destroy)
 	(*GTK_OBJECT_CLASS(parent_class)->destroy) (GTK_OBJECT(del));
@@ -1516,17 +1524,15 @@
 
         /* cannot transfer to the originating mailbox */
         if (mailbox != orig_mailbox) {
-            switch (context->suggested_action) {
+            switch (context->action) {
             case GDK_ACTION_MOVE:
                 libbalsa_messages_move (messages, mailbox);
-                context->action = context->suggested_action;
                 break;
 
             case GDK_ACTION_DEFAULT:
             case GDK_ACTION_COPY:
             default:
                 libbalsa_messages_copy (messages, mailbox);
-		context->action = context->suggested_action;
                 break;
             }
             
@@ -1567,5 +1573,11 @@
 					   NULL);
     }
 #endif
+	if(balsa_app.drag_default_is_move) {
+		if(context->actions == GDK_ACTION_COPY)
+			gdk_drag_status(context, GDK_ACTION_COPY, time);
+		else
+			gdk_drag_status(context, GDK_ACTION_MOVE, time);
+	}
     return FALSE;
 }
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/main-window.c ./src/main-window.c
--- ../balsa-cvs/src/main-window.c	Sun Aug 19 19:22:06 2001
+++ ./src/main-window.c	Sun Aug 19 19:23:11 2001
@@ -1267,6 +1267,9 @@
 
     window = BALSA_WINDOW(object);
 
+	if(show_all_headers_save != -1)
+		balsa_app.shown_headers=show_all_headers_save;
+
     if (GTK_OBJECT_CLASS(parent_class)->destroy)
 	(*GTK_OBJECT_CLASS(parent_class)->destroy) (GTK_OBJECT(object));
 
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/message-window.c ./src/message-window.c
--- ../balsa-cvs/src/message-window.c	Sun Aug 19 19:02:51 2001
+++ ./src/message-window.c	Sun Aug 19 19:23:11 2001
@@ -25,14 +25,24 @@
 #include "balsa-app.h"
 #include "balsa-message.h"
 #include "balsa-icons.h"
+#include "balsa-index.h"
 #include "main-window.h"
 #include "sendmsg-window.h"
 #include "message-window.h"
 #include "print.h"
 #include "toolbar-factory.h"
+#include "mailbox-node.h"
 
 #include "libbalsa.h"
 
+struct BalsaMRUEntry
+{
+	LibBalsaMailbox *mailbox;
+	gchar *url;
+	char *name;
+	gpointer mw;
+};
+
 /* callbacks */
 static void destroy_message_window(GtkWidget * widget, gpointer data);
 static void close_message_window(GtkWidget * widget, gpointer data);
@@ -60,6 +70,9 @@
 static void print_cb(GtkWidget * widget, gpointer);
 static void trash_cb(GtkWidget * widget, gpointer);
 
+static gint find_url_cb(GNode *node, struct BalsaMRUEntry *data);
+static void mru_select_cb(GtkWidget *widget, struct BalsaMRUEntry *entry);
+
 /*
  * The list of messages which are being displayed.
  */
@@ -140,10 +153,16 @@
     GNOMEUIINFO_END
 };
 
+static GnomeUIInfo move_menu[]={
+	GNOMEUIINFO_END
+};
+
 static GnomeUIInfo main_menu[] = {
     GNOMEUIINFO_MENU_FILE_TREE(file_menu),
     GNOMEUIINFO_MENU_EDIT_TREE(edit_menu),
     GNOMEUIINFO_MENU_VIEW_TREE(view_menu),
+#define MAIN_MENU_MOVE_POS 3
+    GNOMEUIINFO_SUBTREE("M_ove", move_menu),
     GNOMEUIINFO_SUBTREE("_Message", message_menu),
     GNOMEUIINFO_END
 };
@@ -157,9 +176,18 @@
     LibBalsaMessage *message;
     int show_all_headers_save;
 	int headers_shown;
+	GtkWidget *move_menu;
+	gint transferred;
+	GList *mru_list;
 };
 
 void reset_show_all_headers(MessageWindow *mw);
+static void populate_move_menu(MessageWindow *mw);
+static gint close_if_transferred_cb(BalsaMBList * bmbl, GdkEvent * event,
+            MessageWindow * mw);
+static void transfer_message_cb(GtkCTree * ctree, GtkCTreeNode * row,
+			 gint column, MessageWindow * mw);
+static void load_mru(MessageWindow * mw);
 
 void
 message_window_new(LibBalsaMessage * message)
@@ -200,6 +228,8 @@
 
     mw->message = message;
 
+	mw->mru_list=NULL;
+
     mw->window = gnome_app_new("balsa", "Message");
 
     mw->show_all_headers_save=-1;
@@ -244,6 +274,9 @@
 		       GTK_SIGNAL_FUNC(destroy_message_window), mw);
     
     gnome_app_create_menus_with_data(GNOME_APP(mw->window), main_menu, mw);
+	mw->move_menu=main_menu[MAIN_MENU_MOVE_POS].widget;
+    
+	populate_move_menu(mw);
     
     scroll = gtk_scrolled_window_new(NULL, NULL);
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
@@ -251,6 +284,7 @@
 				   GTK_POLICY_AUTOMATIC);
 
     mw->bmessage = balsa_message_new();
+	mw->transferred=0;
 
     gtk_signal_connect(GTK_OBJECT(mw->bmessage), "select-part",
 		       GTK_SIGNAL_FUNC(select_part_cb), mw);
@@ -299,6 +333,8 @@
 static void
 destroy_message_window(GtkWidget * widget, gpointer data)
 {
+	GList *tmp;
+
     MessageWindow *mw = (MessageWindow *) data;
 
     release_toolbars(mw->window);
@@ -307,6 +343,12 @@
     gtk_widget_destroy(mw->window);
     gtk_widget_destroy(mw->bmessage);
 
+	if(mw->mru_list) {
+		for(tmp=mw->mru_list;tmp;tmp=g_list_next(tmp))
+			g_free(tmp->data);
+		g_list_free(mw->mru_list);
+	}
+
     g_free(mw);
 }
 
@@ -583,3 +625,261 @@
     if(btn)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btn), FALSE);
 }
+
+static void populate_move_menu(MessageWindow *mw)
+{
+	GtkWidget *item;
+	GtkWidget *scroller;
+	GtkWidget *bmbl;
+	GtkWidget *submenu, *smenuitem;
+	GtkRequisition req;
+
+	if(mw->message->mailbox->readonly)
+	{
+		gtk_widget_set_sensitive(mw->move_menu, FALSE);
+		return;
+	}
+
+	/* Load Folder MRU */
+	load_mru(mw);
+
+	item=gtk_menu_item_new();
+	gtk_menu_append(GTK_MENU(GTK_MENU_ITEM(mw->move_menu)->submenu), item);
+	gtk_widget_show(item);
+
+	/* Create standard entry */
+	item=gtk_menu_item_new_with_label(_("Folder"));
+
+	gtk_menu_append(GTK_MENU(GTK_MENU_ITEM(mw->move_menu)->submenu), item);
+	gtk_widget_show(item);
+
+	submenu=gtk_menu_new();
+	smenuitem=gtk_menu_item_new();
+
+	scroller=gtk_scrolled_window_new(NULL, NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroller),
+                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    bmbl = balsa_mblist_new();
+
+    gtk_widget_size_request(bmbl, &req);
+
+    if ( req.height > balsa_app.mw_height )
+    req.height = balsa_app.mw_height;
+
+    req.width=balsa_app.mblist_width;
+    gtk_widget_set_usize(GTK_WIDGET(bmbl), req.width, req.height);
+
+    gtk_container_add(GTK_CONTAINER(scroller), bmbl);
+    gtk_container_add(GTK_CONTAINER(smenuitem), scroller);
+
+    gtk_menu_append(GTK_MENU(submenu), smenuitem);
+    gtk_widget_show(bmbl);
+    gtk_widget_show(scroller);
+    gtk_widget_show(smenuitem);
+	gtk_widget_show(submenu);
+
+	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+
+    gtk_signal_connect (GTK_OBJECT(smenuitem), "button_release_event",
+                        (GtkSignalFunc) close_if_transferred_cb,
+                        (gpointer) mw);
+
+    gtk_signal_connect(GTK_OBJECT(bmbl), "tree_select_row",
+               (GtkSignalFunc) transfer_message_cb,
+               (gpointer) mw);
+
+
+}
+
+static gint
+close_if_transferred_cb(BalsaMBList * bmbl, GdkEvent * event,
+            MessageWindow * mw)
+{
+    if (mw->transferred) {
+        return FALSE;
+    } else {
+        return TRUE;
+    }
+}
+
+static void
+transfer_message_cb(GtkCTree * ctree, GtkCTreeNode * row, gint column,
+			 MessageWindow * mw)
+{
+    GtkCList* clist=NULL;
+    BalsaIndex* bindex = NULL;
+    BalsaMailboxNode *mbnode;
+    gboolean select_next = TRUE;
+
+    g_return_if_fail(mw != NULL);
+
+    bindex = balsa_find_index_by_mailbox(mw->message->mailbox);
+
+    mbnode = gtk_ctree_node_get_row_data(ctree, row);
+
+    if(mbnode->mailbox == NULL) return;
+
+   /*Transferring to same mailbox? */
+    if (mw->message->mailbox == mbnode->mailbox)
+    return;
+
+	if(bindex != NULL && bindex->ctree != NULL) {
+		clist = GTK_CLIST(bindex->ctree);
+
+		/* select the previous message if we're at the bottom of the index */
+		if (clist->rows - 1 == balsa_index_get_largest_selected(clist))
+			select_next = FALSE;
+	}
+
+	mw->transferred=1;
+	libbalsa_message_move(mw->message, mbnode->mailbox);
+
+	if(bindex != NULL && bindex->ctree != NULL) {
+		/* select another message depending on where we are in the list */
+		if (clist->rows > 1) {
+			if (select_next)
+				balsa_index_select_next(bindex);
+			else
+				balsa_index_select_previous(bindex);
+		}
+		libbalsa_mailbox_sync_backend(bindex->mailbox_node->mailbox);
+	}
+
+	balsa_remove_from_folder_mru(mbnode->mailbox->url);
+	balsa_add_to_folder_mru(mbnode->mailbox->url);
+
+	close_message_window(NULL, (gpointer) mw);
+}
+
+static gint
+find_url_cb(GNode *gnode, struct BalsaMRUEntry *data)
+{
+	BalsaMailboxNode *node;
+
+	node=gnode->data;
+	if(!node || !BALSA_IS_MAILBOX_NODE(node))
+		return(FALSE);
+
+	if(!node->mailbox)
+		return(FALSE);
+
+	if(!strcmp(LIBBALSA_MAILBOX(node->mailbox)->url, data->url)) {
+		data->url=LIBBALSA_MAILBOX(node->mailbox)->url;
+		data->name=LIBBALSA_MAILBOX(node->mailbox)->name;
+		data->mailbox=LIBBALSA_MAILBOX(node->mailbox);
+		return(TRUE);
+	}
+	
+	return(FALSE);
+}
+
+static void
+load_mru(MessageWindow * mw)
+{
+	GList *mru;
+	GList *tmp;
+	struct BalsaMRUEntry *mru_entry;
+	GtkWidget *item;
+
+	mru=balsa_app.folder_mru;
+	while(mru != NULL) {
+		mru_entry=g_malloc(sizeof(struct BalsaMRUEntry));
+		if(!mru_entry)
+			return;
+
+		mru_entry->url=mru->data;
+		mru_entry->mailbox=NULL;
+		mru_entry->mw=mw;
+		g_node_traverse(balsa_app.mailbox_nodes, G_IN_ORDER, G_TRAVERSE_ALL,
+			-1, (gint (*)(GNode *, gpointer))find_url_cb, mru_entry);
+		if(mru_entry->mailbox == NULL) {
+			g_free(mru_entry);
+			tmp=g_list_next(mru);
+			g_free(mru->data);
+			balsa_app.folder_mru=g_list_remove(balsa_app.folder_mru,
+					mru->data);
+			mru=tmp;
+			continue;
+		}
+
+		if(!mru)
+			break;
+
+		mw->mru_list=g_list_append(mw->mru_list, mru_entry);
+		item=gtk_menu_item_new_with_label(mru_entry->name);
+		gtk_widget_show(item);
+		gtk_menu_append(GTK_MENU(GTK_MENU_ITEM(mw->move_menu)->submenu), item);
+		gtk_signal_connect(GTK_OBJECT(item), "activate",
+				GTK_SIGNAL_FUNC(mru_select_cb), mru_entry);
+		mru=g_list_next(mru);
+	}
+}
+
+static void
+mru_select_cb(GtkWidget *widget, struct BalsaMRUEntry *entry)
+{
+	MessageWindow *mw=entry->mw;
+
+	LibBalsaMailbox *mailbox=entry->mailbox;
+
+    GtkCList* clist=NULL;
+    BalsaIndex* bindex = NULL;
+    gboolean select_next = TRUE;
+
+    bindex = balsa_find_index_by_mailbox(mw->message->mailbox);
+
+   /*Transferring to same mailbox? */
+    if (mw->message->mailbox == mailbox)
+    return;
+
+	if(bindex != NULL && bindex->ctree != NULL) {
+		clist = GTK_CLIST(bindex->ctree);
+
+		/* select the previous message if we're at the bottom of the index */
+		if (clist->rows - 1 == balsa_index_get_largest_selected(clist))
+			select_next = FALSE;
+	}
+
+	mw->transferred=1;
+	libbalsa_message_move(mw->message, mailbox);
+
+	if(bindex != NULL && bindex->ctree != NULL) {
+		/* select another message depending on where we are in the list */
+		if (clist->rows > 1) {
+			if (select_next)
+				balsa_index_select_next(bindex);
+			else
+				balsa_index_select_previous(bindex);
+		}
+		libbalsa_mailbox_sync_backend(bindex->mailbox_node->mailbox);
+	}
+
+	balsa_remove_from_folder_mru(mailbox->url);
+	balsa_add_to_folder_mru(mailbox->url);
+
+	close_message_window(NULL, (gpointer) mw);
+}
+
+void
+balsa_add_to_folder_mru(gchar *url)
+{
+	if(g_list_length(balsa_app.folder_mru) >= FOLDER_MRU_LENGTH)
+		balsa_app.folder_mru=g_list_remove(balsa_app.folder_mru,
+				g_list_last(balsa_app.folder_mru)->data);
+	balsa_app.folder_mru=g_list_prepend(balsa_app.folder_mru, g_strdup(url));
+}
+
+void
+balsa_remove_from_folder_mru(gchar *url)
+{
+	GList *tmp;
+
+	for(tmp=balsa_app.folder_mru;tmp != NULL;tmp=g_list_next(tmp)) {
+		if(!strcmp((char *)tmp->data, url)) {
+			g_free(tmp->data);
+			balsa_app.folder_mru=g_list_remove(balsa_app.folder_mru, tmp->data);
+			break;
+		}
+	}
+}
+
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/message-window.h ./src/message-window.h
--- ../balsa-cvs/src/message-window.h	Sun Aug 19 19:02:51 2001
+++ ./src/message-window.h	Sun Aug 19 19:23:11 2001
@@ -25,5 +25,7 @@
 #include "libbalsa.h"
 
 void message_window_new(LibBalsaMessage * message);
+void balsa_remove_from_folder_mru(gchar *url);
+void balsa_add_to_folder_mru(gchar *url);
 
 #endif				/* __MESSAGE_WINDOW_H__ */
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/pref-manager.c ./src/pref-manager.c
--- ../balsa-cvs/src/pref-manager.c	Sun Aug 19 19:02:51 2001
+++ ./src/pref-manager.c	Sun Aug 19 19:23:11 2001
@@ -63,6 +63,7 @@
 #endif
 
     GtkWidget *close_mailbox_auto;
+	GtkWidget *drag_default_is_move;
     GtkWidget *close_mailbox_minutes;
 
     GtkWidget *previewpane;
@@ -349,6 +350,9 @@
     gtk_signal_connect(GTK_OBJECT(pui->close_mailbox_auto), "toggled",
 		       GTK_SIGNAL_FUNC(mailbox_timer_modified_cb), property_box);
 
+    gtk_signal_connect(GTK_OBJECT(pui->drag_default_is_move), "toggled",
+		       GTK_SIGNAL_FUNC(properties_modified_cb), property_box);
+
     gtk_signal_connect(GTK_OBJECT(pui->close_mailbox_minutes), "changed",
 		       GTK_SIGNAL_FUNC(mailbox_timer_modified_cb), property_box);
 
@@ -566,6 +570,8 @@
 
     balsa_app.close_mailbox_auto =
 	GTK_TOGGLE_BUTTON(pui->close_mailbox_auto)->active;
+	balsa_app.drag_default_is_move =
+	GTK_TOGGLE_BUTTON(pui->drag_default_is_move)->active;
     balsa_app.close_mailbox_timeout =
 	gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON
 					 (pui->close_mailbox_minutes));
@@ -766,6 +772,8 @@
 
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->close_mailbox_auto),
 				 balsa_app.close_mailbox_auto);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pui->drag_default_is_move),
+				 balsa_app.drag_default_is_move);
     gtk_spin_button_set_value(GTK_SPIN_BUTTON(pui->close_mailbox_minutes),
 			      (float) balsa_app.close_mailbox_timeout);
 
@@ -1862,6 +1870,11 @@
     label33 = gtk_label_new(_("minutes"));
     gtk_widget_show(label33);
     gtk_box_pack_start(GTK_BOX(hbox1), label33, FALSE, TRUE, 0);
+
+    pui->drag_default_is_move =
+	gtk_check_button_new_with_label(_("Drag-and-drop moves messages by default"));
+    gtk_widget_show(pui->drag_default_is_move);
+    gtk_box_pack_start(GTK_BOX(vbox10), pui->drag_default_is_move, FALSE, FALSE, 0);
 
     return vbox9;
 }
diff -b -B -r -u -P --exclude-from=ignore ../balsa-cvs/src/save-restore.c ./src/save-restore.c
--- ../balsa-cvs/src/save-restore.c	Sun Aug 19 19:02:51 2001
+++ ./src/save-restore.c	Sun Aug 19 19:23:11 2001
@@ -26,6 +26,7 @@
 #include "save-restore.h"
 #include "quote-color.h"
 #include "toolbar-prefs.h"
+#include "balsa-message.h"
 
 #define BALSA_CONFIG_PREFIX "balsa/"
 #define FOLDER_SECTION_PREFIX "folder-"
@@ -43,6 +44,8 @@
 static gchar **mailbox_list_to_vector(GList * mailbox_list);
 static void save_color(gchar * key, GdkColor * color);
 static void load_color(gchar * key, GdkColor * color);
+static void save_mru(GList *mru);
+static void load_mru(GList **mru);
 
 static void config_address_books_load(void);
 static void config_address_books_save(void);
@@ -549,6 +552,8 @@
     /* ... Progress Window Dialog */
     balsa_app.pwindow_option = d_get_gint("ProgressWindow", WHILERETR);
 
+	balsa_app.drag_default_is_move = d_get_gint("DragDefaultIsMove", 0);
+
     gnome_config_pop_prefix();
 
     /* Printing options ... */
@@ -717,6 +722,11 @@
     balsa_app.save_dir = gnome_config_get_string("SavePartDir");
     gnome_config_pop_prefix();
 
+	/* Folder MRU */
+    gnome_config_push_prefix(BALSA_CONFIG_PREFIX "FolderMRU/");
+	load_mru(&balsa_app.folder_mru);
+    gnome_config_pop_prefix();
+
     return TRUE;
 }				/* config_global_load */
 
@@ -803,6 +813,7 @@
     gnome_config_set_bool("MsgSizeAsLines", balsa_app.line_length);
     gnome_config_set_bool("PageDownMod", balsa_app.pgdownmod);
     gnome_config_set_int("PageDownPercent", balsa_app.pgdown_percent);
+	gnome_config_set_int("DragDefaultIsMove", balsa_app.drag_default_is_move);
 
     gnome_config_pop_prefix();
 
@@ -943,6 +954,11 @@
 	gnome_config_set_string("SavePartDir", balsa_app.save_dir);
     gnome_config_pop_prefix();
 
+	
+    gnome_config_push_prefix(BALSA_CONFIG_PREFIX "FolderMRU/");
+	save_mru(balsa_app.folder_mru);
+    gnome_config_pop_prefix();
+
     gnome_config_sync();
     return TRUE;
 }				/* config_global_save */
@@ -1166,4 +1182,33 @@
     str = gnome_config_get_string(key);
     gdk_color_parse(str, color);
     g_free(str);
+}
+
+void
+load_mru(GList **mru)
+{
+	int count, i;
+	char tmpkey[32];
+
+	count=d_get_gint("MRUCount", 0);
+	for(i=0;i<count;i++)
+	{
+		sprintf(tmpkey, "MRU%d", i+1);
+		(*mru)=g_list_append((*mru), gnome_config_get_string(tmpkey));
+	}
+}
+
+void
+save_mru(GList *mru)
+{
+	int i;
+	char tmpkey[32];
+	GList *ltmp;
+
+	for(ltmp=g_list_first(balsa_app.folder_mru),i=0;ltmp != NULL;ltmp=g_list_next(ltmp),i++)
+	{
+		sprintf(tmpkey, "MRU%d", i+1);
+		gnome_config_set_string(tmpkey, (gchar *)(ltmp->data));
+	}
+	gnome_config_set_int("MRUCount", i);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]