Bug 45715 - ""Reply to List" [button/(context) menu item]" [r=mkmelin,sr=bienvenu,ui-review=clarkbw]

This commit is contained in:
Blake Winton 2009-05-29 10:35:37 +01:00
Родитель e23a7d2077
Коммит 782c85af11
14 изменённых файлов: 301 добавлений и 32 удалений

Просмотреть файл

@ -53,7 +53,7 @@ function hiddenWindowStartup()
'goNextMenu', 'menu_nextMsg', 'menu_nextUnreadMsg', 'menu_nextUnreadThread',
'goPreviousMenu', 'menu_prevMsg', 'menu_prevUnreadMsg', 'menu_goForward', 'menu_goBack',
'goStartPage', 'newMsgCmd', 'replyMainMenu', 'replySenderMainMenu', 'replyNewsgroupMainMenu',
'menu_replyToAll', 'menu_forwardMsg', 'forwardAsMenu', 'menu_editMsgAsNew', 'openMessageWindowMenuitem',
'menu_replyToAll', 'menu_replyToList', 'menu_forwardMsg', 'forwardAsMenu', 'menu_editMsgAsNew', 'openMessageWindowMenuitem',
'moveMenu', 'copyMenu', 'moveToFolderAgain', 'tagMenu', 'markMenu',
'markReadMenuItem', 'menu_markThreadAsRead', 'menu_markReadByDate', 'menu_markAllRead',
'markFlaggedMenuItem', 'menu_markAsJunk', 'menu_markAsNotJunk', 'createFilter',

Просмотреть файл

@ -148,6 +148,8 @@ var DefaultController =
case "cmd_replyGroup":
case "cmd_replyall":
case "button_replyall":
case "cmd_replylist":
case "button_replylist":
case "cmd_forward":
case "button_forward":
case "cmd_forwardInline":
@ -300,6 +302,8 @@ var DefaultController =
case "cmd_replyGroup":
case "cmd_replyall":
case "button_replyall":
case "cmd_replylist":
case "button_replylist":
case "cmd_forward":
case "button_forward":
case "cmd_forwardInline":
@ -531,6 +535,9 @@ var DefaultController =
case "cmd_replyall":
MsgReplyToAllMessage(null);
break;
case "cmd_replylist":
MsgReplyToListMessage(null);
break;
case "cmd_forward":
MsgForwardMessage(null);
break;

Просмотреть файл

@ -195,6 +195,7 @@ function fillMailContextMenu(event)
setSingleSelection("mailContext-editAsNew");
setSingleSelection("mailContext-replyNewsgroup", isNewsgroup);
setSingleSelection("mailContext-replyAll");
setSingleSelection("mailContext-replyList");
setSingleSelection("mailContext-forward");
ShowMenuItem("mailContext-forwardAsAttachment",
numSelected > 1 && inThreadPane && !hideMailItems);

Просмотреть файл

