Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
retrieving revision 1.1520
diff -u -r1.1520 ChangeLog
--- ChangeLog	2001/08/09 19:24:06	1.1520
+++ ChangeLog	2001/08/09 20:35:57
@@ -1,3 +1,43 @@
+2001-08-09  Peter Williams  <peterw@ximian.com>
+
+	Fix bug #215... desensitize menu items based on the number of
+	selected messages (and whether there's a message in the pane)
+
+	* folder-browser-ui.c (folder_browser_ui_add_message): Sensitize
+	the menu items appropriately based on the old state.
+	(fbui_sensitize_items): New function. Set the sensitivity of a
+	list of commands.
+	(folder_browser_ui_set_selection_state): New function. Move the FB
+	to a new state of selected-ness, and sensitize menu items
+	appropriately.
+	(folder_browser_ui_message_loaded): New function. When notified
+	that a message has been loaded, sensitize some menu items.
+
+	* folder-browser-ui.h: Prototype new functions.
+
+	* folder-browser.h: New enumeration, 
+	FolderBrowserSelectionState, that records the previous state
+	of the selection (_NONE, _SINGLE, _MULTIPLE).
+
+	* folder-browser.c (got_folder): If the component is set,
+	set our selection state to _NONE, because that's the default
+	state of the ETree.
+	(on_selection_changed): When the number of selected messages
+	is updated, notify the FBUI code of our new state.
+	(folder_browser_gui_init): Hook up to the selection_changed
+	signal and default to the _NONE selection state.
+	(done_message_selected): Notify when a message is loaded.
+
+2001-08-08  Peter Williams  <peterw@ximian.com>
+
+	* mail-folder-cache.c: Display how many messages are selected,
+	too.
+	(make_folder_status): If multiple messages are selected, add that
+	to the string (the 0 and 1 cases are boring)
+	(selection_changed): New function, update the selected count.
+	(mail_folder_cache_note_fb): Connect to the selection_changed
+	signal.
+
 2001-08-09  Jeffrey Stedfast  <fejj@ximian.com>
 
 	* mail-account-gui.c (mail_account_gui_save): Save the pgp and
Index: folder-browser.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser.c,v
retrieving revision 1.196
diff -u -r1.196 folder-browser.c
--- folder-browser.c	2001/08/06 21:47:58	1.196
+++ folder-browser.c	2001/08/09 20:35:57
@@ -47,6 +47,7 @@
 #include "mail-autofilter.h"
 #include "mail-mt.h"
 #include "mail-folder-cache.h"
+#include "folder-browser-ui.h"
 
 #include "mail-local.h"
 #include "mail-config.h"
@@ -712,6 +713,11 @@
 	mail_folder_cache_note_folder (fb->uri, folder);
 	mail_folder_cache_note_fb (fb->uri, fb);
 
+	/* when loading a new folder, nothing is selected initially */
+
+	if (fb->uicomp)
+		folder_browser_ui_set_selection_state (fb, FB_SELSTATE_NONE);
+
  done:
 	gtk_object_unref (GTK_OBJECT (fb));
 	
@@ -1617,6 +1623,33 @@
 }
 
 static void
