extensibility hooks for mailnews FE and IMAP back end.

see bug #161226.  r/sr=bienvenu
This commit is contained in:
sspitzer%netscape.com 2002-08-14 22:12:32 +00:00
parent ef17840fcd
commit a0cf394eea
34 changed files with 416 additions and 41 deletions

View File

@ -25,6 +25,8 @@ var gDefaultPickerMode = "1";
var gFccFolderWithDelim, gDraftsFolderWithDelim, gTemplatesFolderWithDelim;
var gPrefBranch = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
// Picker IDs
var fccAccountPickerId = "msgFccAccountPicker";
var fccFolderPickerId = "msgFccFolderPicker";
@ -61,6 +63,30 @@ function onInit() {
initBccSelf();
setupFccItems();
SetSpecialFolderNamesWithDelims();
SetupStoreReadMail();
}
function SetupStoreReadMail()
{
var groupbox = document.getElementById("store_read_mail_in_pfc");
var serverId = GetCurrentServerId();
var account = parent.getAccountFromServerId(serverId);
if (!account)
return;
var server = account.incomingServer;
var prefString = server.type + "." + server.redirectorType + ".showStoreReadMailInPFC";
try {
if (gPrefBranch.getBoolPref(prefString))
groupbox.removeAttribute("hidden");
else
groupbox.setAttribute("hidden","true");
}
catch (ex) {
groupbox.setAttribute("hidden","true");
}
}
// Initialize the picker mode choices (account/folder picker) into global vars
@ -260,23 +286,27 @@ function SaveFolderSettings(radioElemChoice,
folderElementId,
folderPickerModeId)
{
var formElement;
var uri;
var picker;
switch (radioElemChoice)
{
case "0" :
var picker = document.getElementById(accountPickerId);
var uri = picker.getAttribute("uri");
picker = document.getElementById(accountPickerId);
uri = picker.getAttribute("uri");
if (uri) {
// Create Folder URI
uri = uri + folderSuffix;
var formElement = document.getElementById(folderElementId);
formElement = document.getElementById(folderElementId);
formElement.setAttribute("value",uri);
}
break;
case "1" :
var picker = document.getElementById(folderPickerId);
var uri = picker.getAttribute("uri");
picker = document.getElementById(folderPickerId);
uri = picker.getAttribute("uri");
if (uri) {
SaveUriFromPicker(folderElementId, folderPickerId);
}
@ -287,7 +317,7 @@ function SaveFolderSettings(radioElemChoice,
return;
}
var formElement = document.getElementById(folderPickerModeId);
formElement = document.getElementById(folderPickerModeId);
formElement.setAttribute("value", radioElemChoice);
}

View File

@ -95,6 +95,17 @@
</hbox>
</groupbox>
<groupbox id="store_read_mail_in_pfc">
<caption label="&readingPrefix.label;"/>
<hbox align="center">
<checkbox hidable="true" wsm_persist="true" id="imap.storeReadMailInPFC"
label="&readingMailFolder.label;"
prefattribute="value"
prefstring="mail.server.%serverkey%.store_read_mail_in_pfc"/>
</hbox>
</groupbox>
<groupbox>
<caption label="&specialFoldersTitle.label;"/>

View File

@ -3,6 +3,8 @@
<!ENTITY copyAndFolderTitle.label "Copies &amp; Folders">
<!ENTITY sendingPrefix.label "When sending messages, automatically: ">
<!ENTITY fccMailFolder.label "Place a copy in:">
<!ENTITY readingPrefix.label "When reading messages, automatically: ">
<!ENTITY readingMailFolder.label "Place a copy in my &quot;Read Mail&quot; folder on Local Folders">
<!ENTITY chooseFolderButton.label "Choose Folder...">
<!-- LOCALIZATION NOTE (bccAccount.label): do not translate "Bcc" in below line -->
<!ENTITY bccAccount.label "Bcc ">

View File

@ -76,7 +76,7 @@ function GetServer(uri)
function LoadMessageByUri(uri)
{
dump("XXX LoadMessageByUri " + uri + " vs " + gCurrentDisplayedMessage + "\n");
//dump("XXX LoadMessageByUri " + uri + " vs " + gCurrentDisplayedMessage + "\n");
if(uri != gCurrentDisplayedMessage)
{
dump("fix this, get the nsIMsgDBHdr and the nsIMsgFolder from the uri...\n");
@ -152,6 +152,10 @@ function UpdateMailToolbar(caller)
{
//dump("XXX update mail-toolbar " + caller + "\n");
document.commandDispatcher.updateCommands('mail-toolbar');
// hook for extra toolbar items
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window, "mail:updateToolbarItems", null);
}
function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
@ -159,6 +163,11 @@ function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
//dump("In ChangeFolderByURI uri = " + uri + " sortType = " + sortType + "\n");
if (uri == gCurrentLoadingFolderURI)
return;
// hook for extra toolbar items
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window, "mail:setupToolbarItems", uri);
var resource = RDF.GetResource(uri);
var msgfolder =
resource.QueryInterface(Components.interfaces.nsIMsgFolder);
@ -209,7 +218,22 @@ function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
gCurrentLoadingFolderViewType = viewType;
gCurrentLoadingFolderSortType = sortType;
gCurrentLoadingFolderSortOrder = sortOrder;
if(msgfolder.manyHeadersToDownload)
var showMessagesAfterLoading;
try {
var server = msgfolder.server;
if (server.redirectorType) {
var prefString = server.type + "." + server.redirectorType + ".showMessagesAfterLoading";
showMessagesAfterLoading = gPrefs.getBoolPref(prefString);
}
else
showMessagesAfterLoading = false;
}
catch (ex) {
showMessagesAfterLoading = false;
}
if (msgfolder.manyHeadersToDownload || showMessagesAfterLoading)
{
gRerootOnFolderLoad = true;
try
@ -313,7 +337,12 @@ function RerootFolder(uri, newFolder, viewType, viewFlags, sortType, sortOrder)
}
SetUpToolbarButtons(uri);
UpdateStatusMessageCounts(newFolder);
// hook for extra toolbar items
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window, "mail:updateToolbarItems", null);
}
function SwitchView(command)