@ -2120,7 +2120,12 @@
class="msgHeaderView-button hdrReplyButton"
type="menu-button">
<xul:menupopup anonid="hdrReplyDropdown">
<xul:menuitem anonid="hdrReplyAllButton"
<xul:menuitem anonid="hdrReplySubButton"
label="&hdrReplyButton.label;"
tooltiptext="&replyButton.tooltip;"
observes="button_reply"/>
<xul:menuseparator anonid="hdrReplyAllSubButtonSep"/>
<xul:menuitem anonid="hdrReplyAllSubButton"
label="&hdrReplyAllButton.label;"
tooltiptext="&replyAllButton.tooltip;"
observes="button_replyall"
@ -2128,6 +2133,52 @@
RestoreFocusAfterHdrButton();"/>
</xul:menupopup>
</xul:button>
<xul:button anonid="hdrReplyAllButton" label="&hdrReplyAllButton.label;"
oncommand="MsgReplyToAllMessage(event);RestoreFocusAfterHdrButton();"
observes="button_replyall"
class="msgHeaderView-button hdrReplyButton"
type="menu-button"
hidden="true">
<xul:menupopup anonid="hdrReplyAllDropdown">
<xul:menuitem anonid="hdrReplyAllSubButton"
label="&hdrReplyAllButton.label;"
tooltiptext="&replyAllButton.tooltip;"
observes="button_replyall"/>
<xul:menuseparator/>
<xul:menuitem anonid="hdrReplySubButton"
label="&hdrReplyButton.label;"
tooltiptext="&replyButton.tooltip;"
observes="button_reply"
oncommand="MsgReplyMessage(event); event.stopPropagation();
RestoreFocusAfterHdrButton();"/>
</xul:menupopup>
</xul:button>
<xul:button anonid="hdrReplyListButton" label="&hdrReplyListButton.label;"
oncommand="MsgReplyToListMessage(event);RestoreFocusAfterHdrButton();"
observes="button_replylist"
class="msgHeaderView-button hdrReplyButton"
type="menu-button"
hidden="true">
<xul:menupopup anonid="hdrReplyListDropdown">
<xul:menuitem anonid="hdrReplyListSubButton"
label="&hdrReplyListButton.label;"
tooltiptext="&replyListButton.tooltip;"
observes="button_replylist"/>
<xul:menuseparator/>
<xul:menuitem anonid="hdrReplyAllSubButton"
label="&hdrReplyAllButton.label;"
tooltiptext="&replyAllButton.tooltip;"
observes="button_replyall"
oncommand="MsgReplyToAllMessage(event); event.stopPropagation();
RestoreFocusAfterHdrButton();"/>
<xul:menuitem anonid="hdrReplySubButton"
label="&hdrReplyButton.label;"
tooltiptext="&replyButton.tooltip;"
observes="button_reply"
oncommand="MsgReplyMessage(event); event.stopPropagation();
RestoreFocusAfterHdrButton();"/>
</xul:menupopup>
</xul:button>
<xul:button anonid="hdrForwardButton" label="&hdrForwardButton.label;"
oncommand="MsgForwardMessage(event);RestoreFocusAfterHdrButton();"
observes="button_forward" class="msgHeaderView-button hdrForwardButton"/>

Просмотреть файл

@ -807,6 +807,99 @@ function UpdateJunkToolbarButton()
junkButtonDeck.selectedIndex = SelectedMessagesAreJunk() ? 1 : 0;
}
function UpdateReplyButtons()
{
let msgHdr = messenger.msgHdrFromURI(GetLoadedMessage());
let myEmail = getIdentityForHeader(msgHdr).email;
let recipients = msgHdr.recipients + "," + msgHdr.ccList;
// If my email address isn't in the to or cc list, then I've been bcc-ed.
let imBcced = recipients.indexOf(myEmail) == -1;
// Now, let's get the number of unique recipients
let hdrParser = Components.classes["@mozilla.org/messenger/headerparser;1"]
.getService(Components.interfaces.nsIMsgHeaderParser);
let uniqueRecipients = hdrParser.removeDuplicateAddresses(recipients, {});
let numAddresses = hdrParser.parseHeadersWithArray(uniqueRecipients, {}, {}, {});
// If I've been bcc-ed, then add 1 to the number of addresses to compensate.
if (imBcced)
numAddresses++
// By default, ReplyAll if there is more than 1 person to reply to.
let showReplyAll = numAddresses > 1;
// And ReplyToList if there is a List-Post header.
let showReplyList = currentHeaderData["list-post"];
// Get the server type.
let serverType = null;
try
{
serverType = msgHdr.folder.server.type;
}
catch (ex)
{
// This empty catch block needs to be here because msgHdr.folder will
// throw an exception when you try to access it on a .eml file.
}
// But, if we're in a news item, we should default to Reply.
if (serverType == "nntp")
{
showReplyAll = false;
showReplyList = false;
}
let buttonToShow = "reply";
if (showReplyList)
buttonToShow = "replyList";
else if (showReplyAll)
buttonToShow = "replyAll";
let buttonBox = document.getElementById(gCollapsedHeaderViewMode ?
"collapsedButtonBox" : "expandedButtonBox");
let replyButton = buttonBox.getButton("hdrReplyButton");
let replyAllButton = buttonBox.getButton("hdrReplyAllButton");
let replyAllSubButton = buttonBox.getButton("hdrReplyAllSubButton");
let replyAllSubButtonSep = buttonBox.getButton("hdrReplyAllSubButtonSep");
let replyListButton = buttonBox.getButton("hdrReplyListButton");
replyButton.hidden = (buttonToShow != "reply");
replyAllButton.hidden = (buttonToShow != "replyAll");
replyListButton.hidden = (buttonToShow != "replyList");
let replyListMenu = document.getElementById("menu_replyToList");
replyListMenu.hidden = !showReplyList;
let replyListCommand = document.getElementById("cmd_replylist");
replyListCommand.disabled = !showReplyList;
if (serverType == "nntp")
{
// If it's a news item, show the ReplyAll sub-button and separator.
replyAllSubButton.hidden = false;
replyAllSubButtonSep.hidden = false;
}
else if (serverType == "rss")
{
// otherwise, if it's an rss item, hide all the Reply buttons.
replyButton.hidden = true;
replyAllButton.hidden = true;
replyListButton.hidden = true;
replyAllSubButton.hidden = true;
replyAllSubButtonSep.hidden = true;
}
else
{
// otherwise, hide the ReplyAll sub-buttons.
replyAllSubButton.hidden = true;
replyAllSubButtonSep.hidden = true;
}
}
function UpdateDeleteToolbarButton()
{
var deleteButtonDeck = document.getElementById("delete-deck");
@ -1097,6 +1190,10 @@ function MsgReplyToAllMessage(event)
composeMsgByType(Components.interfaces.nsIMsgCompType.ReplyAll, event);
}
function MsgReplyToListMessage(event)
{
composeMsgByType(Components.interfaces.nsIMsgCompType.ReplyToList, event);
}
// Message Archive function

