From e8f07f37d01d473fd1cf5706a480cdbdce7c503c Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Wed, 8 Jul 2009 22:28:12 +1000 Subject: Extract composer behaviour into a new composer module. --- muttator/TODO | 3 +- muttator/content/compose/compose.js | 131 ++++++++++++++++++++++++++++++++++++ muttator/content/config.js | 97 +++----------------------- 3 files changed, 143 insertions(+), 88 deletions(-) create mode 100644 muttator/content/compose/compose.js (limited to 'muttator') diff --git a/muttator/TODO b/muttator/TODO index 5989fe81..d7738ee1 100644 --- a/muttator/TODO +++ b/muttator/TODO @@ -3,10 +3,10 @@ Priority list: BUGS: - several tab related commands like :tab are enabled but don't work -- MOW is broken - always uses a height of less than one line - stal=1 doesn't work (recent CVS regressions): +- 'autoexternal' doesn't work FEATURES: 9 edit messages with vim @@ -14,4 +14,3 @@ FEATURES: - currently it archives mail to the first Archive folder found 7 :set! mailnews.wraplength=140 or similar 6 add a feature to show emails from threads under each other like in gmail - diff --git a/muttator/content/compose/compose.js b/muttator/content/compose/compose.js new file mode 100644 index 00000000..3a6dd2f8 --- /dev/null +++ b/muttator/content/compose/compose.js @@ -0,0 +1,131 @@ +/***** BEGIN LICENSE BLOCK ***** {{{ +Version: MPL 1.1/GPL 2.0/LGPL 2.1 + +The contents of this file are subject to the Mozilla Public License Version +1.1 (the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the +License. + +Copyright (c) 2006-2009 by Martin Stubenschrott + +Alternatively, the contents of this file may be used under the terms of +either the GNU General Public License Version 2 or later (the "GPL"), or +the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +in which case the provisions of the GPL or the LGPL are applicable instead +of those above. If you wish to allow use of your version of this file only +under the terms of either the GPL or the LGPL, and not to allow others to +use your version of this file under the terms of the MPL, indicate your +decision by deleting the provisions above and replace them with the notice +and other provisions required by the GPL or the LGPL. If you do not delete +the provisions above, a recipient may use your version of this file under +the terms of any one of the MPL, the GPL or the LGPL. +}}} ***** END LICENSE BLOCK *****/ + +function Compose() //{{{ +{ + //////////////////////////////////////////////////////////////////////////////// + ////////////////////// PRIVATE SECTION ///////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////{{{ + + this.features = ["addressbook"]; // the composer has no special features + + var stateListener = { + QueryInterface: function (id) + { + if (id.equals(Ci.nsIDocumentStateListener)) + return this; + throw Cr.NS_NOINTERFACE; + }, + + // this is (also) fired once the new compose window loaded the message for the first time + NotifyDocumentStateChanged: function (nowDirty) + { + // only edit with external editor if this window was not cached! + if (options["autoexternal"] && !window.messageWasEditedExternally/* && !gMsgCompose.recycledWindow*/) + { + window.messageWasEditedExternally = true; + editor.editFieldExternally(); + } + + }, + NotifyDocumentCreated: function () {}, + NotifyDocumentWillBeDestroyed: function () {} + }; + + // XXX: Hack! + window.document.addEventListener("load", function () { + if (window.messageWasEditedExternally === undefined) + { + window.messageWasEditedExternally = false; + GetCurrentEditor().addDocumentStateListener(stateListener); + } + }, true); + + window.addEventListener("compose-window-close", function () { + window.messageWasEditedExternally = false; + }, true); + + /*window.document.addEventListener("unload", function () { + GetCurrentEditor().removeDocumentStateListener(config.stateListener); + }, true);*/ + + /////////////////////////////////////////////////////////////////////////////}}} + ////////////////////// OPTIONS ///////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////{{{ + + /////////////////////////////////////////////////////////////////////////////}}} + ////////////////////// MAPPINGS //////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////{{{ + + /////////////////////////////////////////////////////////////////////////////}}} + ////////////////////// COMMANDS //////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////{{{ + + mappings.add([modes.COMPOSE], + ["e"], "Edit message", + function () { editor.editFieldExternally(); }); + + mappings.add([modes.COMPOSE], + ["y"], "Send message now", + function () { window.goDoCommand("cmd_sendNow"); }); + + mappings.add([modes.COMPOSE], + ["Y"], "Send message later", + function () { window.goDoCommand("cmd_sendLater"); }); + + // FIXME: does not really work reliably + mappings.add([modes.COMPOSE], + ["t"], "Select To: field", + function () { awSetFocus(0, awGetInputElement(1)); }); + + mappings.add([modes.COMPOSE], + ["s"], "Select Subject: field", + function () { GetMsgSubjectElement().focus(); }); + + mappings.add([modes.COMPOSE], + ["i"], "Select message body", + function () { SetMsgBodyFrameFocus(); }); + + mappings.add([modes.COMPOSE], + ["q"], "Close composer, ask when for unsaved changes", + function () { DoCommandClose(); }); + + mappings.add([modes.COMPOSE], + ["Q", "ZQ"], "Force closing composer", + function () { MsgComposeCloseWindow(true); /* cache window for better performance*/ }); + + /////////////////////////////////////////////////////////////////////////////}}} + ////////////////////// PUBLIC SECTION ////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////{{{ + + return {}; + + //}}} +}; //}}} + +// vim: set fdm=marker sw=4 ts=4 et: diff --git a/muttator/content/config.js b/muttator/content/config.js index fd150ef6..4bd607ff 100644 --- a/muttator/content/config.js +++ b/muttator/content/config.js @@ -158,6 +158,7 @@ const config = { //{{{ scripts: [ "addressbook.js", + "compose/compose.js", "mail.js", "tabs.js" ], @@ -170,94 +171,10 @@ const config = { //{{{ // don't wait too long when selecting new messages // GetThreadTree()._selectDelay = 300; // TODO: make configurable - // 0: never automatically edit externally - // 1: automatically edit externally when message window is shown the first time - // 2: automatically edit externally, once the message text gets focus (not working currently) - options.add(["autoexternal", "ae"], - "Edit message with external editor by default", - "boolean", false); - // load Muttator specific modules if (this.isComposeWindow) - { - this.features = ["addressbook"]; // the composer has no special features - //liberator.loadModule("addressbook", Addressbook); - - // TODO: move mappings elsewhere, probably compose.js - mappings.add([modes.COMPOSE], - ["e"], "Edit message", - function () { editor.editFieldExternally(); }); - - mappings.add([modes.COMPOSE], - ["y"], "Send message now", - function () { window.goDoCommand("cmd_sendNow"); }); - - mappings.add([modes.COMPOSE], - ["Y"], "Send message later", - function () { window.goDoCommand("cmd_sendLater"); }); - - // FIXME: does not really work reliably - mappings.add([modes.COMPOSE], - ["t"], "Select To: field", - function () { awSetFocus(0, awGetInputElement(1)); }); - - mappings.add([modes.COMPOSE], - ["s"], "Select Subject: field", - function () { GetMsgSubjectElement().focus(); }); - - mappings.add([modes.COMPOSE], - ["i"], "Select message body", - function () { SetMsgBodyFrameFocus(); }); - - mappings.add([modes.COMPOSE], - ["q"], "Close composer, ask when for unsaved changes", - function () { DoCommandClose(); }); - - mappings.add([modes.COMPOSE], - ["Q", "ZQ"], "Force closing composer", - function () { MsgComposeCloseWindow(true); /* cache window for better performance*/ }); - - var stateListener = - { - QueryInterface: function (id) - { - if (id.equals(Ci.nsIDocumentStateListener)) - return this; - throw Cr.NS_NOINTERFACE; - }, - - // this is (also) fired once the new compose window loaded the message for the first time - NotifyDocumentStateChanged: function (nowDirty) - { - // only edit with external editor if this window was not cached! - if (options["autoexternal"] && !window.messageWasEditedExternally/* && !gMsgCompose.recycledWindow*/) - { - window.messageWasEditedExternally = true; - editor.editFieldExternally(); - } - - }, - NotifyDocumentCreated: function () {}, - NotifyDocumentWillBeDestroyed: function () {} - }; - - // XXX: Hack! - window.document.addEventListener("load", function () { - if (window.messageWasEditedExternally === undefined) - { - window.messageWasEditedExternally = false; - GetCurrentEditor().addDocumentStateListener(stateListener); - } - }, true); - - window.addEventListener("compose-window-close", function () { - window.messageWasEditedExternally = false; - }, true); - - /*window.document.addEventListener("unload", function () { - GetCurrentEditor().removeDocumentStateListener(config.stateListener); - }, true);*/ - } + // TODO: this should probably be "composer" + liberator.loadModule("compose", Compose); else { liberator.loadModule("mail", Mail); @@ -280,6 +197,14 @@ const config = { //{{{ ////////////////////// OPTIONS ///////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////{{{ + // FIXME: comment obviously incorrect + // 0: never automatically edit externally + // 1: automatically edit externally when message window is shown the first time + // 2: automatically edit externally, once the message text gets focus (not working currently) + options.add(["autoexternal", "ae"], + "Edit message with external editor by default", + "boolean", false); + options.add(["online"], "Set the 'work offline' option", "boolean", true, -- cgit v1.2.3