View File

@ -25,6 +25,7 @@
-->
<?xml-stylesheet href="chrome://messenger/skin/folderPane.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/folderPaneExtras.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/fakeAccount.css" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://messenger/locale/folderpane.dtd">
@ -80,6 +81,9 @@
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#ServerType"
object="?serverType" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#RedirectorType"
object="?redirectorType" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#NoSelect"
object="?noSelect" />
@ -103,7 +107,7 @@
<treerow>
<treecell id="folderNameCell"
label="?folderTreeName"
properties="specialFolder-?specialFolder biffState-?biffState isServer-?isServer newMessages-?newMessages hasUnreadMessages-?hasUnreadMessages subfoldersHaveUnreadMessages-?subfoldersHaveUnreadMessages isSecure-?isSecure serverType-?serverType noSelect-?noSelect imapShared-?imapShared fakeAccount-?fakeAccount"/>
properties="specialFolder-?specialFolder biffState-?biffState isServer-?isServer newMessages-?newMessages hasUnreadMessages-?hasUnreadMessages subfoldersHaveUnreadMessages-?subfoldersHaveUnreadMessages isSecure-?isSecure serverType-?serverType redirectorType-?redirectorType noSelect-?noSelect imapShared-?imapShared fakeAccount-?fakeAccount"/>
<treecell label="?unreadCount"
properties="hasUnreadMessages-?hasUnreadMessages subfoldersHaveUnreadMessages-?subfoldersHaveUnreadMessages"/>
<treecell label="?totalCount"

View File

@ -162,10 +162,12 @@ Rights Reserved.
<hbox id="mail3PaneVertLayoutBox" persist="collapsed width" flex="2">
<vbox id="searchAndthreadpaneBox" persist="width" flex ="1">
<vbox id="messagesBox" flex="1">
<hbox id="searchBox"/>
<vbox id="threadpaneBox" flex="1" persist="width">
<tree id="threadTree" flex="1" persist="width" style="width:0px" context="threadPaneContext"/>
</vbox>
</vbox>
</vbox>
<hbox id="accountCentralBox" flex="1" persist="width">
<iframe name="accountCentralPane" style="width:0px;" flex="1" src="about:blank"/>

View File

@ -68,6 +68,8 @@ var gPaneConfig = null;
var gIsEditableMsgFolder = false;
var gOfflineManager;
// cache the last keywords
var gLastKeywords = "";
function OnMailWindowUnload()
{
@ -569,3 +571,29 @@ function GetSearchSession()
else
return null;
}
function SetKeywords(aKeywords)
{
// we cache the last keywords.
// if there is no chagne, we do nothing.
// most of the time, this will be the case.
if (aKeywords == gLastKeywords)
return;
// these are the UI elements who care about keywords
var ids = ["expandedKeywordImage","expandedHeaderView","msgHeaderView","collapsedHeaderView","collapsedKeywordImage","editMessageBox","expandedAttachmentBox"];
for (i in ids) {
var element = document.getElementById(ids[i]);
if (element) {
if (aKeywords)
element.setAttribute("class", aKeywords);
else {
// if no keywords, reset class to the original class
element.setAttribute("class", element.getAttribute("originalclass"));
}
}
}
// cache the keywords
gLastKeywords = aKeywords;
}

View File

@ -0,0 +1,28 @@
<!--
The contents of this file are subject to the Netscape 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/NPL/
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.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<overlay
xmlns:nc="http://home.netscape.com/NC-rdf#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<!-- plug in your mail window extras here.
see http://www.mozilla.org/mailnews/arch/mailwindowextras.html -->
</overlay>

View File

