PATCH: Folder MRU and DnD option



Hi,

 some minor code rework and cleanup (thanks, Peter!), consolidation of the
former three patches into one. This one should not give warnings with older
gcc versions and eliminates an ugly double loop.
This should be the final version of this patch.

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	Sat Aug 18 11:32:46 2001
+++ ./src/balsa-app.c	Thu Aug 16 21:07:36 2001
@@ -323,6 +323,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	Sat Aug 18 11:32:46 2001
+++ ./src/balsa-app.h	Thu Aug 16 21:07:36 2001
@@ -95,6 +95,8 @@
 #define DEFAULT_CHECK_SIG FALSE
 #define DEFAULT_CHECK_QUOTED FALSE
 
+/* Length of the folder MRU list */
+#define FOLDER_MRU_LENGTH	10
 
 enum {
     WHILERETR,
@@ -322,6 +324,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	Sat Aug 18 11:32:47 2001
+++ ./src/balsa-index.c	Sat Aug 18 11:36:25 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 {
@@ -450,12 +464,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;
@@ -490,7 +504,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);
 }
@@ -860,7 +874,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);
@@ -908,7 +922,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)
@@ -1332,7 +1346,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);
 
@@ -1543,7 +1557,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;
 
     
@@ -1764,7 +1778,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;
@@ -1882,10 +1896,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();
@@ -1942,9 +1957,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",
@@ -1978,9 +2013,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;
 }
@@ -2040,7 +2072,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;
 
 
@@ -2068,6 +2100,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);
 }
 
@@ -2266,5 +2300,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	Sat Aug 18 11:32:47 2001
+++ ./src/balsa-index.h	Thu Aug 16 21:07:36 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	Sat Aug 18 11:32:47 2001
+++ ./src/balsa-mblist.c	Thu Aug 16 21:07:36 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	Sat Aug 18 11:32:47 2001
+++ ./src/main-window.c	Thu Aug 16 21:14:01 2001
@@ -1264,6 +1264,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	Sat Aug 18 11:32:47 2001
+++ ./src/message-window.c	Sat Aug 18 11:38:50 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	Sat Aug 18 11:32:47 2001
+++ ./src/message-window.h	Thu Aug 16 21:07:36 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	Sat Aug 18 11:32:47 2001
+++ ./src/pref-manager.c	Thu Aug 16 21:07:36 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	Sat Aug 18 11:32:47 2001
+++ ./src/save-restore.c	Thu Aug 16 21:07:36 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);
@@ -547,6 +550,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 ... */
@@ -715,6 +720,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 */
 
@@ -800,6 +810,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();
 
@@ -940,6 +951,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 */
@@ -1163,4 +1179,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]