diff options
author | Peter Williams <peterw@ximian.com> | 2001-08-14 23:26:00 +0800 |
---|---|---|
committer | Peter Williams <peterw@src.gnome.org> | 2001-08-14 23:26:00 +0800 |
commit | 866a960fd9dba9c3c7162c61b1e12feca6d12668 (patch) | |
tree | b9023b5652dfe4c329e300c3abf4d3c251796bed /mail/folder-browser-ui.c | |
parent | 4b6f7546b80b48c24cda221f09235cd5ac53bfbd (diff) | |
download | gsoc2013-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.c | 131 |
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); +} |