Просмотреть файл

@ -232,6 +232,7 @@
<command id="cmd_replySender" oncommand="goDoCommand('cmd_replySender')"/>
<command id="cmd_replyGroup" oncommand="goDoCommand('cmd_replyGroup')"/>
<command id="cmd_replyall" oncommand="goDoCommand('cmd_replyall')"/>
<command id="cmd_replylist" oncommand="goDoCommand('cmd_replylist')"/>
<command id="cmd_forward" oncommand="goDoCommand('cmd_forward')"/>
<command id="cmd_forwardInline" oncommand="goDoCommand('cmd_forwardInline')"/>
<command id="cmd_forwardAttachment" oncommand="goDoCommand('cmd_forwardAttachment')"/>
@ -251,6 +252,7 @@
<command id="button_reply"/>
<command id="button_replyall"/>
<command id="button_replylist"/>
<command id="button_archive"/>
<command id="button_forward"/>
<command id="button_delete"/>
@ -376,6 +378,7 @@
<key id="key_goStartPage" keycode="VK_HOME" oncommand="goDoCommand('cmd_goStartPage')" modifiers="alt"/>
<key id="key_reply" key="&replyMsgCmd.key;" oncommand="goDoCommand('cmd_reply')" modifiers="accel"/>
<key id="key_replyall" key="&replyToAllMsgCmd.key;" oncommand="goDoCommand('cmd_replyall')" modifiers="accel, shift"/>
<key id="key_replylist" key="&replyToListMsgCmd.key;" oncommand="goDoCommand('cmd_replylist')" modifiers="accel, shift"/>
<key id="key_forward" key="&forwardMsgCmd.key;" oncommand="goDoCommand('cmd_forward')" modifiers="accel"/>
<key id="key_editAsNew" key="&editMsgAsNewCmd.key;" oncommand="goDoCommand('cmd_editAsNew')" modifiers="accel"/>
<key id="key_watchThread" key="&watchThreadMenu.key;" oncommand="goDoCommand('cmd_watchThread')" />
@ -536,6 +539,10 @@
label="&contextReplyAll.label;"
accesskey="&contextReplyAll.accesskey;"
oncommand="MsgReplyToAllMessage(event);"/>
<menuitem id="mailContext-replyList"
label="&contextReplyList.label;"
accesskey="&contextReplyList.accesskey;"
oncommand="MsgReplyToListMessage(event);"/>
<menuitem id="mailContext-forward"
label="&contextForward.label;"
accesskey="&contextForward.accesskey;"
@ -1252,6 +1259,10 @@
accesskey="&replyToAllMsgCmd.accesskey;"
key="key_replyall"
command="cmd_replyall"/>
<menuitem id="menu_replyToList" label="&replyToListMsgCmd.label;"
accesskey="&replyToListMsgCmd.accesskey;"
key="key_replylist"
command="cmd_replylist"/>
<menuitem id="menu_forwardMsg" label="&forwardMsgCmd.label;"
accesskey="&forwardMsgCmd.accesskey;"
key="key_forward"
@ -1497,6 +1508,12 @@
tooltiptext="&replyAllButton.tooltip;"
observes="button_replyall"
oncommand="MsgReplyToAllMessage(event)"/>
<toolbarbutton id="button-replylist"
class="toolbarbutton-1"
label="&replyListButton.label;"
tooltiptext="&replyListButton.tooltip;"
observes="button_replylist"
oncommand="MsgReplyToListMessage(event)"/>
<toolbarbutton id="button-forward"
class="toolbarbutton-1"
label="&forwardButton.label;"
@ -1703,9 +1720,9 @@
customizable="true"
context="toolbar-context-menu"
#ifdef XP_MACOSX
defaultset="button-getmsg,button-newmsg,button-address,spacer,button-reply,button-replyall,button-forward,spacer,button-tag,button-delete,button-junk,button-print,spacer,button-goback,button-goforward,spring,search-container,throbber-box">
defaultset="button-getmsg,button-newmsg,button-address,spacer,button-reply,button-replyall,button-replylist,button-forward,spacer,button-tag,button-delete,button-junk,button-print,spacer,button-goback,button-goforward,spring,search-container,throbber-box">
#else
defaultset="button-getmsg,button-newmsg,button-address,separator,button-reply,button-replyall,button-forward,separator,button-tag,button-delete,button-junk,button-print,separator,button-goback,button-goforward,spring,search-container">
defaultset="button-getmsg,button-newmsg,button-address,separator,button-reply,button-replyall,button-replylist,button-forward,separator,button-tag,button-delete,button-junk,button-print,separator,button-goback,button-goforward,spring,search-container">
#endif
</toolbar>
<toolbarset id="customToolbars" context="toolbar-context-menu"/>