@ -22,6 +22,7 @@
* Håkan Waara <hwaara@chello.se>
* Jan Varga <varga@utcru.sk>
* Seth Spitzer <sspitzer@netscape.com>
* David Bienvenu <bienvenu@netscape.com>
*/
var gMessengerBundle;
@ -397,8 +398,18 @@ function InitViewBodyMenu()
function IsNewsMessage(messageUri)
{
if (!messageUri) return false;
return (messageUri.substring(0,14) == "news-message:/")
if (!messageUri)
return false;
else
return (messageUri.substring(0,14) == "news-message:/");
}
function IsImapMessage(messageUri)
{
if (!messageUri)
return false;
else
return (messageUri.substring(0,14) == "imap-message:/");
}
function SetMenuItemLabel(menuItemId, customLabel)
@ -644,7 +655,7 @@ function MsgGetMessagesForAllServers(defaultServer)
{
if (defaultServer && defaultServer.equals(currentServer))
{
dump(currentServer.serverURI + "...skipping, already opened\n");
//dump(currentServer.serverURI + "...skipping, already opened\n");
}
else
{
@ -853,8 +864,11 @@ function MsgForwardMessage(event)
{
var forwardType = 0;
try {
forwardType = gPrefs.getIntPref("mail.forward_message_mode");
} catch (e) {dump ("failed to retrieve pref mail.forward_message_mode");}
forwardType = gPrefs.getIntPref("mail.forward_message_mode");
}
catch (ex) {
dump("failed to retrieve pref mail.forward_message_mode");
}
// mail.forward_message_mode could be 1, if the user migrated from 4.x
// 1 (forward as quoted) is obsolete, so we treat is as forward inline
@ -1482,7 +1496,7 @@ function getMarkupDocumentViewer()
function MsgSynchronizeOffline()
{
dump("in MsgSynchronize() \n");
//dump("in MsgSynchronize() \n");
window.openDialog("chrome://messenger/content/msgSynchronize.xul",
"", "centerscreen,chrome,modal,titlebar,resizable=yes",{msgWindow:msgWindow});
}
@ -1707,6 +1721,57 @@ function SetupUndoRedoCommand(command)
return canUndoOrRedo;
}
function OnMsgLoaded(folder, msgURI)
{
var currentMsgFolder = folder.QueryInterface(Components.interfaces.nsIMsgFolder);
if (!IsImapMessage(msgURI))
return;
var imapServer = currentMsgFolder.server.QueryInterface(Components.interfaces.nsIImapIncomingServer);
var storeReadMailInPFC = imapServer.storeReadMailInPFC;
if (storeReadMailInPFC)
{
var messageID;
var copyToOfflineFolder = true;
// look in read mail PFC for msg with same msg id - if we find one,
// don't put this message in the read mail pfc.
var outputPFC = imapServer.GetReadMailPFC(true);
var messageURI = GetLoadedMessage();
if (messageURI != msgURI)
{
// XXX TODO
// bienvenu tells me:
// if you have two message windows open, you can get multiple attempts
// to copy into the pfc. the second will fail and assert.
dump("not loading msg into this window - loaded message = " + messageURI + "loading " + msgURI + "\n");
// return;
}
var msgHdr = messenger.messageServiceFromURI(messageURI).messageURIToMsgHdr(messageURI);
if (msgHdr)
{
messageID = msgHdr.messageId;
if (messageID.length > 0)
{
var readMailDB = outputPFC.getMsgDatabase(msgWindow);
if (readMailDB)
{
var hdrInDestDB = readMailDB.getMsgHdrForMessageID(messageID);
if (hdrInDestDB)
copyToOfflineFolder = false;
}
}
}
if (copyToOfflineFolder)
{
var messages = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
messages.AppendElement(msgHdr);
res = outputPFC.copyMessages(currentMsgFolder, messages, false /*isMove*/, msgWindow /* nsIMsgWindow */, null /* listener */, false /* isFolder */, false /*allowUndo*/ );
}
}
}
function MsgSearchMessages()
{
var preselectedFolder = null;

View File

@ -24,6 +24,7 @@ Rights Reserved.
<?xul-overlay href="chrome://global/content/charsetOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/viewZoomOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/mailWindowExtrasOverlay.xul"?>
<!DOCTYPE window [
<!ENTITY % messengerDTD SYSTEM "chrome://messenger/locale/messenger.dtd" >

View File

@ -62,6 +62,9 @@ var folderListener = {
else if (event.GetUnicode() == "DeleteOrMoveMsgFailed") {
HandleDeleteOrMoveMsgFailed(folder);
}
else if (event.GetUnicode() == "msgLoaded") {
OnMsgLoaded(folder, gCurrentMessageUri);
}
}
}
@ -125,6 +128,13 @@ function UpdateDBView(folderUri)
function nsMsgDBViewCommandUpdater()
{}
function UpdateStandAloneMessageCounts()
{
// hook for extra toolbar items
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window, "mail:updateStandAloneMessageCounts", "");
}
nsMsgDBViewCommandUpdater.prototype =
{
updateCommandStatus : function()
@ -134,10 +144,12 @@ nsMsgDBViewCommandUpdater.prototype =
UpdateMailToolbar("dbview, std alone window");
},
displayMessageChanged : function(aFolder, aSubject)
displayMessageChanged : function(aFolder, aSubject, aKeywords)
{
setTitleFromFolder(aFolder, aSubject);
gCurrentMessageUri = gDBView.URIForFirstSelectedMessage;
UpdateStandAloneMessageCounts();
SetKeywords(aKeywords);
},
QueryInterface : function(iid)
@ -245,9 +257,9 @@ function OnLoadMessageWindow()
}
CreateView(originalView)
setTimeout("var msgKey = extractMsgKeyFromURI(gCurrentMessageUri); gDBView.loadMessageByMsgKey(msgKey); gNextMessageViewIndexAfterDelete = gDBView.msgToSelectAfterDelete;", 0);
setTimeout("var msgKey = extractMsgKeyFromURI(gCurrentMessageUri); gDBView.loadMessageByMsgKey(msgKey); gNextMessageViewIndexAfterDelete = gDBView.msgToSelectAfterDelete; UpdateStandAloneMessageCounts();", 0);
SetupCommandUpdateHandlers();
var messagePaneFrame = top.frames['messagepane'];
if(messagePaneFrame)
@ -290,12 +302,19 @@ function CreateView(originalView)
// create a db view
CreateBareDBView(originalView, msgFolder, viewType, viewFlags, sortType, sortOrder);
if (gCurrentMessageUri) {
SetUpToolbarButtons(gCurrentMessageUri);
}
else if (gCurrentFolderUri) {
SetUpToolbarButtons(gCurrentFolderUri);
}
var uri;
if (gCurrentMessageUri)
uri = gCurrentMessageUri;
else if (gCurrentFolderUri)
uri = gCurrentFolderUri;
else
uri = null;
SetUpToolbarButtons(uri);
// hook for extra toolbar items
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window, "mail:setupToolbarItems", uri);
}
function extractMsgKeyFromURI()
@ -483,7 +502,6 @@ function SelectMessage(messageUri)
gDBView.loadMessageByMsgKey(msgHdr.messageKey);
}
function ReloadMessage()
{
gDBView.reloadMessage();
@ -851,6 +869,8 @@ function performNavigation(type)
{
// load the message key
gDBView.loadMessageByMsgKey(resultId.value);
// if we changed folders, the message counts changed.
UpdateStandAloneMessageCounts();
return;
}

View File

@ -125,7 +125,8 @@ Rights Reserved.
<menubar id="mailMenubar"/>
</toolbox>
<!-- msg header view -->
<!-- msg header view -->
<vbox id="messagesBox" flex="1">
<vbox id="messagepanebox" flex="3" persist="collapsed"
ondragover="nsDragAndDrop.dragOver(event, messagepaneObserver);"
ondragdrop="nsDragAndDrop.drop(event, messagepaneObserver);"
@ -136,7 +137,7 @@ Rights Reserved.
<browser id="messagepane" context="messagePaneContext" style="height: 0px" flex="1" name="messagepane"
disableHistory="true" type="content-primary" src="about:blank" onclick="contentAreaClick(event);"/>
</vbox>
</vbox>
<statusbar class="chromeclass-status" id="status-bar"/>

View File

@ -22,6 +22,7 @@ Rights Reserved.
<!DOCTYPE window SYSTEM "chrome://messenger/locale/msgHdrViewOverlay.dtd">
<?xml-stylesheet href="chrome://messenger/skin/messageHeader.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/messageKeywords.css" type="text/css"?>
<overlay xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
@ -54,9 +55,9 @@ Rights Reserved.
<tooltip id="attachmentListTooltip"
onpopupshowing="return FillInAttachmentTooltip(document.tooltipNode);"/>
<hbox id="msgHeaderView" persist="state">
<hbox id="msgHeaderView" originalclass="none" persist="state">
<grid id="collapsedHeaderView" class="header-part1" flex="1" collapsed="true">
<grid id="collapsedHeaderView" class="header-part1" originalclass="header-part1" flex="1" collapsed="true">
<rows>
<row flex="1"/>
</rows>
@ -88,6 +89,12 @@ Rights Reserved.
</hbox>
</column>
<column id="collapsedKeywordBox">
<hbox align="start">
<image id="collapsedKeywordImage" originalclass="none"/>
</hbox>
</column>
<column id="collapsedAttachmentBox" collapsed="true">
<hbox align="start">
<image id="collapsedAttachment" class="collapsedAttachmentButton" onclick="ToggleHeaderView();" />
@ -96,7 +103,7 @@ Rights Reserved.
</columns>
</grid>
<hbox id="expandedHeaderView" class="header-part1" flex="1" collapsed="true">
<hbox id="expandedHeaderView" class="header-part1" originalclass="header-part1" flex="1" collapsed="true">
<vbox id="expandedHeaders" flex="1">
<mail-toggle-headerfield id="expandedsubjectBox" class="subjectvalue" label="&subjectField.label;" ontwistyclick="ToggleHeaderView();" collapsed="true"/>
@ -115,11 +122,19 @@ Rights Reserved.
</vbox>
<vbox id="editMessageBox" class="header-part1" collapsed="true">
<vbox id="expandedKeywordBox">
<spacer flex="1"/>
<image id="expandedKeywordImage" originalclass="none" />
<spacer flex="1"/>
</vbox>
<vbox id="editMessageBox" class="header-part1" originalclass="header-part1" collapsed="true">
<spacer flex="1"/>
<button id="editMessageButton" label="&editMessage.label;" oncommand="MsgComposeDraftMessage()"/>
<spacer flex="1"/>
</vbox>
<vbox id="expandedAttachmentBox" class="header-part1" collapsed="true">
<vbox id="expandedAttachmentBox" class="header-part1" originalclass="header-part1" collapsed="true">
<label id="attachmentText" value="&attachmentsTree.label;" crop="right"/>
<listbox id="attachmentList" flex="2"
onclick="attachmentListClick(event);" ondraggesture="nsDragAndDrop.startDrag(event,attachmentAreaDNDObserver);" ondragover="nsDragAndDrop.dragOver(event, attachmentAreaDNDObserver);" context="attachmentListContext"/>

View File

@ -183,6 +183,27 @@ var folderListener = {
}
}
}
else if (eventType == "ImapHdrDownloaded") {
if (folder) {
var imapFolder = folder.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
if (imapFolder) {
var hdrParser = imapFolder.hdrParser;
if (hdrParser) {
var msgHdr = hdrParser.GetNewMsgHdr();
if (msgHdr)
{
var hdrs = hdrParser.headers;
if (hdrs && hdrs.indexOf("X-attachment-size:") > 0) {
msgHdr.OrFlags(0x10000000); // 0x10000000 is MSG_FLAG_ATTACHMENT
}
if (hdrs && hdrs.indexOf("X-image-size:") > 0) {
msgHdr.setStringProperty("imageSize", "1");
}
}
}
}
}
}
else if (eventType == "DeleteOrMoveMsgCompleted") {
HandleDeleteOrMoveMsgCompleted(folder);
}
@ -195,6 +216,9 @@ var folderListener = {
else if(eventType == "RenameCompleted") {
SelectFolder(folder.URI);
}
else if (eventType == "msgLoaded") {
OnMsgLoaded(folder, gCurrentDisplayedMessage);
}
}
}
@ -268,6 +292,11 @@ function HandleDeleteOrMoveMsgFailed(folder)
function HandleDeleteOrMoveMsgCompleted(folder)
{
// you might not have a db view. this can happen if
// biff fires when the 3 pane is set to account central.
if (!gDBView)
return;
gDBView.onDeleteCompleted(true);
if (gNextMessageViewIndexAfterDelete != -2)
{
@ -320,9 +349,15 @@ function HandleDeleteOrMoveMsgCompleted(folder)
if (treeView)
treeView.selectionChanged();
EnsureRowInThreadTreeIsVisible(gNextMessageViewIndexAfterDelete);
gDBView.suppressCommandUpdating = false;
// hook for extra toolbar items
// XXX I think there is a bug in the suppression code above.
// what if I have two rows selected, and I hit delete, and so we load the next row.
// what if I have commands that only enable where exactly one row is selected?
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window, "mail:updateToolbarItems", null);
}
}
gNextMessageViewIndexAfterDelete = -2;