+on_selection_changed (GtkObject *obj, gpointer user_data)
+{
+	FolderBrowser *fb = FOLDER_BROWSER (user_data);
+	FolderBrowserSelectionState state;
+
+	/* we can get this signal at strange times...
+	 * if no uicomp, don't even bother */
+
+	if (fb->uicomp == NULL)
+		return;
+
+	switch (e_selection_model_selected_count (E_SELECTION_MODEL (obj))) {
+	case 0:
+		state = FB_SELSTATE_NONE;
+		break;
+	case 1:
+		state = FB_SELSTATE_SINGLE;
+		break;
+	default:
+		state = FB_SELSTATE_MULTIPLE;
+		break;
+	}
+
+	folder_browser_ui_set_selection_state (fb, state);
+}
+
+static void
 fb_resize_cb (GtkWidget *w, GtkAllocation *a, FolderBrowser *fb)
 {	
 	if (fb->preview_shown)
@@ -1626,6 +1659,8 @@
 static void
 folder_browser_gui_init (FolderBrowser *fb)
 {
+	ESelectionModel *esm;
+
 	/* The panned container */
 	fb->vpaned = e_vpaned_new ();
 	gtk_widget_show (fb->vpaned);
@@ -1668,7 +1703,11 @@
 			  GTK_FILL | GTK_EXPAND,
 			  0,
 			  0, 0);
-	
+
+	esm = e_tree_get_selection_model (E_TREE (fb->message_list->tree));
+	gtk_signal_connect (GTK_OBJECT (esm), "selection_changed", on_selection_changed, fb);
+	fb->selection_state = FB_SELSTATE_NONE; /* default to none */
+
 	e_paned_add1 (E_PANED (fb->vpaned), GTK_WIDGET (fb->message_list));
 	gtk_widget_show (GTK_WIDGET (fb->message_list));
 	
@@ -1707,6 +1746,8 @@
 		return;
 	
 	mail_display_set_message (fb->mail_display, (CamelMedium *)msg);
+	folder_browser_ui_message_loaded (fb);
+
 	/* FIXME: should this signal be emitted here?? */
 	gtk_signal_emit (GTK_OBJECT (fb), folder_browser_signals [MESSAGE_LOADED], uid);
 	
Index: folder-browser-ui.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser-ui.c,v
retrieving revision 1.10
diff -u -r1.10 folder-browser-ui.c
--- folder-browser-ui.c	2001/08/01 09:11:56	1.10
+++ folder-browser-ui.c	2001/08/09 20:35:57
@@ -278,7 +278,8 @@
 {
 	int state;
 	BonoboUIComponent *uic = fb->uicomp;
-
+	FolderBrowserSelectionState prev_state;
+		
 	ui_add (fb, "message", message_verbs, message_pixcache);
 
 	/* Display Style */
@@ -296,7 +297,13 @@
 	/* Resend Message */
 
 	if (fb->folder && !folder_browser_is_sent (fb)) 
-		bonobo_ui_component_set_prop (uic, "/commands/MessageResend", "sensitive", "0", NULL);	
+		bonobo_ui_component_set_prop (uic, "/commands/MessageResend", "sensitive", "0", NULL);
+
+	/* sensitivity of message-specific commands */
+
+	prev_state = fb->selection_state;
+	fb->selection_state = FB_SELSTATE_UNDEFINED;
+	folder_browser_ui_set_selection_state (fb, prev_state);
 }
 
 /*
@@ -387,3 +394,123 @@
  	bonobo_ui_component_unset_container (uic);
 }
 
+static void
+fbui_sensitize_items (BonoboUIComponent *uic, const char **items, gboolean enable)
+{
+	int i;
+	char name_buf[256]; /* this should really be large enough */
+	char *value;
+
+	if (enable)
+		value = "1";
+	else
+		value = "0";
+
+	for (i = 0; items[i]; i++) {
+		sprintf (name_buf, "/commands/%s", items[i]);
+		bonobo_ui_component_set_prop (uic, name_buf, "sensitive", value, NULL);
+	}
+}
+
+static const char *message_pane_enables[] = {
+	/* these only work if there's a message in the message pane
+	 * (preview pane). This state is independent of how many are
+	 * selected. */
+	"PrintMessage", "PrintPreviewMessage",
+	"ViewFullHeaders", "ViewLoadImages", "ViewNormal", "ViewSource",
+	
+	NULL
+};
+
+void 
+folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelectionState state)
+{
+	BonoboUIComponent *uic = fb->uicomp;
+
+	/* We'd like to keep the number of changes to be minimal cause
+	 * this is a lot of corba traffic. So we break these sets of commands into bits:
+	 *
+	 * Also remember that everything defaults to sensitized
+	 *
+	 * Disable:
+	 *      NONE = none_disables + multiple_disables
+	 *    SINGLE = [nothing disabled]
+	 *  MULTIPLE = multiple_disables
+	 * UNDEFINED = [nothing disabled]
+	 */
+
+	static const char *none_disables[] = {
+		/* actions that work on > 0 messages */
+		"MessageApplyFilters", 
+		"MessageCopy", "MessageMove", 
+		"MessageDelete", "MessageUndelete",
+		"MessageMarkAsRead", "MessageMarkAsUnRead",
+		"MessageMarkAsImportant", "MessageMarkAsUnimportant",
+		"MessageOpen", "MessageSaveAs", 
+		"MessageForward", "MessageForwardAttached",
+
+		"EditCut", "EditCopy", "EditPaste", "ViewHideSelected",
+
+		NULL
+	};
+
+	static const char *multiple_disables[] = {
+		/* actions that work on exactly 1 message */
+		"MessageReplyAll", "MessageReplyList", "MessageReplySender", "MessageResend", 
+		"MessageForwardInline", "MessageForwardQuoted", 
+
+		"ToolsFilterMailingList", "ToolsFilterRecipient", "ToolsFilterSender",
+		"ToolsFilterSubject", "ToolsVFolderMailingList", "ToolsVFolderRecipient", 
+		"ToolsVFolderSender", "ToolsVFolderSubject",
+
+		/* moving around -- if we have more than one message selected, it
+		 * doesn't behave very. If people complain, it isn't a problem
+		 * to put these commands in none_disables tho. */
+		"MailNext", "MailNextFlagged", "MailNextUnread", "MailNextThread",
+		"MailPrevious", "MailPreviousFlagged", "MailPreviousUnread",
+
+		NULL
+	};
+
+	/* assumes that all the appropriate XML's have been loaded */
+
+	if (state == fb->selection_state)
+		return;
+
+	switch (state) {
+	case FB_SELSTATE_NONE:
+		fbui_sensitize_items (uic, none_disables, FALSE);
+		if (fb->selection_state != FB_SELSTATE_MULTIPLE)
+			fbui_sensitize_items (uic, multiple_disables, FALSE);
+		break;
+	case FB_SELSTATE_SINGLE:
+		if (fb->selection_state != FB_SELSTATE_UNDEFINED)
+			fbui_sensitize_items (uic, multiple_disables, TRUE);
+		if (fb->selection_state == FB_SELSTATE_NONE)
+			fbui_sensitize_items (uic, none_disables, TRUE);
+		break;
+	case FB_SELSTATE_MULTIPLE:
+		if (fb->selection_state == FB_SELSTATE_NONE)
+			fbui_sensitize_items (uic, none_disables, TRUE);
+		else
+			fbui_sensitize_items (uic, multiple_disables, FALSE);
+		break;
+	case FB_SELSTATE_UNDEFINED:
+		printf ("changing to undefined selection state? hah!\n");
+		return;
+	}
+
+	if (fb->loaded_uid == NULL)
+		fbui_sensitize_items (uic, message_pane_enables, FALSE);
+
+	fb->selection_state = state;
+}
+
+void
+folder_browser_ui_message_loaded (FolderBrowser *fb)
+{
+	BonoboUIComponent *uic = fb->uicomp;
+
+	if (fb->loaded_uid == NULL)
+		fbui_sensitize_items (uic, message_pane_enables, TRUE);
+}
Index: folder-browser.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser.h,v
retrieving revision 1.41
diff -u -r1.41 folder-browser.h
--- folder-browser.h	2001/07/16 18:32:10	1.41
+++ folder-browser.h	2001/08/09 20:35:57
@@ -24,6 +24,13 @@
 #define IS_FOLDER_BROWSER(o)       (GTK_CHECK_TYPE ((o), FOLDER_BROWSER_TYPE))
 #define IS_FOLDER_BROWSER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), FOLDER_BROWSER_TYPE))
 
