diff --git a/mail/components/compose/content/MsgComposeCommands.js b/mail/components/compose/content/MsgComposeCommands.js
index 4b428389ad..94c46be4eb 100644
--- a/mail/components/compose/content/MsgComposeCommands.js
+++ b/mail/components/compose/content/MsgComposeCommands.js
@@ -421,169 +421,262 @@ var progressListener = {
}
};
-var defaultController =
-{
- supportsCommand: function(command)
- {
- switch (command)
- {
- //File Menu
- case "cmd_attachFile":
- case "cmd_attachPage":
- case "cmd_close":
- case "cmd_saveDefault":
- case "cmd_saveAsFile":
- case "cmd_saveAsDraft":
- case "cmd_saveAsTemplate":
- case "cmd_sendButton":
- case "cmd_sendNow":
- case "cmd_sendWithCheck":
- case "cmd_sendLater":
- case "cmd_printSetup":
- case "cmd_print":
- case "cmd_quit":
-
- //Edit Menu
- case "cmd_delete":
- case "cmd_renameAttachment":
- case "cmd_selectAll":
- case "cmd_openAttachment":
- case "cmd_account":
-
- //View Menu
- case "cmd_showFormatToolbar":
-
- //Options Menu
- case "cmd_outputFormat":
- case "cmd_quoteMessage":
- return true;
-
- default:
-// dump("##MsgCompose: command " + command + "no supported!\n");
- return false;
- }
- },
- isCommandEnabled: function(command)
- {
- var composeHTML = gMsgCompose && gMsgCompose.composeHTML;
-
- switch (command)
- {
- //File Menu
- case "cmd_attachFile":
- case "cmd_attachPage":
- case "cmd_close":
- case "cmd_saveDefault":
- case "cmd_saveAsFile":
- case "cmd_saveAsDraft":
- case "cmd_saveAsTemplate":
- case "cmd_sendButton":
- case "cmd_sendLater":
- case "cmd_printSetup":
- case "cmd_print":
- case "cmd_sendWithCheck":
+var defaultController = {
+ commands: {
+ cmd_attachFile: {
+ isEnabled: function() {
return !gWindowLocked;
- case "cmd_sendNow":
- return !(gWindowLocked || gIsOffline);
- case "cmd_quit":
- return true;
+ },
+ doCommand: function() {
+ AttachFile();
+ }
+ },
- //Edit Menu
- case "cmd_delete":
- var numSelectedAttachments = MessageGetNumSelectedAttachments();
+ cmd_attachPage: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ AttachPage();
+ }
+ },
- var cmdDelete = document.getElementById("cmd_delete");
- var textValue = cmdDelete.getAttribute("valueDefault");
- var accesskeyValue = cmdDelete.getAttribute("valueDefaultAccessKey");
+ cmd_close: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ DoCommandClose();
+ }
+ },
- var hasAttachments = MessageHasAttachments();
- if (hasAttachments) {
- textValue = getComposeBundle().getString("removeAttachmentMsgs");
- textValue = PluralForm.get(numSelectedAttachments, textValue);
- accesskeyValue = cmdDelete.getAttribute("valueRemoveAttachmentAccessKey");
- }
+ cmd_saveDefault: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ Save();
+ }
+ },
+
+ cmd_saveAsFile: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ SaveAsFile(true);
+ }
+ },
+
+ cmd_saveAsDraft: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ SaveAsDraft();
+ }
+ },
+
+ cmd_saveAsTemplate: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ SaveAsTemplate();
+ }
+ },
+
+ cmd_sendButton: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ if (gIOService && gIOService.offline)
+ SendMessageLater();
+ else
+ SendMessage();
+ }
+ },
+
+ cmd_sendNow: {
+ isEnabled: function() {
+ return !gWindowLocked && !gIsOffline;
+ },
+ doCommand: function() {
+ SendMessage();
+ }
+ },
+
+ cmd_sendLater: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ SendMessageLater();
+ }
+ },
+
+ cmd_sendWithCheck: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ SendMessageWithCheck();
+ }
+ },
+
+ cmd_printSetup: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ PrintUtils.showPageSetup();
+ }
+ },
+
+ cmd_print: {
+ isEnabled: function() {
+ return !gWindowLocked;
+ },
+ doCommand: function() {
+ DoCommandPrint();
+ }
+ },
+
+ cmd_delete: {
+ isEnabled: function() {
+ let cmdDelete = document.getElementById("cmd_delete");
+ let textValue = cmdDelete.getAttribute("valueDefault");
+ let accesskeyValue = cmdDelete.getAttribute("valueDefaultAccessKey");
cmdDelete.setAttribute("label", textValue);
cmdDelete.setAttribute("accesskey", accesskeyValue);
- return hasAttachments ? numSelectedAttachments : 0;
- case "cmd_selectAll":
- return MessageHasAttachments();
- case "cmd_openAttachment":
- return MessageGetNumSelectedAttachments() == 1;
- case "cmd_renameAttachment":
- return MessageGetNumSelectedAttachments() == 1;
- case "cmd_account":
-
- //View Menu
- case "cmd_showFormatToolbar":
- return composeHTML;
-
- //Options Menu
- case "cmd_outputFormat":
- return composeHTML;
- case "cmd_quoteMessage":
- var selectedURIs = GetSelectedMessages();
- if (selectedURIs && selectedURIs.length > 0)
- return true;
return false;
+ },
+ doCommand: function() {
+ }
+ },
- default:
-// dump("##MsgCompose: command " + command + " disabled!\n");
- return false;
- }
+ cmd_account: {
+ isEnabled: function() {
+ return true;
+ },
+ doCommand: function() {
+ MsgAccountManager(null);
+ }
+ },
+
+ cmd_showFormatToolbar: {
+ isEnabled: function() {
+ return gMsgCompose && gMsgCompose.composeHTML;
+ },
+ doCommand: function() {
+ goToggleToolbar("FormatToolbar", "menu_showFormatToolbar");
+ }
+ },
+
+ cmd_quoteMessage: {
+ isEnabled: function() {
+ let selectedURIs = GetSelectedMessages();
+ return (selectedURIs && selectedURIs.length > 0)
+ },
+ doCommand: function() {
+ QuoteSelectedMessage();
+ }
+ },
},
- doCommand: function(command)
- {
- switch (command)
- {
- //File Menu
- case "cmd_attachFile" : if (defaultController.isCommandEnabled(command)) AttachFile(); break;
- case "cmd_attachPage" : AttachPage(); break;
- case "cmd_close" : DoCommandClose(); break;
- case "cmd_saveDefault" : Save(); break;
- case "cmd_saveAsFile" : SaveAsFile(true); break;
- case "cmd_saveAsDraft" : SaveAsDraft(); break;
- case "cmd_saveAsTemplate" : SaveAsTemplate(); break;
- case "cmd_sendButton" :
- if (defaultController.isCommandEnabled(command))
- {
- if (gIOService && gIOService.offline)
- SendMessageLater();
- else
- SendMessage();
- }
- break;
- case "cmd_sendNow" : if (defaultController.isCommandEnabled(command)) SendMessage(); break;
- case "cmd_sendWithCheck" : if (defaultController.isCommandEnabled(command)) SendMessageWithCheck(); break;
- case "cmd_sendLater" : if (defaultController.isCommandEnabled(command)) SendMessageLater(); break;
- case "cmd_printSetup" : PrintUtils.showPageSetup(); break;
- case "cmd_print" : DoCommandPrint(); break;
-
- //Edit Menu
- case "cmd_delete" : if (MessageGetNumSelectedAttachments()) RemoveSelectedAttachment(); break;
- case "cmd_renameAttachment" : if (MessageGetNumSelectedAttachments() == 1) RenameSelectedAttachment(); break;
- case "cmd_selectAll" : if (MessageHasAttachments()) SelectAllAttachments(); break;
- case "cmd_openAttachment" : if (MessageGetNumSelectedAttachments() == 1) OpenSelectedAttachment(); break;
- case "cmd_account" : MsgAccountManager(null); break;
-
- //View Menu
- case "cmd_showFormatToolbar" : goToggleToolbar('FormatToolbar', 'menu_showFormatToolbar'); break;
-
- //Options Menu
- case "cmd_quoteMessage" : if (defaultController.isCommandEnabled(command)) QuoteSelectedMessage(); break;
- default:
-// dump("##MsgCompose: don't know what to do with command " + command + "!\n");
- return;
- }
+ supportsCommand: function(aCommand) {
+ return (aCommand in this.commands);
},
- onEvent: function(event)
- {
-// dump("DefaultController:onEvent\n");
- }
-}
+ isCommandEnabled: function(aCommand) {
+ if (!this.supportsCommand(aCommand))
+ return false;
+ return this.commands[aCommand].isEnabled();
+ },
+
+ doCommand: function(aCommand) {
+ if (!this.supportsCommand(aCommand))
+ return;
+ var cmd = this.commands[aCommand];
+ if (!cmd.isEnabled())
+ return;
+ cmd.doCommand();
+ },
+
+ onEvent: function(event) {},
+};
+
+var attachmentBucketController = {
+ commands: {
+ cmd_selectAll: {
+ isEnabled: function() {
+ return true;
+ },
+ doCommand: function() {
+ document.getElementById("attachmentBucket").selectAll();
+ }
+ },
+
+ cmd_delete: {
+ isEnabled: function() {
+ let selectedCount = MessageGetNumSelectedAttachments();
+ let cmdDelete = document.getElementById("cmd_delete");
+ let textValue = getComposeBundle().getString("removeAttachmentMsgs");
+ textValue = PluralForm.get(selectedCount, textValue);
+ let accesskeyValue = cmdDelete.getAttribute("valueRemoveAttachmentAccessKey");
+ cmdDelete.setAttribute("label", textValue);
+ cmdDelete.setAttribute("accesskey", accesskeyValue);
+
+ return selectedCount > 0;
+ },
+ doCommand: function() {
+ RemoveSelectedAttachment();
+ }
+ },
+
+ cmd_openAttachment: {
+ isEnabled: function() {
+ return MessageGetNumSelectedAttachments() == 1;
+ },
+ doCommand: function() {
+ OpenSelectedAttachment();
+ }
+ },
+
+ cmd_renameAttachment: {
+ isEnabled: function() {
+ return MessageGetNumSelectedAttachments() == 1;
+ },
+ doCommand: function() {
+ RenameSelectedAttachment();
+ }
+ },
+ },
+
+ supportsCommand: function(aCommand) {
+ return (aCommand in this.commands);
+ },
+
+ isCommandEnabled: function(aCommand) {
+ if (!this.supportsCommand(aCommand))
+ return false;
+ return this.commands[aCommand].isEnabled();
+ },
+
+ doCommand: function(aCommand) {
+ if (!this.supportsCommand(aCommand))
+ return;
+ var cmd = this.commands[aCommand];
+ if (!cmd.isEnabled())
+ return;
+ cmd.doCommand();
+ },
+
+ onEvent: function(event) {},
+};
function goOpenNewMessage()
{
@@ -628,7 +721,10 @@ function GetSelectedMessages()
function SetupCommandUpdateHandlers()
{
- top.controllers.insertControllerAt(0, defaultController);
+ let attachmentBucket = document.getElementById("attachmentBucket");
+
+ top.controllers.appendController(defaultController);
+ attachmentBucket.controllers.appendController(attachmentBucketController);
document.getElementById("optionsMenuPopup")
.addEventListener("popupshowing", updateOptionItems, true);
@@ -636,9 +732,12 @@ function SetupCommandUpdateHandlers()
function UnloadCommandUpdateHandlers()
{
+ let attachmentBucket = document.getElementById("attachmentBucket");
+
document.getElementById("optionsMenuPopup")
.removeEventListener("popupshowing", updateOptionItems, true);
+ attachmentBucket.controllers.removeController(attachmentBucketController);
top.controllers.removeController(defaultController);
}
@@ -3011,22 +3110,6 @@ function AddUrlAttachment(attachment)
AddAttachments([attachment]);
}
-function SelectAllAttachments()
-{
- var bucketList = document.getElementById("attachmentBucket");
- if (bucketList)
- bucketList.selectAll();
-}
-
-function MessageHasAttachments()
-{
- var bucketList = document.getElementById("attachmentBucket");
- if (bucketList) {
- return (bucketList && bucketList.getRowCount() && (bucketList == top.document.commandDispatcher.focusedElement));
- }
- return false;
-}
-
function MessageGetNumSelectedAttachments()
{
var bucketList = document.getElementById("attachmentBucket");
diff --git a/mail/components/compose/content/messengercompose.xul b/mail/components/compose/content/messengercompose.xul
index 03e02ca6f3..bfbd18e843 100644
--- a/mail/components/compose/content/messengercompose.xul
+++ b/mail/components/compose/content/messengercompose.xul
@@ -157,9 +157,9 @@
-
-
+
+
@@ -222,10 +222,11 @@
modifiers="accel, shift" observes="cmd_pasteNoFormatting"/>
#ifdef XP_MACOSX
-
-
+
+
#else
-
+
+
#endif
@@ -445,9 +446,14 @@
-
+
+
+
@@ -790,7 +796,6 @@
seltype="multiple" flex="1" height="0"
context="msgComposeAttachmentListContext"
itemcontext="msgComposeAttachmentItemContext"
- onkeypress="if (event.keyCode == 8 || event.keyCode == 46) RemoveSelectedAttachment();"
onclick="AttachmentBucketClicked(event);"
ondraggesture="nsDragAndDrop.startDrag(event, attachmentBucketDNDObserver);"/>
diff --git a/mail/locales/en-US/chrome/messenger/messengercompose/messengercompose.dtd b/mail/locales/en-US/chrome/messenger/messengercompose/messengercompose.dtd
index bc602cd534..9e4ab1649a 100644
--- a/mail/locales/en-US/chrome/messenger/messengercompose/messengercompose.dtd
+++ b/mail/locales/en-US/chrome/messenger/messengercompose/messengercompose.dtd
@@ -68,11 +68,13 @@
-
-
+
+
+
+
diff --git a/mail/test/mozmill/attachment/test-attachment.js b/mail/test/mozmill/attachment/test-attachment.js
index 628b21b25c..b3fc096db3 100644
--- a/mail/test/mozmill/attachment/test-attachment.js
+++ b/mail/test/mozmill/attachment/test-attachment.js
@@ -445,8 +445,23 @@ function test_attachments_compose_menu() {
let element = cwc.e(aId);
element.focus();
- if (!mc.mozmillModule.isWindows)
+ if (!mc.mozmillModule.isWindows) {
+ // First, call the window's default controller's function.
cwc.window.defaultController.isCommandEnabled("cmd_delete");
+
+ // Walk up the DOM tree and call isCommandEnabled on the first controller
+ // that supports "cmd_delete".
+ while (element != cwc.window.document) {
+ for (let i = 0; i < element.controllers.getControllerCount(); i++) {
+ let currController = element.controllers.getControllerAt(i);
+ if (currController.supportsCommand("cmd_delete")) {
+ currController.isCommandEnabled("cmd_delete");
+ return;
+ }
+ }
+ element = element.parentNode;
+ }
+ }
}
// Click on a portion of the attachmentBucket that will focus it, but not