aboutsummaryrefslogtreecommitdiffstats
path: root/mail/folder-browser-ui.c
diff options
context:
space:
mode:
authorPeter Williams <peterw@ximian.com>2001-08-14 23:26:00 +0800
committerPeter Williams <peterw@src.gnome.org>2001-08-14 23:26:00 +0800
commit866a960fd9dba9c3c7162c61b1e12feca6d12668 (patch)
treeb9023b5652dfe4c329e300c3abf4d3c251796bed /mail/folder-browser-ui.c
parent4b6f7546b80b48c24cda221f09235cd5ac53bfbd (diff)
downloadgsoc2013-evolution-866a960fd9dba9c3c7162c61b1e12feca6d12668.tar.gz
gsoc2013-evolution-866a960fd9dba9c3c7162c61b1e12feca6d12668.tar.zst
gsoc2013-evolution-866a960fd9dba9c3c7162c61b1e12feca6d12668.zip
Fix bug #215... desensitize menu items based on the number of selected
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. svn path=/trunk/; revision=12012
Diffstat (limited to 'mail/folder-browser-ui.c')
-rw-r--r--mail/folder-browser-ui.c131
1 files changed, 129 insertions, 2 deletions
diff --git a/mail/folder-browser-ui.c b/mail/folder-browser-ui.c
index 204630962d..3bd810a70d 100644
--- a/mail/folder-browser-ui.c
+++ b/mail/folder-browser-ui.c
@@ -278,7 +278,8 @@ folder_browser_ui_add_message (FolderBrowser *fb)
{
int state;
BonoboUIComponent *uic = fb->uicomp;
-
+ FolderBrowserSelectionState prev_state;
+
ui_add (fb, "message", message_verbs, message_pixcache);
/* Display Style */
@@ -296,7 +297,13 @@ folder_browser_ui_add_message (FolderBrowser *fb)
/* 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 @@ folder_browser_ui_rm_all (FolderBrowser *fb)
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);
+}