Просмотреть файл

@ -178,6 +178,9 @@ nsMsgDBViewCommandUpdater.prototype =
goUpdateCommand("button_junk");
goUpdateCommand("button_goBack");
goUpdateCommand("button_goForward");
goUpdateCommand("button_reply");
goUpdateCommand("button_replyall");
goUpdateCommand("button_replylist");
},
updateNextMessageAfterDelete : function()
@ -778,6 +781,8 @@ var MessageWindowController =
case "cmd_replyGroup":
case "cmd_replyall":
case "button_replyall":
case "cmd_replylist":
case "button_replylist":
case "cmd_archive":
case "button_archive":
case "cmd_forward":
@ -849,6 +854,8 @@ var MessageWindowController =
case "cmd_replyGroup":
case "cmd_replyall":
case "button_replyall":
case "cmd_replylist":
case "button_replylist":
case "cmd_forward":
case "button_forward":
case "cmd_forwardInline":
@ -974,6 +981,9 @@ var MessageWindowController =
case "cmd_replyall":
MsgReplyToAllMessage(null);
break;
case "cmd_replylist":
MsgReplyToListMessage(null);
break;
case "cmd_forward":
MsgForwardMessage(null);
break;

Просмотреть файл

@ -415,6 +415,7 @@ var messageHeaderSink = {
UpdateMessageHeaders();
ShowEditMessageBox();
UpdateJunkButton();
UpdateReplyButtons();
for (index in gMessageListeners)
gMessageListeners[index].onEndHeaders();
@ -455,6 +456,8 @@ var messageHeaderSink = {
this.mDummyMsgHeader.replyTo = header.headerValue;
else if (lowerCaseHeaderName == "message-id")
this.mDummyMsgHeader.messageId = header.headerValue;
else if (lowerCaseHeaderName == "list-post")
this.mDummyMsgHeader.listPost = header.headerValue;
}
// according to RFC 2822, certain headers
@ -786,6 +789,7 @@ function updateHeaderViews()
showHeaderView(gExpandedHeaderView);
}
UpdateJunkButton();
UpdateReplyButtons();
displayAttachmentsForExpandedView();
}
@ -1996,6 +2000,7 @@ nsDummyMsgHeader.prototype =
from : null,
subject : null,
ccList : null,
listPost : null,
messageId : null,
accountKey : "",
folder : null

