mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-21 09:37:58 +01:00
Extract composer behaviour into a new composer module.
This commit is contained in:
@@ -3,10 +3,10 @@ Priority list:
|
|||||||
|
|
||||||
BUGS:
|
BUGS:
|
||||||
- several tab related commands like :tab are enabled but don't work
|
- 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
|
- stal=1 doesn't work
|
||||||
|
|
||||||
(recent CVS regressions):
|
(recent CVS regressions):
|
||||||
|
- 'autoexternal' doesn't work
|
||||||
|
|
||||||
FEATURES:
|
FEATURES:
|
||||||
9 edit messages with vim
|
9 edit messages with vim
|
||||||
@@ -14,4 +14,3 @@ FEATURES:
|
|||||||
- currently it archives mail to the first Archive folder found
|
- currently it archives mail to the first Archive folder found
|
||||||
7 :set! mailnews.wraplength=140 or similar
|
7 :set! mailnews.wraplength=140 or similar
|
||||||
6 add a feature to show emails from threads under each other like in gmail
|
6 add a feature to show emails from threads under each other like in gmail
|
||||||
|
|
||||||
|
|||||||
131
muttator/content/compose/compose.js
Normal file
131
muttator/content/compose/compose.js
Normal file
@@ -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:
|
||||||
@@ -158,6 +158,7 @@ const config = { //{{{
|
|||||||
|
|
||||||
scripts: [
|
scripts: [
|
||||||
"addressbook.js",
|
"addressbook.js",
|
||||||
|
"compose/compose.js",
|
||||||
"mail.js",
|
"mail.js",
|
||||||
"tabs.js"
|
"tabs.js"
|
||||||
],
|
],
|
||||||
@@ -170,94 +171,10 @@ const config = { //{{{
|
|||||||
// don't wait too long when selecting new messages
|
// don't wait too long when selecting new messages
|
||||||
// GetThreadTree()._selectDelay = 300; // TODO: make configurable
|
// 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
|
// load Muttator specific modules
|
||||||
if (this.isComposeWindow)
|
if (this.isComposeWindow)
|
||||||
{
|
// TODO: this should probably be "composer"
|
||||||
this.features = ["addressbook"]; // the composer has no special features
|
liberator.loadModule("compose", Compose);
|
||||||
//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);*/
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
liberator.loadModule("mail", Mail);
|
liberator.loadModule("mail", Mail);
|
||||||
@@ -280,6 +197,14 @@ const config = { //{{{
|
|||||||
////////////////////// OPTIONS /////////////////////////////////////////////////
|
////////////////////// 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"],
|
options.add(["online"],
|
||||||
"Set the 'work offline' option",
|
"Set the 'work offline' option",
|
||||||
"boolean", true,
|
"boolean", true,
|
||||||
|
|||||||
Reference in New Issue
Block a user