View File

@ -77,10 +77,11 @@ nsMsgDBViewCommandUpdater.prototype =
UpdateMailToolbar("dbview driven, thread pane");
},
displayMessageChanged : function(aFolder, aSubject)
displayMessageChanged : function(aFolder, aSubject, aKeywords)
{
setTitleFromFolder(aFolder, aSubject);
gHaveLoadedMessage = true;
SetKeywords(aKeywords);
},
QueryInterface : function(iid)

View File

@ -21,6 +21,7 @@ Rights Reserved.
-->
<?xml-stylesheet href="chrome://messenger/skin/threadPane.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/threadPaneExtras.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/threadPaneLabels.css" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://messenger/locale/threadpane.dtd">

View File

@ -439,7 +439,7 @@ nsMsgSearchCommandUpdater.prototype =
// when the # of items in the selection has actually changed.
document.commandDispatcher.updateCommands('mail-search');
},
displayMessageChanged : function(aFolder, aSubject)
displayMessageChanged : function(aFolder, aSubject, aKeywords)
{
},

View File

@ -321,7 +321,7 @@ NS_IMETHODIMP nsMsgDBView::Observe(nsISupports *aSubject, const char *aTopic, co
nsresult rv = NS_OK;
PRBool matchFound = PR_FALSE;
if (!nsCRT::strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID))
if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID))
{
nsCString prefName;
nsCString indexStr;
@ -1116,6 +1116,9 @@ NS_IMETHODIMP nsMsgDBView::GetCellProperties(PRInt32 aRow, const PRUnichar *colI
if ((mDeleteModel == nsMsgImapDeleteModels::IMAPDelete) && (flags & MSG_FLAG_IMAP_DELETED))
properties->AppendElement(kImapDeletedMsgAtom);
if (mRedirectorTypeAtom)
properties->AppendElement(mRedirectorTypeAtom);
if (mIsNews)
properties->AppendElement(kNewsMsgAtom);
@ -1604,7 +1607,17 @@ NS_IMETHODIMP nsMsgDBView::Open(nsIMsgFolder *folder, nsMsgViewSortTypeValue sor
nsXPIDLCString type;
rv = server->GetType(getter_Copies(type));
NS_ENSURE_SUCCESS(rv,rv);
mIsNews = !nsCRT::strcmp("nntp",type.get());
// turn the redirector type into an atom
nsXPIDLCString redirectorType;
rv = server->GetRedirectorType(getter_Copies(redirectorType));
NS_ENSURE_SUCCESS(rv,rv);
if (redirectorType.IsEmpty())
mRedirectorTypeAtom = nsnull;
else
mRedirectorTypeAtom = getter_AddRefs(NS_NewAtom(redirectorType.get()));
mIsNews = !strcmp("nntp",type.get());
GetImapDeleteModel(nsnull);
}
return NS_OK;

View File

@ -332,6 +332,7 @@ protected:
nsCOMPtr <nsIMsgDatabase> m_db;
nsCOMPtr <nsIMsgFolder> m_folder;
nsCOMPtr <nsIAtom> mRedirectorTypeAtom;
nsWeakPtr m_searchSession;
nsMsgViewSortTypeValue m_sortType;
nsMsgViewSortOrderValue m_sortOrder;

View File

@ -76,6 +76,7 @@ nsIRDFResource* nsMsgFolderDataSource::kNC_NameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeNameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_SpecialFolder= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_ServerType = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_RedirectorType = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_CanCreateFoldersOnServer = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_CanFileMessagesOnServer = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_IsServer = nsnull;
@ -140,6 +141,7 @@ nsMsgFolderDataSource::nsMsgFolderDataSource()
rdf->GetResource(NC_RDF_FOLDERTREENAME_SORT, &kNC_FolderTreeNameSort);
rdf->GetResource(NC_RDF_SPECIALFOLDER, &kNC_SpecialFolder);
rdf->GetResource(NC_RDF_SERVERTYPE, &kNC_ServerType);
rdf->GetResource(NC_RDF_REDIRECTORTYPE, &kNC_RedirectorType);
rdf->GetResource(NC_RDF_CANCREATEFOLDERSONSERVER, &kNC_CanCreateFoldersOnServer);
rdf->GetResource(NC_RDF_CANFILEMESSAGESONSERVER, &kNC_CanFileMessagesOnServer);
rdf->GetResource(NC_RDF_ISSERVER, &kNC_IsServer);
@ -208,6 +210,7 @@ nsMsgFolderDataSource::~nsMsgFolderDataSource (void)
NS_RELEASE2(kNC_FolderTreeNameSort, refcnt);
NS_RELEASE2(kNC_SpecialFolder, refcnt);
NS_RELEASE2(kNC_ServerType, refcnt);
NS_RELEASE2(kNC_RedirectorType, refcnt);
NS_RELEASE2(kNC_CanCreateFoldersOnServer, refcnt);
NS_RELEASE2(kNC_CanFileMessagesOnServer, refcnt);
NS_RELEASE2(kNC_IsServer, refcnt);
@ -453,6 +456,7 @@ NS_IMETHODIMP nsMsgFolderDataSource::GetTargets(nsIRDFResource* source,
(kNC_CanRename == property) ||
(kNC_CanCompact == property) ||
(kNC_ServerType == property) ||
(kNC_RedirectorType == property) ||
(kNC_CanCreateFoldersOnServer == property) ||
(kNC_CanFileMessagesOnServer == property) ||
(kNC_NoSelect == property) ||
@ -542,6 +546,7 @@ nsMsgFolderDataSource::HasArcOut(nsIRDFResource *aSource, nsIRDFResource *aArc,
aArc == kNC_FolderTreeSimpleName ||
aArc == kNC_SpecialFolder ||
aArc == kNC_ServerType ||
aArc == kNC_RedirectorType ||
aArc == kNC_CanCreateFoldersOnServer ||
aArc == kNC_CanFileMessagesOnServer ||
aArc == kNC_IsServer ||
@ -608,6 +613,7 @@ nsMsgFolderDataSource::getFolderArcLabelsOut(nsISupportsArray **arcs)
(*arcs)->AppendElement(kNC_FolderTreeSimpleName);
(*arcs)->AppendElement(kNC_SpecialFolder);
(*arcs)->AppendElement(kNC_ServerType);
(*arcs)->AppendElement(kNC_RedirectorType);
(*arcs)->AppendElement(kNC_CanCreateFoldersOnServer);
(*arcs)->AppendElement(kNC_CanFileMessagesOnServer);
(*arcs)->AppendElement(kNC_IsServer);
@ -1009,6 +1015,8 @@ nsresult nsMsgFolderDataSource::createFolderNode(nsIMsgFolder* folder,
rv = createFolderSpecialNode(folder,target);
else if ((kNC_ServerType == property))
rv = createFolderServerTypeNode(folder, target);
else if ((kNC_RedirectorType == property))
rv = createFolderRedirectorTypeNode(folder, target);
else if ((kNC_CanCreateFoldersOnServer == property))
rv = createFolderCanCreateFoldersOnServerNode(folder, target);
else if ((kNC_CanFileMessagesOnServer == property))
@ -1173,10 +1181,24 @@ nsMsgFolderDataSource::createFolderServerTypeNode(nsIMsgFolder* folder,
rv = server->GetType(getter_Copies(serverType));
if (NS_FAILED(rv)) return rv;
nsAutoString type;
type.AssignWithConversion(serverType.get());
createNode(NS_ConvertASCIItoUCS2(serverType).get(), target, getRDFService());
return NS_OK;
}
createNode(type.get(), target, getRDFService());
nsresult
nsMsgFolderDataSource::createFolderRedirectorTypeNode(nsIMsgFolder* folder,
nsIRDFNode **target)
{
nsresult rv;
nsCOMPtr<nsIMsgIncomingServer> server;
rv = folder->GetServer(getter_AddRefs(server));
if (NS_FAILED(rv) || !server) return NS_ERROR_FAILURE;
nsXPIDLCString redirectorType;
rv = server->GetRedirectorType(getter_Copies(redirectorType));
if (NS_FAILED(rv)) return rv;
createNode(NS_ConvertASCIItoUCS2(redirectorType).get(), target, getRDFService());
return NS_OK;
}
@ -2100,6 +2122,7 @@ nsresult nsMsgFolderDataSource::DoFolderHasAssertion(nsIMsgFolder *folder,
(kNC_FolderTreeSimpleName == property) ||
(kNC_SpecialFolder == property) ||
(kNC_ServerType == property) ||
(kNC_RedirectorType == property) ||
(kNC_CanCreateFoldersOnServer == property) ||
(kNC_CanFileMessagesOnServer == property) ||
(kNC_IsServer == property) ||

View File

@ -133,6 +133,8 @@ protected:
nsresult createFolderSpecialNode(nsIMsgFolder *folder, nsIRDFNode **target);
nsresult createFolderServerTypeNode(nsIMsgFolder *folder,
nsIRDFNode **target);
nsresult createFolderRedirectorTypeNode(nsIMsgFolder *folder,
nsIRDFNode **target);
nsresult createFolderCanCreateFoldersOnServerNode(nsIMsgFolder *folder,
nsIRDFNode **target);
nsresult createFolderCanFileMessagesOnServerNode(nsIMsgFolder *folder,
@ -219,6 +221,7 @@ protected:
static nsIRDFResource* kNC_MSGFolderRoot;
static nsIRDFResource* kNC_SpecialFolder;
static nsIRDFResource* kNC_ServerType;
static nsIRDFResource* kNC_RedirectorType;
static nsIRDFResource* kNC_CanCreateFoldersOnServer;
static nsIRDFResource* kNC_CanFileMessagesOnServer;
static nsIRDFResource* kNC_IsServer;

View File

@ -81,6 +81,7 @@ typedef struct _nsMsgRDFNotification {
#define NC_RDF_FOLDER NC_NAMESPACE_URI "Folder"
#define NC_RDF_SPECIALFOLDER NC_NAMESPACE_URI "SpecialFolder"
#define NC_RDF_SERVERTYPE NC_NAMESPACE_URI "ServerType"
#define NC_RDF_REDIRECTORTYPE NC_NAMESPACE_URI "RedirectorType"
#define NC_RDF_CANCREATEFOLDERSONSERVER NC_NAMESPACE_URI "CanCreateFoldersOnServer"
#define NC_RDF_CANFILEMESSAGESONSERVER NC_NAMESPACE_URI "CanFileMessagesOnServer"
#define NC_RDF_ISSERVER NC_NAMESPACE_URI "IsServer"

View File

@ -1728,6 +1728,10 @@ function GenericSendMessage( msgType )
}
}
// hook for extra compose pre-processing
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window, "mail:composeOnSend", null);
// Check if the headers of composing mail can be converted to a mail charset.
if (msgType == nsIMsgCompDeliverMode.Now ||
msgType == nsIMsgCompDeliverMode.Later ||

View File

@ -0,0 +1,28 @@
<!--
The contents of this file are subject to the Netscape 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/NPL/
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.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
-->
<overlay
xmlns:nc="http://home.netscape.com/NC-rdf#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<!-- plug in your mail compose window extras here.
see http://www.mozilla.org/mailnews/arch/composewindowextras.html -->
</overlay>

View File

@ -37,6 +37,7 @@
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
<?xul-overlay href="chrome://editor/content/editorOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/messengercompose/mailComposeExtrasOverlay.xul"?>
<!DOCTYPE window [
<!ENTITY % messengercomposeDTD SYSTEM "chrome://messenger/locale/messengercompose/messengercompose.dtd" >

View File

@ -96,6 +96,7 @@ messenger.jar:
content/messenger/messenger.css (base/resources/content/messenger.css)
content/messenger/messenger.xul (base/resources/content/messenger.xul)
content/messenger/mail3PaneWindowVertLayout.xul (base/resources/content/mail3PaneWindowVertLayout.xul)
content/messenger/mailWindowExtrasOverlay.xul (base/resources/content/mailWindowExtrasOverlay.xul)
content/messenger/mailWindowOverlay.xul (base/resources/content/mailWindowOverlay.xul)
content/messenger/mailWindowOverlay.js (base/resources/content/mailWindowOverlay.js)
content/messenger/msgSynchronize.xul (base/resources/content/msgSynchronize.xul)
@ -169,6 +170,7 @@ messenger.jar:
content/messenger/messengercompose/sendProgress.xul (compose/resources/content/sendProgress.xul)
content/messenger/messengercompose/sendProgress.js (compose/resources/content/sendProgress.js)
content/messenger/messengercompose/mailComposeBindings.xml (compose/resources/content/mailComposeBindings.xml)
content/messenger/messengercompose/mailComposeExtrasOverlay.xul (compose/resources/content/mailComposeExtrasOverlay.xul)
content/messenger/importDialog.js (import/resources/content/importDialog.js)
content/messenger/importDialog.xul (import/resources/content/importDialog.xul)
content/messenger/importProgress.xul (import/resources/content/importProgress.xul)

View File

@ -270,6 +270,9 @@ classic.jar:
skin/classic/messenger/icons/thread-open-offl-eye.gif (messenger/icons/thread-open-offl-eye.gif)
skin/classic/messenger/icons/thread-open-offl-kill.gif (messenger/icons/thread-open-offl-kill.gif)
skin/classic/messenger/icons/server-news-new.gif (messenger/icons/server-news-new.gif)
skin/classic/messenger/folderPaneExtras.css (messenger/folderPaneExtras.css)
skin/classic/messenger/threadPaneExtras.css (messenger/threadPaneExtras.css)
skin/classic/messenger/messageKeywords.css (messenger/messageKeywords.css)
skin/classic/messenger/icons/new-mail-alert.png (messenger/icons/new-mail-alert.png)
skin/classic/messenger/addressbook/abResultsPane.css (messenger/addressbook/abResultsPane.css)
skin/classic/messenger/addressbook/addressPanes.css (messenger/addressbook/addressPanes.css)

View File

@ -0,0 +1,3 @@
/* distributors / ISPs can override folder pane icons
* see http://www.mozilla.org/mailnews/arch/folderpaneextras.html
*/

View File

@ -0,0 +1,4 @@
/* distributors / ISPs can use this
* to add or override icons and colors to the message pane.
* see http://www.mozilla.org/mailnews/arch/messagekeywords.html
*/

View File

@ -0,0 +1,3 @@
/* distributors / ISPs can override this to override thread pane icons.
* see http://www.mozilla.org/mailnews/arch/threadpaneextras.html
*/

View File

@ -270,9 +270,12 @@ modern.jar:
skin/modern/messenger/folderMenus.css (messenger/folderMenus.css)
skin/modern/messenger/folderPane.css (messenger/folderPane.css)
skin/modern/messenger/fakeAccount.css (messenger/fakeAccount.css)
skin/modern/messenger/folderPaneExtras.css (messenger/folderPaneExtras.css)
skin/modern/messenger/threadPaneExtras.css (messenger/threadPaneExtras.css)
skin/modern/messenger/mailWindow2.css (messenger/mailWindow2.css)
skin/modern/messenger/messageBody.css (messenger/messageBody.css)
skin/modern/messenger/messageHeader.css (messenger/messageHeader.css)
skin/modern/messenger/messageKeywords.css (messenger/messageKeywords.css)
skin/modern/messenger/messageWindow.css (messenger/messageWindow.css)
skin/modern/messenger/messenger.css (messenger/messenger.css)
skin/modern/messenger/prefPanels.css (messenger/prefPanels.css)

View File

@ -0,0 +1,3 @@
/* distributors / ISPs can override folder pane icons
* see http://www.mozilla.org/mailnews/arch/folderpaneextras.html
*/

View File

@ -0,0 +1,4 @@
/* distributors / ISPs can use this
* to add or override icons and colors to the message pane.
* see http://www.mozilla.org/mailnews/arch/messagekeywords.html
*/

View File

@ -0,0 +1,3 @@
/* distributors / ISPs can override this to override thread pane icons.
* see http://www.mozilla.org/mailnews/arch/threadpaneextras.html
*/