-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi,
like promised i started to hack a little bit on the addressbook support
for muttator. Until now i can add new addressbook entries with
:addr[ess] [-firstname=..] [-lastname=...] [-name=..] [EMAIL PROTECTED]
When a mail is selected a mail you can type `a' and muttator will open a
:address line with the senders name and email address preset.
To watch the addresses and to open new compose windows for them you can use:
:abook[!] muttator
I also want to add tab completion for :abook and for :message, when i
have the time for it.
greetz didi
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iD8DBQFIQEho9Fo/3NFezhERAj/9AJ9QiVC9aWSE0cUhV9gt1NES1lcBaQCcD1Fh
GNsUyIVQTm8eEpYkl1i7flQ=
=vU6C
-----END PGP SIGNATURE-----
diff --git a/content/addressbook.js b/content/addressbook.js
new file mode 100644
index 0000000..0ad2ce5
--- /dev/null
+++ b/content/addressbook.js
@@ -0,0 +1,226 @@
+/***** 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.
+
+(c) 2008: Christian Dietrich <[EMAIL PROTECTED]>
+
+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 *****/
+
+liberator.Addressbook = function () //{{{
+{
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////// PRIVATE SECTION /////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ const abManager = Components.classes["@mozilla.org/abmanager;1"]
+ .getService(Components.interfaces.nsIAbManager);
+ const rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"]
+ .getService(Components.interfaces.nsIRDFService);
+
+ const kPersonalAddressbookURI = "moz-abmdbdirectory://abook.mab";
+
+ function load()
+ {
+ }
+
+ function generateDisplayName(firstName, lastName)
+ {
+ if (firstName && lastName)
+ return firstName + " " + lastName;
+ else if (firstName)
+ return firstName;
+ else if (lastName)
+ return lastName;
+ else
+ return "";
+ }
+
+ function getDirectoryFromURI(uri)
+ {
+ return rdf.GetResource(uri).QueryInterface(Components.interfaces.nsIAbDirectory);
+ }
+
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// OPTIONS /////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// MAPPINGS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ var modes = liberator.config.mailModes || [liberator.modes.NORMAL];
+
+ liberator.mappings.add(modes, ["a"],
+ "Open a prompt to save a new addressbook entry for the marked sender",
+ function ()
+ {
+ var to;
+ try
+ {
+ to = gDBView.hdrForFirstSelectedMessage.mime2DecodedAuthor;
+ }
+ catch (e) { liberator.echoerr("Exxx: No message is selected");}
+
+ if (!to) return;
+
+ var address = to.substring(to.indexOf("<") + 1, to.indexOf(">"));
+
+ var displayName = to.substr(0, to.indexOf("<") - 1);
+ if (displayName.indexOf(" ") > -1)
+ {
+ var names = displayName.split(" ", 2);
+ displayName = "-firstname " + names[0] + " -lastname " + names[1];
+ }
+ else
+ {
+ displayName = "-name " + displayName;
+ }
+
+ liberator.commandline.open(":", "address " + address + " " + displayName, liberator.modes.EX);
+
+ });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// COMMANDS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ liberator.commands.add(["addr[essbook]"],
+ "Add a addressbook entry",
+ function (args)
+ {
+ var res = liberator.commands.parseArgs(args, this.args);
+ if (!res)
+ return;
+
+ var mailAddr = res.args.length == 0 ? liberator.buffer.URL : res.args[0];
+ var firstName = liberator.commands.getOption(res.opts, "-firstname", null);
+ var lastName = liberator.commands.getOption(res.opts, "-lastname", null);
+ var displayName = liberator.commands.getOption(res.opts, "-name", null);
+ if (!displayName)
+ displayName = generateDisplayName(firstName, lastName);
+
+ if (liberator.addressbook.add(mailAddr, firstName, lastName, displayName))
+ liberator.echo("Added address: " + displayName + " <" + mailAddr + ">", liberator.commandline.FORCE_SINGLELINE);
+ else
+ liberator.echoerr("Exxx: Could not add bookmark `" + mailAddr + "'", liberator.commandline.FORCE_SINGLELINE);
+
+ },
+ {
+ args: [[["-firstname", "-f"], liberator.commands.OPTION_STRING],
+ [["-lastname", "-l"], liberator.commands.OPTION_STRING],
+ [["-name", "-n"], liberator.commands.OPTION_STRING]]
+ });
+
+ liberator.commands.add(["abook"],
+ "List or open multiple addresses",
+ function (args, special)
+ {
+ var addresses = [];
+ var dirs = abManager.directories;
+
+ args = args.toLowerCase();
+
+ while (dirs.hasMoreElements())
+ {
+ addrbook = dirs.getNext().QueryInterface(Components.interfaces.nsIAbDirectory);
+ var cards = addrbook.childCards;
+ while(cards.hasMoreElements())
+ {
+ var card = cards.getNext().QueryInterface(Components.interfaces.nsIAbCard);
+ if (!card.primaryEmail) continue;
+
+ var displayName = card.displayName;
+ if (!displayName)
+ displayName = generateDisplayName(card.firstName, card.lastName);
+
+ if (displayName.toLowerCase().indexOf(args) > -1
+ || card.primaryEmail.toLowerCase().indexOf(args) > -1)
+ addresses.push([displayName,card.primaryEmail]);
+ }
+ }
+ if (addresses.length == 0)
+ liberator.echoerr("Exxx: No addressbook entries found", liberator.commandline.FORCE_SINGLELINE);
+ else
+ liberator.addressbook.list(addresses, special);
+ });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// PUBLIC SECTION //////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+ return {
+ add: function(address, firstname, lastname, displayName)
+ {
+ var directory = getDirectoryFromURI(kPersonalAddressbookURI);
+ if (!directory)
+ return false;
+ var card = Components.classes["@mozilla.org/addressbook/cardproperty;1"]
+ .createInstance(Components.interfaces.nsIAbCard);
+ if (!card)
+ return false;
+
+ if (!address)
+ return false;
+
+ card.primaryEmail = address;
+ card.firstName = firstname;
+ card.lastName = lastname;
+ card.displayName = displayName;
+
+ return directory.addCard(card);
+ },
+
+ list: function(addresses, newMail)
+ {
+ if (newMail)
+ {
+ // Now we have to create a new message
+ var args = new Object();
+ args.to = addresses.map(function(address)
+ {
+ return address[0] + " <" + address[1] + ">";
+ }).join(", ");
+
+ liberator.mail.composeNewMail(args);
+ }
+ else
+ {
+ var list = ":" + liberator.util.escapeHTML(liberator.commandline.getCommand()) + "<br/>" +
+ "<table><tr align=\"left\" class=\"hl-Title\"><th>Name</th><th>Address</th></tr>";
+ for (var i = 0; i < addresses.length; i++)
+ {
+ var displayName = liberator.util.escapeHTML(addresses[i][0]);
+ if (displayName.length > 50)
+ displayName = displayName.substr(0, 47) + "...";
+ var mailAddr = liberator.util.escapeHTML(addresses[i][1]);
+ list += "<tr><td>" + displayName + "</td><td style=\"width: 100%\"><a href=\"#\" class=\"hl-URL\">" + mailAddr + "</a></td></tr>";
+ }
+ list += "</table>";
+
+ liberator.commandline.echo(list, liberator.commandline.HL_NORMAL, liberator.commandline.FORCE_MULTILINE);
+ }
+ }
+ }
+
+}; //}}}
diff --git a/content/liberator.js b/content/liberator.js
index 04c384b..6957c4b 100644
--- a/content/liberator.js
+++ b/content/liberator.js
@@ -824,6 +824,7 @@ const liberator = (function () //{{{
if (liberator.has("marks")) { log("marks"); liberator.marks = liberator.Marks(); }
if (liberator.has("quickmarks")) { log("quickmarks"); liberator.quickmarks = liberator.QuickMarks(); }
if (liberator.has("hints")) { log("hints"); liberator.hints = liberator.Hints(); }
+ if (liberator.has("addressbook")) { log("addressbook"); liberator.addressbook = liberator.Addressbook(); }
liberator.log("All modules loaded", 3);
diff --git a/content/mail.js b/content/mail.js
index c49cb58..6fd44b9 100644
--- a/content/mail.js
+++ b/content/mail.js
@@ -175,60 +175,6 @@ liberator.Mail = function () //{{{
recipient = recipient.replace(/"/g, "");
return "\"" + recipient + "\"";
}
-
- function composeNewMail(args)
- {
- var params = Components.classes["@mozilla.org/messengercompose/composeparams;1"]
- .createInstance(Components.interfaces.nsIMsgComposeParams);
- params.composeFields = Components.classes["@mozilla.org/messengercompose/composefields;1"]
- .createInstance(Components.interfaces.nsIMsgCompFields);
-
- if (args)
- {
- if (args.originalMsg)
- params.originalMsgURI = args.originalMsg;
- if (args.to)
- params.composeFields.to = args.to;
- if (args.cc)
- params.composeFields.cc = args.cc;
- if (args.bcc)
- params.composeFields.bcc = args.bcc;
- if (args.newsgroups)
- params.composeFields.newsgroups = args.newsgroups;
- if (args.subject)
- params.composeFields.subject = args.subject;
- if (args.body)
- params.composeFields.body = args.body;
- while (args.attachments.length > 0)
- {
- var url = args.attachments.pop();
-
- // Check if the file really exists
- var file = Components.classes["@mozilla.org/file/local;1"]
- .createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(url);
-
- if (!file.exists())
- {
- liberator.echoerr("Exxx: Could attach file `" + url + "'", liberator.commandline.FORCE_SINGLELINE);
- continue;
- }
- attachment = Components.classes["@mozilla.org/messengercompose/attachment;1"]
- .createInstance(Components.interfaces.nsIMsgAttachment);
- attachment.url = "file://" + url;
- params.composeFields.addAttachment(attachment);
- }
-
- }
-
-
- params.type = Components.interfaces.nsIMsgCompType.New
-
- var msgComposeService = Components.classes["@mozilla.org/messengercompose;1"].getService();
- msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService);
- msgComposeService.OpenComposeWindowWithParams(null, params);
- }
-
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// OPTIONS /////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
@@ -679,7 +625,7 @@ liberator.Mail = function () //{{{
mailargs.to = res.args.join(", ");
}
- composeNewMail(mailargs);
+ liberator.mail.composeNewMail(mailargs);
},
{
args: [[["-subject", "-s"], liberator.commands.OPTION_STRING],
@@ -742,6 +688,60 @@ liberator.Mail = function () //{{{
return GetFolderResource(tree, tree.currentIndex).
QueryInterface(Components.interfaces.nsIMsgFolder);
},
+ composeNewMail: function (args) {
+ var params = Components.classes["@mozilla.org/messengercompose/composeparams;1"]
+ .createInstance(Components.interfaces.nsIMsgComposeParams);
+ params.composeFields = Components.classes["@mozilla.org/messengercompose/composefields;1"]
+ .createInstance(Components.interfaces.nsIMsgCompFields);
+
+ if (args)
+ {
+ if (args.originalMsg)
+ params.originalMsgURI = args.originalMsg;
+ if (args.to)
+ params.composeFields.to = args.to;
+ if (args.cc)
+ params.composeFields.cc = args.cc;
+ if (args.bcc)
+ params.composeFields.bcc = args.bcc;
+ if (args.newsgroups)
+ params.composeFields.newsgroups = args.newsgroups;
+ if (args.subject)
+ params.composeFields.subject = args.subject;
+ if (args.body)
+ params.composeFields.body = args.body;
+
+ if (args.attachments)
+ {
+ while (args.attachments.length > 0)
+ {
+ var url = args.attachments.pop();
+
+ // Check if the file really exists
+ var file = Components.classes["@mozilla.org/file/local;1"]
+ .createInstance(Components.interfaces.nsILocalFile);
+ file.initWithPath(url);
+
+ if (!file.exists())
+ {
+ liberator.echoerr("Exxx: Could attach file `" + url + "'", liberator.commandline.FORCE_SINGLELINE);
+ continue;
+ }
+ attachment = Components.classes["@mozilla.org/messengercompose/attachment;1"]
+ .createInstance(Components.interfaces.nsIMsgAttachment);
+ attachment.url = "file://" + url;
+ params.composeFields.addAttachment(attachment);
+ }
+ }
+ }
+
+ params.type = Components.interfaces.nsIMsgCompType.New
+
+ var msgComposeService = Components.classes["@mozilla.org/messengercompose;1"].getService();
+ msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService);
+ msgComposeService.OpenComposeWindowWithParams(null, params);
+ },
+
getFolders: function (filter, includeServers, includeMsgFolders)
{
diff --git a/content/muttator.js b/content/muttator.js
index c8cd04f..6c976b0 100644
--- a/content/muttator.js
+++ b/content/muttator.js
@@ -32,7 +32,7 @@ liberator.config = {
hostApplication: "Thunderbird", // TODO: can this be found out otherwise? gBrandBundle.getString("brandShortName");
/*** optional options, there are checked for existance and a fallback provided ***/
- features: ["hints", "mail", "marks"],
+ features: ["hints", "mail", "marks", "addressbook"],
guioptions: { m: ["mail-toolbar-menubar2"], T: ["mail-bar2"], f: ["folderPaneBox", "folderpane_splitter"], F: ["folderPaneHeader"] },
get browserModes() { return [liberator.modes.MESSAGE]; },
diff --git a/content/muttator.xul b/content/muttator.xul
index f041c1b..b503b62 100644
--- a/content/muttator.xul
+++ b/content/muttator.xul
@@ -40,6 +40,7 @@ the terms of any one of the MPL, the GPL or the LGPL.
<script type="application/x-javascript;version=1.8" src="liberator.js"/>
<script type="application/x-javascript;version=1.8" src="muttator.js"/>
+ <script type="application/x-javascript;version=1.8" src="addressbook.js"/>
<script type="application/x-javascript;version=1.8" src="buffer.js"/>
<script type="application/x-javascript;version=1.8" src="commands.js"/>
<script type="application/x-javascript;version=1.8" src="completion.js"/>
_______________________________________________
Muttator mailing list
[email protected]
https://www.mozdev.org/mailman/listinfo/muttator