Просмотреть файл

@ -332,6 +332,9 @@ you can use these alternative items. Otherwise, their values should be empty. -
<!ENTITY replyToAllMsgCmd.label "Reply to All">
<!ENTITY replyToAllMsgCmd.accesskey "p">
<!ENTITY replyToAllMsgCmd.key "r">
<!ENTITY replyToListMsgCmd.label "Reply to List">
<!ENTITY replyToListMsgCmd.accesskey "L">
<!ENTITY replyToListMsgCmd.key "l">
<!ENTITY forwardMsgCmd.label "Forward">
<!ENTITY forwardMsgCmd.accesskey "F">
<!ENTITY forwardMsgCmd.key "l">
@ -461,6 +464,7 @@ you can use these alternative items. Otherwise, their values should be empty. -
<!ENTITY newMsgButton.label "Write">
<!ENTITY replyButton.label "Reply">
<!ENTITY replyAllButton.label "Reply All">
<!ENTITY replyListButton.label "Reply to List">
<!ENTITY forwardButton.label "Forward">
<!ENTITY fileButton.label "File">
<!ENTITY nextButton.label "Next">
@ -492,6 +496,7 @@ you can use these alternative items. Otherwise, their values should be empty. -
<!ENTITY newMsgButton.tooltip "Create a new message">
<!ENTITY replyButton.tooltip "Reply to the message">
<!ENTITY replyAllButton.tooltip "Reply to sender and all recipients">
<!ENTITY replyListButton.tooltip "Reply to mailing list">
<!ENTITY forwardButton.tooltip "Forward selected message">
<!ENTITY fileButton.tooltip "File selected message">
<!ENTITY nextButton.tooltip "Move to the next unread message">
@ -654,6 +659,8 @@ you can use these alternative items. Otherwise, their values should be empty. -
<!ENTITY contextReplyNewsgroup.accesskey "y">
<!ENTITY contextReplyAll.label "Reply to All">
<!ENTITY contextReplyAll.accesskey "A">
<!ENTITY contextReplyList.label "Reply to List">
<!ENTITY contextReplyList.accesskey "L">
<!ENTITY contextForward.label "Forward">
<!ENTITY contextForward.accesskey "F">
<!ENTITY contextForwardAsAttachment.label "Forward as Attachments">

Просмотреть файл

@ -60,6 +60,7 @@
<!ENTITY archiveButton.label "archive">
<!ENTITY hdrReplyButton.label "reply">
<!ENTITY hdrReplyAllButton.label "reply all">
<!ENTITY hdrReplyListButton.label "reply list">
<!ENTITY hdrForwardButton.label "forward">
<!ENTITY hdrJunkButton.label "junk">
<!ENTITY trashButton.tooltiptext "delete">

Просмотреть файл

