Loading mailnews/compose/public/nsIMsgCompose.idl +3 −5 Original line number Diff line number Diff line Loading @@ -95,9 +95,9 @@ interface nsIMsgComposeStateListener : nsISupports { /* ... */ void NotifyComposeFieldsReady(); void SendAndSaveProcessDone(); }; [scriptable, uuid(4E606270-B588-11D2-8289-00805F2A0107)] interface nsIMsgCompose : nsISupports { Loading @@ -118,15 +118,13 @@ interface nsIMsgCompose : nsISupports { /* ... */ void SendMsg(in MSG_DeliverMode deliverMode, in nsIMsgIdentity identity, in wstring callback); in nsIMsgIdentity identity); /* ... */ void SendMsgEx(in MSG_DeliverMode deliverMode, in nsIMsgIdentity identity, in wstring addrTo, in wstring addrCc, in wstring addrBcc, in wstring newsgroup, in wstring subject, in wstring body, in wstring callback); in wstring newsgroup, in wstring subject, in wstring body); /* ... */ void CloseWindow(); Loading mailnews/compose/resources/content/MsgComposeCommands.js +100 −2 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ var msgCompose = null; var MAX_RECIPIENTS = 0; var currentAttachment = null; var documentLoaded = false; var windowLocked = false; var contentChanged = false; var Bundle = srGetStrBundle("chrome://messenger/locale/messengercompose/composeMsgs.properties"); Loading Loading @@ -65,9 +66,13 @@ if (prefs) { var stateListener = { NotifyComposeFieldsReady: function() { // dump("\n RECEIVE NotifyComposeFieldsReady\n\n"); documentLoaded = true; msgCompose.UnregisterStateListener(stateListener); }, SendAndSaveProcessDone: function() { dump("\n RECEIVE SaveAndSendProcessDone\n\n"); windowLocked = false; CommandUpdate_MsgCompose(); } }; Loading @@ -76,6 +81,92 @@ var currentMailSendCharset = null; var g_send_default_charset = null; var g_charsetTitle = null; var defaultController = { supportsCommand: function(command) { switch (command) { case "cmd_sendNow": case "cmd_sendLater": case "cmd_saveDefault": case "cmd_saveAsDraft": case "cmd_saveAsTemplate": case "cmd_attachFile": case "cmd_selectAddress": return true; default: return false; } }, isCommandEnabled: function(command) { switch (command) { case "cmd_sendNow": case "cmd_sendLater": case "cmd_saveDefault": case "cmd_saveAsDraft": case "cmd_saveAsTemplate": case "cmd_attachFile": case "cmd_selectAddress": return !windowLocked; default: return false; } }, doCommand: function(command) { dump("DefaultController:doCommand\n"); /* Because disabled button still fire oncommand event, we need to test again!!! */ if (defaultController.isCommandEnabled(command)) switch (command) { case "cmd_sendNow" : SendMessage(); break; case "cmd_sendLater" : SendMessageLater(); break; case "cmd_saveDefault" : SaveAsDraft(); break; /* TEMPORARY: We should save either as file, as draft or template, depending of last save type */ case "cmd_saveAsDraft" : SaveAsDraft(); break; case "cmd_saveAsTemplate" : SaveAsTemplate(); break; case "cmd_attachFile" : AttachFile(); break; case "cmd_selectAddress" : SelectAddress(); break; default: return; } }, onEvent: function(event) { dump("DefaultController:onEvent\n"); } } function SetupCommandUpdateHandlers() { dump("SetupCommandUpdateHandlers\n"); top.controllers.insertControllerAt(0, defaultController); } function CommandUpdate_MsgCompose() { dump("CommandUpdate_MsgCompose\n"); goUpdateCommand("cmd_sendNow"); goUpdateCommand("cmd_sendLater"); goUpdateCommand("cmd_saveDefault"); goUpdateCommand("cmd_saveAsDraft"); goUpdateCommand("cmd_saveAsTemplate"); goUpdateCommand("cmd_attachFile"); goUpdateCommand("cmd_selectAddress"); } function ToggleWindowLock() { windowLocked = !windowLocked; CommandUpdate_MsgCompose(); } function GetArgs() { var args = new Object(); Loading Loading @@ -305,6 +396,8 @@ function ComposeLoad() { dump("\nComposeLoad from XUL\n"); SetupCommandUpdateHandlers(); verifyAccounts(); // this will do migration, if we need to. var selectNode = document.getElementById('msgRecipientType#1'); Loading @@ -330,6 +423,7 @@ function ComposeUnload(calledFromExit) { dump("\nComposeUnload from XUL\n"); msgCompose.UnregisterStateListener(stateListener); if (msgCompose && msgComposeService) msgComposeService.DisposeCompose(msgCompose, false); //...and what's about the editor appcore, how can we release it? Loading Loading @@ -552,12 +646,16 @@ function GenericSendMessage( msgType ) } } try { windowLocked = true; CommandUpdate_MsgCompose(); msgCompose.SendMsg(msgType, getCurrentIdentity(), null); contentChanged = false; msgCompose.bodyModified = false; } catch (ex) { dump("failed to SendMsg\n"); windowLocked = false; CommandUpdate_MsgCompose(); } } } Loading mailnews/compose/resources/content/messengercompose.xul +33 −61 Original line number Diff line number Diff line Loading @@ -72,6 +72,11 @@ Rights Reserved. <script language="JavaScript" src="chrome://messenger/content/messengercompose/MsgComposeCommands.js"/> <commands id="commands"> <commandset id="msgComposeCommandUpdate" commandupdater="true" events="focus,tree-select" oncommandupdate="CommandUpdate_MsgCompose()" /> <commandset id="globalEditMenuItems"/> <commandset id="selectEditMenuItems"/> <commandset id="undoEditMenuItems"/> Loading @@ -89,10 +94,13 @@ Rights Reserved. <broadcaster id="cmd_newNavigator"/> <broadcaster id="cmd_newEditor"/> <broadcaster id="cmd_close" oncommand="if (ComposeCanClose()) CloseWindow()"/> <broadcaster id="cmd_attachFile" oncommand="AttachFile()"/> <broadcaster id="cmd_selectAddress" oncommand="SelectAddress()"/> <broadcaster id="cmd_sendNow" oncommand="SendMessage()"/> <broadcaster id="cmd_sendLater" oncommand="SendMessageLater()"/> <broadcaster id="cmd_saveDefault" oncommand="goDoCommand('cmd_saveDefault')"/> <broadcaster id="cmd_saveAsDraft" oncommand="goDoCommand('cmd_saveAsDraft')"/> <broadcaster id="cmd_saveAsTemplate" oncommand="goDoCommand('cmd_saveAsTemplate')"/> <broadcaster id="cmd_attachFile" oncommand="goDoCommand('cmd_attachFile')"/> <broadcaster id="cmd_selectAddress" oncommand="goDoCommand('cmd_selectAddress')"/> <broadcaster id="cmd_sendNow" oncommand="goDoCommand('cmd_sendNow')"/> <broadcaster id="cmd_sendLater" oncommand="goDoCommand('cmd_sendLater')"/> <broadcaster id="cmd_print" oncommand="nsCmd:BrowserPrint"/> <broadcaster id="cmd_quit"/> <!-- Edit Menu --> Loading Loading @@ -124,7 +132,7 @@ Rights Reserved. <!-- File Menu --> <key id="key_newNavigator"/> <key id="key_close"/> <key id="key_save" xulkey="true" key="&saveCmd.key;" disabled="true"/> <key id="key_save" xulkey="true" key="&saveCmd.key;" observes="cmd_saveDefault"/> <!-- key id="key_attachFile" xulkey="true" key="&attachFileCmd.key;" observes="cmd_attachFile"/ --> <!-- key id="key_selectAddresses" xulkey="true" key="&selectAddressCmd.key;" observes="cmd_selectAddress"/ --> <!-- key id="key_sendNow" xulkey="true" keycode="&sendNowCmd.keycode;" observes="cmd_sendNow"/ --> Loading Loading @@ -187,13 +195,13 @@ ACTUALLY, EVERY TIME YOU TYPE ANY OF THE KEY DEFINED HERE AFTER WITHOUT ANY OF T <menuseparator/> <menuitem id="menu_close"/> <menuitem value="&saveCmd.label;" disabled="true" key="key_save"/> <menuitem value="&saveCmd.label;" key="key_save" observes="cmd_saveDefault"/> <menu value="&saveAsCmd.label;" accessKey="&saveAsCmd.accesskey;"> <menupopup> <menuitem value="&saveAsFileCmd.label;" disabled="true" accessKey="&saveAsFileCmd.accesskey;"/> <menuseparator/> <menuitem value="&saveAsDraftCmd.label;" accessKey="&saveAsDraftCmd.accesskey;" oncommand="SaveAsDraft()"/> <menuitem value="&saveAsTemplateCmd.label;" accessKey="&saveAsTemplateCmd.accesskey;" oncommand="SaveAsTemplate()"/> <menuitem value="&saveAsDraftCmd.label;" accessKey="&saveAsDraftCmd.accesskey;" observes="cmd_saveAsDraft"/> <menuitem value="&saveAsTemplateCmd.label;" accessKey="&saveAsTemplateCmd.accesskey;" observes="cmd_saveAsTemplate"/> </menupopup> </menu> <menuseparator/> Loading Loading @@ -257,42 +265,6 @@ ACTUALLY, EVERY TIME YOU TYPE ANY OF THE KEY DEFINED HERE AFTER WITHOUT ANY OF T <menuseparator/> <menuitem value="&pageInfoCmd.label;" disabled="true" accesskey="&pageInfoCmd.accesskey;" cmd="nsCmd:ComposeNYI"/> <menuseparator/> <!-- Deprecated BEGIN <menu value="&dcharMenu.label;" oncreate="InitCharsetMenuCheckMark();"> <menupopup> <menuitem id="ISO-8859-1" type="radio" name="charsetGroup" value="&dcharIso1Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-2" type="radio" name="charsetGroup" value="&dcharIso2Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-3" type="radio" name="charsetGroup" value="&dcharIso3Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-4" type="radio" name="charsetGroup" value="&dcharIso4Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-9" type="radio" name="charsetGroup" value="&dcharIso9Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-10" type="radio" name="charsetGroup" value="&dcharIso10Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id= "ISO-8859-14" type="radio" name="charsetGroup" value="&dcharIso14Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-15" type="radio" name="charsetGroup" value="&dcharIso15Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="ISO-2022-JP" type="radio" name="charsetGroup" value="&dcharJapanCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="BIG5" type="radio" name="charsetGroup" value="&dcharTradChiBigCmd.label;" oncommand="SetDocumentCharacterSet('Big5');"/> <menuitem id="GB2312" type="radio" name="charsetGroup" value="&dcharSimpChiGbCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="EUC-KR" type="radio" name="charsetGroup" value="&dcharKoreanCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="UTF-8" type="radio" name="charsetGroup" value="&dcharUtf8Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="KOI8-R" type="radio" name="charsetGroup" value="&dcharRusCmd.label; " oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="KOI8-U" type="radio" name="charsetGroup" value="&dcharUkrCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="ISO-8859-7" type="radio" name="charsetGroup" value="&dcharIsoGreekCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="VISCII" type="radio" name="charsetGroup" value="&dcharVietViCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="TIS-620" type="radio" name="charsetGroup" value="&dcharThaiCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="ARMSCII-8" type="radio" name="charsetGroup" value="&dcharArmCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem value="&dcharDEFAULT.label;" oncommand="SetDefaultMailSendCharacterSet();"/> </menupopup> </menu> END of Deprecated --> <menu id = "maileditCharsetMenu" /> </menupopup> </menu> Loading Loading @@ -402,15 +374,15 @@ END of Deprecated --> </menubar> <toolbar class="toolbar-primary" id="composeToolbar" persist="collapsed"> <box id="toolbar_button_box"> <button class="button-toolbar-2 top" id="button-send" value="&sendButton.label;" tooltip="aTooltip" tooltiptext="&sendButton.tooltip;" onclick="SendMessage()"/> <button class="button-toolbar-2 top" id="button-send" value="&sendButton.label;" tooltip="aTooltip" tooltiptext="&sendButton.tooltip;" observes="cmd_sendNow"/> <toolbarseparator/> <button class="button-toolbar-2 top" id="button-address" value="&addressButton.label;" tooltip="aTooltip" tooltiptext="&addressButton.tooltip;" onclick="SelectAddress()"/> <button class="button-toolbar-2 top" id="button-attach" value="&attachButton.label;" tooltip="aTooltip" tooltiptext="&attachButton.tooltip;" onclick="AttachFile()"/> <button class="button-toolbar-2 top" id="button-quote" disabled="true" value=""eButton.label;" tooltip="aTooltip" tooltiptext=""eButton.tooltip;" onclick="QuoteMessage()"/> <button class="button-toolbar-2 top" id="button-address" value="&addressButton.label;" tooltip="aTooltip" tooltiptext="&addressButton.tooltip;" observes="cmd_selectAddress"/> <button class="button-toolbar-2 top" id="button-attach" value="&attachButton.label;" tooltip="aTooltip" tooltiptext="&attachButton.tooltip;" observes="cmd_attachFile"/> <button class="button-toolbar-2 top" id="button-quote" disabled="true" value=""eButton.label;" tooltip="aTooltip" tooltiptext=""eButton.tooltip;" onclick="if (this.getAttribute('disabled') != 'true') QuoteMessage()"/> <button class="button-toolbar-2 top" id="spellingButton" value="&spellingButton.label;" observes="cmd_spelling"/> <toolbarseparator/> <button class="button-toolbar-2 top" id="button-save" value="&saveButton.label;" tooltip="aTooltip" tooltiptext="&saveButton.tooltip;" onclick="SaveAsDraft()"/> <button class="button-toolbar-2 top" id="button-stop" disabled="true" value="&stopButton.label;" tooltip="aTooltip" tooltiptext="&stopButton.tooltip;" onclick="Stop()"/> <button class="button-toolbar-2 top" id="button-save" value="&saveButton.label;" tooltip="aTooltip" tooltiptext="&saveButton.tooltip;" observes="cmd_saveDefault"/> <button class="button-toolbar-2 top" id="button-stop" disabled="true" value="&stopButton.label;" tooltip="aTooltip" tooltiptext="&stopButton.tooltip;" onclick="if (this.getAttribute('disabled') != 'true') Stop()"/> <spring flex="100%"/> </box> <button class="plain" id="navigator-throbber" oncommand='goClickThrobber("compose.throbber.url")'> Loading mailnews/compose/resources/locale/en-US/messengercompose.dtd +1 −1 Original line number Diff line number Diff line Loading @@ -10,7 +10,7 @@ <!-- File menu items --> <!ENTITY newMessage.label "New Message"> <!ENTITY newMessage.accesskey "n"> <!ENTITY saveCmd.label ".Save"> <!ENTITY saveCmd.label "Save"> <!ENTITY saveCmd.key "S"> <!ENTITY saveAsCmd.label "Save As"> <!ENTITY saveAsCmd.accesskey "s"> Loading mailnews/compose/src/nsMsgCompose.cpp +39 −40 Original line number Diff line number Diff line Loading @@ -465,9 +465,7 @@ nsresult nsMsgCompose::UnregisterStateListener(nsIMsgComposeStateListener *state return mStateListeners->RemoveElement(iSupports); } nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity, const PRUnichar *callback) nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity) { nsresult rv = NS_OK; Loading Loading @@ -612,17 +610,6 @@ nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, if (NS_SUCCEEDED(rv)) { /*TODO, don't close the window but just hide it, we will close it later when we receive a call back from the BE if (nsnull != mScriptContext) { const char* url = ""; PRBool isUndefined = PR_FALSE; nsString rVal; mScriptContext->EvaluateString(mScript, url, 0, rVal, &isUndefined); CloseWindow(); } else // If we don't have a JS callback, then close the window by default! */ // rhp: // We shouldn't close the window if we are just saving a draft or a template // so do this check Loading @@ -630,13 +617,14 @@ nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, (deliverMode != nsIMsgSend::nsMsgSaveAsTemplate) ) ShowWindow(PR_FALSE); } else NotifyStateListeners(eSaveAndSendProcessDone); return rv; } nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity, const PRUnichar *callback) nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity) { nsresult rv = NS_OK; Loading Loading @@ -695,7 +683,7 @@ nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, } } rv = _SendMsg(deliverMode, identity, callback); rv = _SendMsg(deliverMode, identity); if (NS_FAILED(rv)) { ShowWindow(PR_TRUE); Loading @@ -712,8 +700,7 @@ nsMsgCompose::SendMsgEx(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity, const PRUnichar *addrTo, const PRUnichar *addrCc, const PRUnichar *addrBcc, const PRUnichar *newsgroup, const PRUnichar *subject, const PRUnichar *body, const PRUnichar *callback) const PRUnichar *subject, const PRUnichar *body) { nsresult rv = NS_OK; Loading Loading @@ -791,7 +778,7 @@ nsMsgCompose::SendMsgEx(MSG_DeliverMode deliverMode, m_compFields->SetBody(bodyCStr); } rv = _SendMsg(deliverMode, identity, callback); rv = _SendMsg(deliverMode, identity); } else rv = NS_ERROR_NOT_INITIALIZED; Loading Loading @@ -1709,12 +1696,18 @@ nsresult nsMsgComposeSendListener::OnStopSending(const char *aMsgID, nsresult aS if (fieldsFCC && *fieldsFCC) { if (nsCRT::strcasecmp(fieldsFCC, "nocopy://") == 0) { mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->CloseWindow(); } } } else { mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->CloseWindow(); // if we fail on the simple GetFcc call, close the window to be safe and avoid // windows hanging around to prevent the app from exiting. } NS_IF_RELEASE(compFields); } Loading @@ -1723,6 +1716,7 @@ nsresult nsMsgComposeSendListener::OnStopSending(const char *aMsgID, nsresult aS #ifdef NS_DEBUG printf("nsMsgComposeSendListener: the message send operation failed!\n"); #endif mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->ShowWindow(PR_TRUE); } } Loading Loading @@ -1764,6 +1758,7 @@ nsMsgComposeSendListener::OnStopCopy(nsresult aStatus) #ifdef NS_DEBUG printf("nsMsgComposeSendListener: Success on the message copy operation!\n"); #endif mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); // We should only close the window if we are done. Things like templates // and drafts aren't done so their windows should stay open if ( (mDeliverMode != nsIMsgSend::nsMsgSaveAsDraft) && Loading @@ -1775,6 +1770,7 @@ nsMsgComposeSendListener::OnStopCopy(nsresult aStatus) #ifdef NS_DEBUG printf("nsMsgComposeSendListener: the message copy operation failed!\n"); #endif mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->ShowWindow(PR_TRUE); } } Loading Loading @@ -2161,27 +2157,30 @@ nsresult nsMsgCompose::NotifyStateListeners(TStateListenerNotification aNotifica if (NS_FAILED(rv)) return rv; PRUint32 i; switch (aNotificationType) { case eComposeFieldsReady: for (i = 0; i < numListeners;i++) { nsCOMPtr<nsISupports> iSupports = getter_AddRefs(mStateListeners->ElementAt(i)); nsCOMPtr<nsIMsgComposeStateListener> thisListener = do_QueryInterface(iSupports); if (thisListener) { rv = thisListener->NotifyComposeFieldsReady(); if (NS_FAILED(rv)) switch (aNotificationType) { case eComposeFieldsReady: thisListener->NotifyComposeFieldsReady(); break; } } case eSaveAndSendProcessDone: thisListener->SendAndSaveProcessDone(); break; default: NS_NOTREACHED("Unknown notification"); break; } } } return rv; return NS_OK; } nsresult nsMsgCompose::AttachmentPrettyName(const PRUnichar* url, PRUnichar** _retval) Loading Loading
mailnews/compose/public/nsIMsgCompose.idl +3 −5 Original line number Diff line number Diff line Loading @@ -95,9 +95,9 @@ interface nsIMsgComposeStateListener : nsISupports { /* ... */ void NotifyComposeFieldsReady(); void SendAndSaveProcessDone(); }; [scriptable, uuid(4E606270-B588-11D2-8289-00805F2A0107)] interface nsIMsgCompose : nsISupports { Loading @@ -118,15 +118,13 @@ interface nsIMsgCompose : nsISupports { /* ... */ void SendMsg(in MSG_DeliverMode deliverMode, in nsIMsgIdentity identity, in wstring callback); in nsIMsgIdentity identity); /* ... */ void SendMsgEx(in MSG_DeliverMode deliverMode, in nsIMsgIdentity identity, in wstring addrTo, in wstring addrCc, in wstring addrBcc, in wstring newsgroup, in wstring subject, in wstring body, in wstring callback); in wstring newsgroup, in wstring subject, in wstring body); /* ... */ void CloseWindow(); Loading
mailnews/compose/resources/content/MsgComposeCommands.js +100 −2 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ var msgCompose = null; var MAX_RECIPIENTS = 0; var currentAttachment = null; var documentLoaded = false; var windowLocked = false; var contentChanged = false; var Bundle = srGetStrBundle("chrome://messenger/locale/messengercompose/composeMsgs.properties"); Loading Loading @@ -65,9 +66,13 @@ if (prefs) { var stateListener = { NotifyComposeFieldsReady: function() { // dump("\n RECEIVE NotifyComposeFieldsReady\n\n"); documentLoaded = true; msgCompose.UnregisterStateListener(stateListener); }, SendAndSaveProcessDone: function() { dump("\n RECEIVE SaveAndSendProcessDone\n\n"); windowLocked = false; CommandUpdate_MsgCompose(); } }; Loading @@ -76,6 +81,92 @@ var currentMailSendCharset = null; var g_send_default_charset = null; var g_charsetTitle = null; var defaultController = { supportsCommand: function(command) { switch (command) { case "cmd_sendNow": case "cmd_sendLater": case "cmd_saveDefault": case "cmd_saveAsDraft": case "cmd_saveAsTemplate": case "cmd_attachFile": case "cmd_selectAddress": return true; default: return false; } }, isCommandEnabled: function(command) { switch (command) { case "cmd_sendNow": case "cmd_sendLater": case "cmd_saveDefault": case "cmd_saveAsDraft": case "cmd_saveAsTemplate": case "cmd_attachFile": case "cmd_selectAddress": return !windowLocked; default: return false; } }, doCommand: function(command) { dump("DefaultController:doCommand\n"); /* Because disabled button still fire oncommand event, we need to test again!!! */ if (defaultController.isCommandEnabled(command)) switch (command) { case "cmd_sendNow" : SendMessage(); break; case "cmd_sendLater" : SendMessageLater(); break; case "cmd_saveDefault" : SaveAsDraft(); break; /* TEMPORARY: We should save either as file, as draft or template, depending of last save type */ case "cmd_saveAsDraft" : SaveAsDraft(); break; case "cmd_saveAsTemplate" : SaveAsTemplate(); break; case "cmd_attachFile" : AttachFile(); break; case "cmd_selectAddress" : SelectAddress(); break; default: return; } }, onEvent: function(event) { dump("DefaultController:onEvent\n"); } } function SetupCommandUpdateHandlers() { dump("SetupCommandUpdateHandlers\n"); top.controllers.insertControllerAt(0, defaultController); } function CommandUpdate_MsgCompose() { dump("CommandUpdate_MsgCompose\n"); goUpdateCommand("cmd_sendNow"); goUpdateCommand("cmd_sendLater"); goUpdateCommand("cmd_saveDefault"); goUpdateCommand("cmd_saveAsDraft"); goUpdateCommand("cmd_saveAsTemplate"); goUpdateCommand("cmd_attachFile"); goUpdateCommand("cmd_selectAddress"); } function ToggleWindowLock() { windowLocked = !windowLocked; CommandUpdate_MsgCompose(); } function GetArgs() { var args = new Object(); Loading Loading @@ -305,6 +396,8 @@ function ComposeLoad() { dump("\nComposeLoad from XUL\n"); SetupCommandUpdateHandlers(); verifyAccounts(); // this will do migration, if we need to. var selectNode = document.getElementById('msgRecipientType#1'); Loading @@ -330,6 +423,7 @@ function ComposeUnload(calledFromExit) { dump("\nComposeUnload from XUL\n"); msgCompose.UnregisterStateListener(stateListener); if (msgCompose && msgComposeService) msgComposeService.DisposeCompose(msgCompose, false); //...and what's about the editor appcore, how can we release it? Loading Loading @@ -552,12 +646,16 @@ function GenericSendMessage( msgType ) } } try { windowLocked = true; CommandUpdate_MsgCompose(); msgCompose.SendMsg(msgType, getCurrentIdentity(), null); contentChanged = false; msgCompose.bodyModified = false; } catch (ex) { dump("failed to SendMsg\n"); windowLocked = false; CommandUpdate_MsgCompose(); } } } Loading
mailnews/compose/resources/content/messengercompose.xul +33 −61 Original line number Diff line number Diff line Loading @@ -72,6 +72,11 @@ Rights Reserved. <script language="JavaScript" src="chrome://messenger/content/messengercompose/MsgComposeCommands.js"/> <commands id="commands"> <commandset id="msgComposeCommandUpdate" commandupdater="true" events="focus,tree-select" oncommandupdate="CommandUpdate_MsgCompose()" /> <commandset id="globalEditMenuItems"/> <commandset id="selectEditMenuItems"/> <commandset id="undoEditMenuItems"/> Loading @@ -89,10 +94,13 @@ Rights Reserved. <broadcaster id="cmd_newNavigator"/> <broadcaster id="cmd_newEditor"/> <broadcaster id="cmd_close" oncommand="if (ComposeCanClose()) CloseWindow()"/> <broadcaster id="cmd_attachFile" oncommand="AttachFile()"/> <broadcaster id="cmd_selectAddress" oncommand="SelectAddress()"/> <broadcaster id="cmd_sendNow" oncommand="SendMessage()"/> <broadcaster id="cmd_sendLater" oncommand="SendMessageLater()"/> <broadcaster id="cmd_saveDefault" oncommand="goDoCommand('cmd_saveDefault')"/> <broadcaster id="cmd_saveAsDraft" oncommand="goDoCommand('cmd_saveAsDraft')"/> <broadcaster id="cmd_saveAsTemplate" oncommand="goDoCommand('cmd_saveAsTemplate')"/> <broadcaster id="cmd_attachFile" oncommand="goDoCommand('cmd_attachFile')"/> <broadcaster id="cmd_selectAddress" oncommand="goDoCommand('cmd_selectAddress')"/> <broadcaster id="cmd_sendNow" oncommand="goDoCommand('cmd_sendNow')"/> <broadcaster id="cmd_sendLater" oncommand="goDoCommand('cmd_sendLater')"/> <broadcaster id="cmd_print" oncommand="nsCmd:BrowserPrint"/> <broadcaster id="cmd_quit"/> <!-- Edit Menu --> Loading Loading @@ -124,7 +132,7 @@ Rights Reserved. <!-- File Menu --> <key id="key_newNavigator"/> <key id="key_close"/> <key id="key_save" xulkey="true" key="&saveCmd.key;" disabled="true"/> <key id="key_save" xulkey="true" key="&saveCmd.key;" observes="cmd_saveDefault"/> <!-- key id="key_attachFile" xulkey="true" key="&attachFileCmd.key;" observes="cmd_attachFile"/ --> <!-- key id="key_selectAddresses" xulkey="true" key="&selectAddressCmd.key;" observes="cmd_selectAddress"/ --> <!-- key id="key_sendNow" xulkey="true" keycode="&sendNowCmd.keycode;" observes="cmd_sendNow"/ --> Loading Loading @@ -187,13 +195,13 @@ ACTUALLY, EVERY TIME YOU TYPE ANY OF THE KEY DEFINED HERE AFTER WITHOUT ANY OF T <menuseparator/> <menuitem id="menu_close"/> <menuitem value="&saveCmd.label;" disabled="true" key="key_save"/> <menuitem value="&saveCmd.label;" key="key_save" observes="cmd_saveDefault"/> <menu value="&saveAsCmd.label;" accessKey="&saveAsCmd.accesskey;"> <menupopup> <menuitem value="&saveAsFileCmd.label;" disabled="true" accessKey="&saveAsFileCmd.accesskey;"/> <menuseparator/> <menuitem value="&saveAsDraftCmd.label;" accessKey="&saveAsDraftCmd.accesskey;" oncommand="SaveAsDraft()"/> <menuitem value="&saveAsTemplateCmd.label;" accessKey="&saveAsTemplateCmd.accesskey;" oncommand="SaveAsTemplate()"/> <menuitem value="&saveAsDraftCmd.label;" accessKey="&saveAsDraftCmd.accesskey;" observes="cmd_saveAsDraft"/> <menuitem value="&saveAsTemplateCmd.label;" accessKey="&saveAsTemplateCmd.accesskey;" observes="cmd_saveAsTemplate"/> </menupopup> </menu> <menuseparator/> Loading Loading @@ -257,42 +265,6 @@ ACTUALLY, EVERY TIME YOU TYPE ANY OF THE KEY DEFINED HERE AFTER WITHOUT ANY OF T <menuseparator/> <menuitem value="&pageInfoCmd.label;" disabled="true" accesskey="&pageInfoCmd.accesskey;" cmd="nsCmd:ComposeNYI"/> <menuseparator/> <!-- Deprecated BEGIN <menu value="&dcharMenu.label;" oncreate="InitCharsetMenuCheckMark();"> <menupopup> <menuitem id="ISO-8859-1" type="radio" name="charsetGroup" value="&dcharIso1Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-2" type="radio" name="charsetGroup" value="&dcharIso2Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-3" type="radio" name="charsetGroup" value="&dcharIso3Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-4" type="radio" name="charsetGroup" value="&dcharIso4Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-9" type="radio" name="charsetGroup" value="&dcharIso9Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-10" type="radio" name="charsetGroup" value="&dcharIso10Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id= "ISO-8859-14" type="radio" name="charsetGroup" value="&dcharIso14Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="ISO-8859-15" type="radio" name="charsetGroup" value="&dcharIso15Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="ISO-2022-JP" type="radio" name="charsetGroup" value="&dcharJapanCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="BIG5" type="radio" name="charsetGroup" value="&dcharTradChiBigCmd.label;" oncommand="SetDocumentCharacterSet('Big5');"/> <menuitem id="GB2312" type="radio" name="charsetGroup" value="&dcharSimpChiGbCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="EUC-KR" type="radio" name="charsetGroup" value="&dcharKoreanCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="UTF-8" type="radio" name="charsetGroup" value="&dcharUtf8Cmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="KOI8-R" type="radio" name="charsetGroup" value="&dcharRusCmd.label; " oncommand="SetDocumentCharacterSet(this.id);"/> <menuitem id="KOI8-U" type="radio" name="charsetGroup" value="&dcharUkrCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="ISO-8859-7" type="radio" name="charsetGroup" value="&dcharIsoGreekCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="VISCII" type="radio" name="charsetGroup" value="&dcharVietViCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="TIS-620" type="radio" name="charsetGroup" value="&dcharThaiCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem id="ARMSCII-8" type="radio" name="charsetGroup" value="&dcharArmCmd.label;" oncommand="SetDocumentCharacterSet(this.id);"/> <menuseparator /> <menuitem value="&dcharDEFAULT.label;" oncommand="SetDefaultMailSendCharacterSet();"/> </menupopup> </menu> END of Deprecated --> <menu id = "maileditCharsetMenu" /> </menupopup> </menu> Loading Loading @@ -402,15 +374,15 @@ END of Deprecated --> </menubar> <toolbar class="toolbar-primary" id="composeToolbar" persist="collapsed"> <box id="toolbar_button_box"> <button class="button-toolbar-2 top" id="button-send" value="&sendButton.label;" tooltip="aTooltip" tooltiptext="&sendButton.tooltip;" onclick="SendMessage()"/> <button class="button-toolbar-2 top" id="button-send" value="&sendButton.label;" tooltip="aTooltip" tooltiptext="&sendButton.tooltip;" observes="cmd_sendNow"/> <toolbarseparator/> <button class="button-toolbar-2 top" id="button-address" value="&addressButton.label;" tooltip="aTooltip" tooltiptext="&addressButton.tooltip;" onclick="SelectAddress()"/> <button class="button-toolbar-2 top" id="button-attach" value="&attachButton.label;" tooltip="aTooltip" tooltiptext="&attachButton.tooltip;" onclick="AttachFile()"/> <button class="button-toolbar-2 top" id="button-quote" disabled="true" value=""eButton.label;" tooltip="aTooltip" tooltiptext=""eButton.tooltip;" onclick="QuoteMessage()"/> <button class="button-toolbar-2 top" id="button-address" value="&addressButton.label;" tooltip="aTooltip" tooltiptext="&addressButton.tooltip;" observes="cmd_selectAddress"/> <button class="button-toolbar-2 top" id="button-attach" value="&attachButton.label;" tooltip="aTooltip" tooltiptext="&attachButton.tooltip;" observes="cmd_attachFile"/> <button class="button-toolbar-2 top" id="button-quote" disabled="true" value=""eButton.label;" tooltip="aTooltip" tooltiptext=""eButton.tooltip;" onclick="if (this.getAttribute('disabled') != 'true') QuoteMessage()"/> <button class="button-toolbar-2 top" id="spellingButton" value="&spellingButton.label;" observes="cmd_spelling"/> <toolbarseparator/> <button class="button-toolbar-2 top" id="button-save" value="&saveButton.label;" tooltip="aTooltip" tooltiptext="&saveButton.tooltip;" onclick="SaveAsDraft()"/> <button class="button-toolbar-2 top" id="button-stop" disabled="true" value="&stopButton.label;" tooltip="aTooltip" tooltiptext="&stopButton.tooltip;" onclick="Stop()"/> <button class="button-toolbar-2 top" id="button-save" value="&saveButton.label;" tooltip="aTooltip" tooltiptext="&saveButton.tooltip;" observes="cmd_saveDefault"/> <button class="button-toolbar-2 top" id="button-stop" disabled="true" value="&stopButton.label;" tooltip="aTooltip" tooltiptext="&stopButton.tooltip;" onclick="if (this.getAttribute('disabled') != 'true') Stop()"/> <spring flex="100%"/> </box> <button class="plain" id="navigator-throbber" oncommand='goClickThrobber("compose.throbber.url")'> Loading
mailnews/compose/resources/locale/en-US/messengercompose.dtd +1 −1 Original line number Diff line number Diff line Loading @@ -10,7 +10,7 @@ <!-- File menu items --> <!ENTITY newMessage.label "New Message"> <!ENTITY newMessage.accesskey "n"> <!ENTITY saveCmd.label ".Save"> <!ENTITY saveCmd.label "Save"> <!ENTITY saveCmd.key "S"> <!ENTITY saveAsCmd.label "Save As"> <!ENTITY saveAsCmd.accesskey "s"> Loading
mailnews/compose/src/nsMsgCompose.cpp +39 −40 Original line number Diff line number Diff line Loading @@ -465,9 +465,7 @@ nsresult nsMsgCompose::UnregisterStateListener(nsIMsgComposeStateListener *state return mStateListeners->RemoveElement(iSupports); } nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity, const PRUnichar *callback) nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity) { nsresult rv = NS_OK; Loading Loading @@ -612,17 +610,6 @@ nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, if (NS_SUCCEEDED(rv)) { /*TODO, don't close the window but just hide it, we will close it later when we receive a call back from the BE if (nsnull != mScriptContext) { const char* url = ""; PRBool isUndefined = PR_FALSE; nsString rVal; mScriptContext->EvaluateString(mScript, url, 0, rVal, &isUndefined); CloseWindow(); } else // If we don't have a JS callback, then close the window by default! */ // rhp: // We shouldn't close the window if we are just saving a draft or a template // so do this check Loading @@ -630,13 +617,14 @@ nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, (deliverMode != nsIMsgSend::nsMsgSaveAsTemplate) ) ShowWindow(PR_FALSE); } else NotifyStateListeners(eSaveAndSendProcessDone); return rv; } nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity, const PRUnichar *callback) nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity) { nsresult rv = NS_OK; Loading Loading @@ -695,7 +683,7 @@ nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, } } rv = _SendMsg(deliverMode, identity, callback); rv = _SendMsg(deliverMode, identity); if (NS_FAILED(rv)) { ShowWindow(PR_TRUE); Loading @@ -712,8 +700,7 @@ nsMsgCompose::SendMsgEx(MSG_DeliverMode deliverMode, nsIMsgIdentity *identity, const PRUnichar *addrTo, const PRUnichar *addrCc, const PRUnichar *addrBcc, const PRUnichar *newsgroup, const PRUnichar *subject, const PRUnichar *body, const PRUnichar *callback) const PRUnichar *subject, const PRUnichar *body) { nsresult rv = NS_OK; Loading Loading @@ -791,7 +778,7 @@ nsMsgCompose::SendMsgEx(MSG_DeliverMode deliverMode, m_compFields->SetBody(bodyCStr); } rv = _SendMsg(deliverMode, identity, callback); rv = _SendMsg(deliverMode, identity); } else rv = NS_ERROR_NOT_INITIALIZED; Loading Loading @@ -1709,12 +1696,18 @@ nsresult nsMsgComposeSendListener::OnStopSending(const char *aMsgID, nsresult aS if (fieldsFCC && *fieldsFCC) { if (nsCRT::strcasecmp(fieldsFCC, "nocopy://") == 0) { mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->CloseWindow(); } } } else { mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->CloseWindow(); // if we fail on the simple GetFcc call, close the window to be safe and avoid // windows hanging around to prevent the app from exiting. } NS_IF_RELEASE(compFields); } Loading @@ -1723,6 +1716,7 @@ nsresult nsMsgComposeSendListener::OnStopSending(const char *aMsgID, nsresult aS #ifdef NS_DEBUG printf("nsMsgComposeSendListener: the message send operation failed!\n"); #endif mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->ShowWindow(PR_TRUE); } } Loading Loading @@ -1764,6 +1758,7 @@ nsMsgComposeSendListener::OnStopCopy(nsresult aStatus) #ifdef NS_DEBUG printf("nsMsgComposeSendListener: Success on the message copy operation!\n"); #endif mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); // We should only close the window if we are done. Things like templates // and drafts aren't done so their windows should stay open if ( (mDeliverMode != nsIMsgSend::nsMsgSaveAsDraft) && Loading @@ -1775,6 +1770,7 @@ nsMsgComposeSendListener::OnStopCopy(nsresult aStatus) #ifdef NS_DEBUG printf("nsMsgComposeSendListener: the message copy operation failed!\n"); #endif mComposeObj->NotifyStateListeners(nsMsgCompose::eSaveAndSendProcessDone); mComposeObj->ShowWindow(PR_TRUE); } } Loading Loading @@ -2161,27 +2157,30 @@ nsresult nsMsgCompose::NotifyStateListeners(TStateListenerNotification aNotifica if (NS_FAILED(rv)) return rv; PRUint32 i; switch (aNotificationType) { case eComposeFieldsReady: for (i = 0; i < numListeners;i++) { nsCOMPtr<nsISupports> iSupports = getter_AddRefs(mStateListeners->ElementAt(i)); nsCOMPtr<nsIMsgComposeStateListener> thisListener = do_QueryInterface(iSupports); if (thisListener) { rv = thisListener->NotifyComposeFieldsReady(); if (NS_FAILED(rv)) switch (aNotificationType) { case eComposeFieldsReady: thisListener->NotifyComposeFieldsReady(); break; } } case eSaveAndSendProcessDone: thisListener->SendAndSaveProcessDone(); break; default: NS_NOTREACHED("Unknown notification"); break; } } } return rv; return NS_OK; } nsresult nsMsgCompose::AttachmentPrettyName(const PRUnichar* url, PRUnichar** _retval) Loading