summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--muttator/TODO3
-rw-r--r--muttator/content/compose/compose.js131
-rw-r--r--muttator/content/config.js97
3 files changed, 143 insertions, 88 deletions
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 <stubenschrott@vimperator.org>
+
+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,