@ -108,6 +108,18 @@
-moz-image-region: rect(48px 120px 72px 96px) !important;
}
#button-replylist {
-moz-image-region: rect(0px 120px 24px 96px);
}
#button-replylist:hover {
-moz-image-region: rect(24px 120px 48px 96px);
}
#button-replylist[disabled] {
-moz-image-region: rect(48px 120px 72px 96px) !important;
}
#button-forward {
-moz-image-region: rect(0px 144px 24px 120px);
}
@ -327,6 +339,18 @@ toolbar[iconsize="small"] #button-replyall[disabled] {
-moz-image-region: rect(32px 80px 48px 64px) !important;
}
toolbar[iconsize="small"] #button-replylist {
-moz-image-region: rect(0px 80px 16px 64px);
}
toolbar[iconsize="small"] #button-replylist:hover {
-moz-image-region: rect(16px 80px 32px 64px);
}
toolbar[iconsize="small"] #button-replylist[disabled] {
-moz-image-region: rect(32px 80px 48px 64px) !important;
}
toolbar[iconsize="small"] #button-forward {
-moz-image-region: rect(0px 96px 16px 80px);
}

Просмотреть файл

@ -139,6 +139,18 @@ toolbar[mode="text"] .toolbarbutton-menubutton-button > .toolbarbutton-text {
-moz-image-region: rect(64px 160px 96px 128px) !important;
}
#button-replylist {
-moz-image-region: rect(0px 160px 32px 128px);
}
#button-replylist:hover:active {
-moz-image-region: rect(32px 160px 64px 128px);
}
#button-replylist[disabled] {
-moz-image-region: rect(64px 160px 96px 128px) !important;
}
#button-forward {
-moz-image-region: rect(0px 192px 32px 160px);
}
@ -369,6 +381,18 @@ toolbar[iconsize="small"] #button-replyall[disabled] {
-moz-image-region: rect(48px 120px 72px 96px) !important;
}
toolbar[iconsize="small"] #button-replylist {
-moz-image-region: rect(0px 120px 24px 96px);
}
toolbar[iconsize="small"] #button-replylist:hover:active {
-moz-image-region: rect(24px 120px 48px 96px);
}
toolbar[iconsize="small"] #button-replylist[disabled] {
-moz-image-region: rect(48px 120px 72px 96px) !important;
}
toolbar[iconsize="small"] #button-forward {
-moz-image-region: rect(0px 144px 24px 120px);
}

Просмотреть файл

@ -112,6 +112,18 @@
-moz-image-region: rect(48px 120px 72px 96px) !important;
}
#button-replylist {
-moz-image-region: rect(0px 120px 24px 96px);
}
#button-replylist:hover {
-moz-image-region: rect(24px 120px 48px 96px);
}
#button-replylist[disabled] {
-moz-image-region: rect(48px 120px 72px 96px) !important;
}
#button-forward {
-moz-image-region: rect(0px 144px 24px 120px);
}
@ -335,6 +347,18 @@ toolbar[iconsize="small"] #button-replyall[disabled] {
-moz-image-region: rect(32px 80px 48px 64px) !important;
}
toolbar[iconsize="small"] #button-replylist {
-moz-image-region: rect(0px 80px 16px 64px);
}
toolbar[iconsize="small"] #button-replylist:hover {
-moz-image-region: rect(16px 80px 32px 64px);
}
toolbar[iconsize="small"] #button-replylist[disabled] {
-moz-image-region: rect(32px 80px 48px 64px) !important;
}
toolbar[iconsize="small"] #button-forward {
-moz-image-region: rect(0px 96px 16px 80px);
}

Просмотреть файл

@ -241,6 +241,7 @@ nsresult nsMimeHtmlDisplayEmitter::BroadcastHeaders(nsIMsgHeaderSink * aHeaderSi
PL_strcasecmp("content-type", headerInfo->name) && PL_strcasecmp("message-id", headerInfo->name) &&
PL_strcasecmp("x-newsreader", headerInfo->name) && PL_strcasecmp("x-mimeole", headerInfo->name) &&
PL_strcasecmp("references", headerInfo->name) && PL_strcasecmp("in-reply-to", headerInfo->name) &&
PL_strcasecmp("list-post", headerInfo->name) &&
// make headerStr lower case because IndexOf is case-sensitive
(!extraExpandedHeadersArray.Length() || (ToLowerCase(headerStr),
extraExpandedHeadersArray.IndexOf(headerStr) ==