+typedef enum _FolderBrowserSelectionState {
+	FB_SELSTATE_NONE,
+	FB_SELSTATE_SINGLE,
+	FB_SELSTATE_MULTIPLE,
+	FB_SELSTATE_UNDEFINED
+} FolderBrowserSelectionState;
+
 struct  _FolderBrowser {
 	GtkTable parent;
 	
@@ -62,6 +69,8 @@
 	gboolean     preview_shown;
 	gboolean     threaded;
 	gboolean     pref_master;
+
+	FolderBrowserSelectionState selection_state;
 
 	/* View collection and the menu handler object */
 	GalViewCollection *view_collection;
Index: folder-browser-ui.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser-ui.h,v
retrieving revision 1.2
diff -u -r1.2 folder-browser-ui.h
--- folder-browser-ui.h	2001/06/27 16:32:01	1.2
+++ folder-browser-ui.h	2001/08/09 20:35:57
@@ -20,4 +20,8 @@
 void folder_browser_ui_rm_list (FolderBrowser *fb);
 void folder_browser_ui_rm_all (FolderBrowser *fb);
 
+/* these affect the sensitivity of UI elements */
+void folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelectionState state);
+void folder_browser_ui_message_loaded (FolderBrowser *fb);
+
 #endif /* _FOLDER_BROWSER_UI_H */
