This commit is contained in:
mscott%netscape.com 2003-04-05 07:35:40 +00:00
Родитель d06d19e60b
Коммит a5c274b6a3
35 изменённых файлов: 8058 добавлений и 76 удалений

Просмотреть файл

@ -0,0 +1,680 @@
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* 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.
*
* Contributors(s):
* Jan Varga <varga@utcru.sk>
* Håkan Waara (hwaara@chello.se)
*/
//This file stores variables common to mail windows
var messengerContractID = "@mozilla.org/messenger;1";
var statusFeedbackContractID = "@mozilla.org/messenger/statusfeedback;1";
var mailSessionContractID = "@mozilla.org/messenger/services/session;1";
var secureUIContractID = "@mozilla.org/secure_browser_ui;1";
var prefContractID = "@mozilla.org/preferences-service;1";
var msgWindowContractID = "@mozilla.org/messenger/msgwindow;1";
var messenger;
var pref;
var prefServices;
var statusFeedback;
var messagePaneController;
var msgWindow;
var msgComposeService;
var accountManager;
var RDF;
var msgComposeType;
var msgComposeFormat;
var mailSession;
var gMessengerBundle;
var gBrandBundle;
var datasourceContractIDPrefix = "@mozilla.org/rdf/datasource;1?name=";
var accountManagerDSContractID = datasourceContractIDPrefix + "msgaccountmanager";
var folderDSContractID = datasourceContractIDPrefix + "mailnewsfolders";
var accountManagerDataSource;
var folderDataSource;
var messagesBox = null;
var accountCentralBox = null;
var gSearchBox = null;
var gAccountCentralLoaded = false;
var gFakeAccountPageLoaded = false;
var gPaneConfig = null;
//End progress and Status variables
// for checking if the folder loaded is Draft or Unsent which msg is editable
var gIsEditableMsgFolder = false;
var gOfflineManager;
// cache the last keywords
var gLastKeywords = "";
function OnMailWindowUnload()
{
RemoveMailOfflineObserver();
var searchSession = GetSearchSession();
if (searchSession)
{
removeGlobalListeners();
if (gPreQuickSearchView) //close the cached pre quick search view
gPreQuickSearchView.close();
}
var dbview = GetDBView();
if (dbview) {
dbview.close();
}
var mailSession = Components.classes[mailSessionContractID].getService();
if(mailSession)
{
mailSession = mailSession.QueryInterface(Components.interfaces.nsIMsgMailSession);
if(mailSession)
{
mailSession.RemoveFolderListener(folderListener);
}
}
mailSession.RemoveMsgWindow(msgWindow);
messenger.SetWindow(null, null);
var msgDS = folderDataSource.QueryInterface(Components.interfaces.nsIMsgRDFDataSource);
msgDS.window = null;
msgDS = accountManagerDataSource.QueryInterface(Components.interfaces.nsIMsgRDFDataSource);
msgDS.window = null;
msgWindow.closeWindow();
}
function CreateMessenger()
{
messenger = Components.classes[messengerContractID].createInstance();
messenger = messenger.QueryInterface(Components.interfaces.nsIMessenger);
}
function CreateMailWindowGlobals()
{
// get the messenger instance
CreateMessenger();
prefServices = Components.classes[prefContractID].getService(Components.interfaces.nsIPrefService);
pref = prefServices.getBranch(null);
//Create windows status feedback
// set the JS implementation of status feedback before creating the c++ one..
window.MsgStatusFeedback = new nsMsgStatusFeedback();
// double register the status feedback object as the xul browser window implementation
window.XULBrowserWindow = window.MsgStatusFeedback;
statusFeedback = Components.classes[statusFeedbackContractID].createInstance();
statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback);
/*
not in use unless we want the lock button back
// try to create and register ourselves with a security icon...
var securityIcon = document.getElementById("security-button");
if (securityIcon) {
// if the client isn't built with psm enabled then we won't have a secure UI to monitor the lock icon
// so be sure to wrap this in a try / catch clause...
try {
var secureUI;
// we may not have a secure UI if psm isn't installed!
if (secureUIContractID in Components.classes) {
secureUI = Components.classes[secureUIContractID].createInstance();
if (secureUI) {
secureUI = secureUI.QueryInterface(Components.interfaces.nsISecureBrowserUI);
secureUI.init(_content, securityIcon);
}
}
}
catch (ex) {}
}
*/
window.MsgWindowCommands = new nsMsgWindowCommands();
//Create message window object
msgWindow = Components.classes[msgWindowContractID].createInstance();
msgWindow = msgWindow.QueryInterface(Components.interfaces.nsIMsgWindow);
msgComposeService = Components.classes['@mozilla.org/messengercompose;1'].getService();
msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService);
mailSession = Components.classes["@mozilla.org/messenger/services/session;1"].getService(Components.interfaces.nsIMsgMailSession);
accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
RDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService();
RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
msgComposeType = Components.interfaces.nsIMsgCompType;
msgComposeFormat = Components.interfaces.nsIMsgCompFormat;
gMessengerBundle = document.getElementById("bundle_messenger");
gBrandBundle = document.getElementById("bundle_brand");
//Create datasources
accountManagerDataSource = Components.classes[accountManagerDSContractID].createInstance();
folderDataSource = Components.classes[folderDSContractID].createInstance();
messagesBox = document.getElementById("messagesBox");
accountCentralBox = document.getElementById("accountCentralBox");
gSearchBox = document.getElementById("searchBox");
gPaneConfig = pref.getIntPref("mail.pane_config");
}
function InitMsgWindow()
{
msgWindow.messagePaneController = new nsMessagePaneController();
msgWindow.statusFeedback = statusFeedback;
msgWindow.msgHeaderSink = messageHeaderSink;
msgWindow.SetDOMWindow(window);
mailSession.AddMsgWindow(msgWindow);
}
function AddDataSources()
{
accountManagerDataSource = accountManagerDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
folderDataSource = folderDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
//to move menu item
SetupMoveCopyMenus('moveMenu', accountManagerDataSource, folderDataSource);
//to copy menu item
SetupMoveCopyMenus('copyMenu', accountManagerDataSource, folderDataSource);
//To FileButton menu
SetupMoveCopyMenus('button-file', accountManagerDataSource, folderDataSource);
//To move and copy menus in message pane context
SetupMoveCopyMenus("messagePaneContext-copyMenu", accountManagerDataSource, folderDataSource);
SetupMoveCopyMenus("messagePaneContext-moveMenu", accountManagerDataSource, folderDataSource);
//Add statusFeedback
var msgDS = folderDataSource.QueryInterface(Components.interfaces.nsIMsgRDFDataSource);
msgDS.window = msgWindow;
msgDS = accountManagerDataSource.QueryInterface(Components.interfaces.nsIMsgRDFDataSource);
msgDS.window = msgWindow;
}
function SetupMoveCopyMenus(menuid, accountManagerDataSource, folderDataSource)
{
var menu = document.getElementById(menuid);
if(menu)
{
menu.database.AddDataSource(accountManagerDataSource);
menu.database.AddDataSource(folderDataSource);
menu.setAttribute('ref', 'msgaccounts:/');
}
}
function dumpProgress() {
var broadcaster = document.getElementById("Messenger:LoadingProgress");
dump( "broadcaster mode=" + broadcaster.getAttribute("mode") + "\n" );
dump( "broadcaster value=" + broadcaster.getAttribute("value") + "\n" );
dump( "meter mode=" + meter.getAttribute("mode") + "\n" );
dump( "meter value=" + meter.getAttribute("value") + "\n" );
}
// We're going to implement our status feedback for the mail window in JS now.
// the following contains the implementation of our status feedback object
function nsMsgStatusFeedback()
{
}
nsMsgStatusFeedback.prototype =
{
// global variables for status / feedback information....
statusTextFld : null,
statusBar : null,
throbber : null,
stopCmd : null,
startTimeoutID : null,
stopTimeoutID : null,
progressMeterContainer : null,
pendingStartRequests : 0,
meteorsSpinning : false,
progressMeterVisible : false,
ensureStatusFields : function()
{
if (!this.statusTextFld ) this.statusTextFld = document.getElementById("statusText");
if (!this.statusBar) this.statusBar = document.getElementById("statusbar-icon");
if(!this.throbber) this.throbber = document.getElementById("navigator-throbber");
if(!this.stopCmd) this.stopCmd = document.getElementById("cmd_stop");
if (!this.progressMeterContainer) this.progressMeterContainer = document.getElementById("statusbar-progresspanel");
},
// nsIXULBrowserWindow implementation
setJSStatus : function(status)
{
},
setJSDefaultStatus : function(status)
{
},
setOverLink : function(link)
{
this.showStatusString(link);
},
QueryInterface : function(iid)
{
if (iid.equals(Components.interfaces.nsIMsgStatusFeedback) ||
iid.equals(Components.interfaces.nsIXULBrowserWindow) ||
iid.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
// nsIMsgStatusFeedback implementation.
showStatusString : function(statusText)
{
this.ensureStatusFields();
if ( statusText == "" )
statusText = defaultStatus;
this.statusTextFld.label = statusText;
},
_startMeteors : function()
{
this.ensureStatusFields();
this.meteorsSpinning = true;
this.startTimeoutID = null;
// Turn progress meter on.
this.statusBar.setAttribute("mode","undetermined");
// turn throbber on
this.throbber.setAttribute("busy", true);
//turn on stop button and menu
this.stopCmd.removeAttribute("disabled");
},
startMeteors : function()
{
this.pendingStartRequests++;
// if we don't already have a start meteor timeout pending
// and the meteors aren't spinning, then kick off a start
if (!this.startTimeoutID && !this.meteorsSpinning)
this.startTimeoutID = setTimeout('window.MsgStatusFeedback._startMeteors();', 500);
// since we are going to start up the throbber no sense in processing
// a stop timeout...
if (this.stopTimeoutID)
{
clearTimeout(this.stopTimeoutID);
this.stopTimeoutID = null;
}
},
_stopMeteors : function()
{
if(gTimelineEnabled){
gTimelineService.stopTimer("FolderLoading");
gTimelineService.markTimer("FolderLoading");
gTimelineService.resetTimer("FolderLoading");
}
this.ensureStatusFields();
var msg = gMessengerBundle.getString("documentDone");
this.showStatusString(msg);
defaultStatus = msg;
this.throbber.setAttribute("busy", false);
// Turn progress meter off.
this.statusBar.setAttribute("mode","normal");
this.statusBar.value = 0; // be sure to clear the progress bar
this.statusBar.label = "";
if (this.progressMeterVisible)
{
this.progressMeterContainer.collapsed = true;
this.progressMeterVisible = false;
}
this.stopCmd.setAttribute("disabled", "true");
this.meteorsSpinning = false;
this.stopTimeoutID = null;
},
stopMeteors : function()
{
if (this.pendingStartRequests > 0)
this.pendingStartRequests--;
// if we are going to be starting the meteors, cancel the start
if (this.pendingStartRequests == 0 && this.startTimeoutID)
{
clearTimeout(this.startTimeoutID);
this.startTimeoutID = null;
}
// if we have no more pending starts and we don't have a stop timeout already in progress
// AND the meteors are currently running then fire a stop timeout to shut them down.
if (this.pendingStartRequests == 0 && !this.stopTimeoutID)
{
if (this.meteorsSpinning)
this.stopTimeoutID = setTimeout('window.MsgStatusFeedback._stopMeteors();', 500);
}
},
showProgress : function(percentage)
{
this.ensureStatusFields();
if (percentage >= 0)
{
this.statusBar.setAttribute("mode", "normal");
this.statusBar.value = percentage;
this.statusBar.label = Math.round(percentage) + "%";
if (this.progressMeterVisible)
this.progressMeterContainer.collapsed = false;
}
},
closeWindow : function(percent)
{
}
}
function nsMsgWindowCommands()
{
}
nsMsgWindowCommands.prototype =
{
QueryInterface : function(iid)
{
if (iid.equals(Components.interfaces.nsIMsgWindowCommands) ||
iid.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
SelectFolder: function(folderUri)
{
SelectFolder(folderUri);
},
SelectMessage: function(messageUri)
{
SelectMessage(messageUri);
}
}
function nsMessagePaneController()
{
}
nsMessagePaneController.prototype =
{
QueryInterface : function(iid)
{
if (iid.equals(Components.interfaces.nsIMsgMessagePaneController) ||
iid.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
clearMsgPane: function()
{
if (gDBView)
setTitleFromFolder(gDBView.msgFolder,null);
else
setTitleFromFolder(null,null);
ClearMessagePane();
}
}
function StopUrls()
{
msgWindow.StopUrls();
}
function loadStartPage() {
try {
// collapse the junk bar
SetUpJunkBar(null);
var startpageenabled = pref.getBoolPref("mailnews.start_page.enabled");
if (startpageenabled) {
var startpage = pref.getComplexValue("mailnews.start_page.url",
Components.interfaces.nsIPrefLocalizedString).data;
if (startpage != "") {
// first, clear out the charset setting.
messenger.setDisplayCharset("");
GetMessagePaneFrame().location = startpage;
//dump("start message pane with: " + startpage + "\n");
ClearMessageSelection();
}
}
}
catch (ex) {
dump("Error loading start page.\n");
return;
}
}
// Display AccountCentral page when users clicks on the Account Folder.
// When AccountCentral page need to be shown, we need to hide
// the box containing threadPane, splitter and messagePane.
// Load iframe in the AccountCentral box with corresponding page
function ShowAccountCentral()
{
try
{
var acctCentralPage = pref.getComplexValue("mailnews.account_central_page.url",
Components.interfaces.nsIPrefLocalizedString).data;
switch (gPaneConfig)
{
case 0:
messagesBox.setAttribute("collapsed", "true");
gSearchBox.setAttribute("collapsed", "true");
accountCentralBox.removeAttribute("collapsed");
window.frames["accountCentralPane"].location = acctCentralPage;
gAccountCentralLoaded = true;
break;
case 1:
var messagePaneBox = document.getElementById("messagepanebox");
messagePaneBox.setAttribute("collapsed", "true");
var searchAndThreadPaneBox = document.getElementById("searchAndthreadpaneBox");
searchAndThreadPaneBox.setAttribute("collapsed", "true");
var threadPaneSplitter = document.getElementById("threadpane-splitter");
threadPaneSplitter.setAttribute("collapsed", "true");
accountCentralBox.removeAttribute("collapsed");
window.frames["accountCentralPane"].location = acctCentralPage;
gAccountCentralLoaded = true;
break;
}
}
catch (ex)
{
dump("Error loading AccountCentral page -> " + ex + "\n");
return;
}
}
// Display thread and message panes with splitter when user tries
// to read messages by clicking on msgfolders. Hide AccountCentral
// box and display message box.
function HideAccountCentral()
{
try
{
switch (gPaneConfig)
{
case 0:
window.frames["accountCentralPane"].location = "about:blank";
accountCentralBox.setAttribute("collapsed", "true");
gSearchBox.removeAttribute("collapsed");
messagesBox.removeAttribute("collapsed");
gAccountCentralLoaded = false;
break;
case 1:
window.frames["accountCentralPane"].location = "about:blank";
accountCentralBox.setAttribute("collapsed", "true");
// XXX todo
// the code below that always removes the collapsed attribute
// makes it so in this pane config, you can't keep the message pane hidden
// see bug #188393
var messagePaneBox = document.getElementById("messagepanebox");
messagePaneBox.removeAttribute("collapsed");
var searchAndThreadPaneBox = document.getElementById("searchAndthreadpaneBox");
searchAndThreadPaneBox.removeAttribute("collapsed");
var threadPaneSplitter = document.getElementById("threadpane-splitter");
threadPaneSplitter.removeAttribute("collapsed");
gAccountCentralLoaded = false;
break;
}
}
catch (ex)
{
dump("Error hiding AccountCentral page -> " + ex + "\n");
return;
}
}
// Given the server, open the twisty and the set the selection
// on inbox of that server.
// prompt if offline.
function OpenInboxForServer(server)
{
try {
HideAccountCentral();
var inboxFolder = GetInboxFolder(server);
SelectFolder(inboxFolder.URI);
if(CheckOnline())
GetMessagesForInboxOnServer(server);
else {
var option = PromptGetMessagesOffline();
if(option == 0) {
if (!gOfflineManager)
GetOfflineMgrService();
gOfflineManager.goOnline(false /* sendUnsentMessages */,
false /* playbackOfflineImapOperations */,
msgWindow);
GetMessagesForInboxOnServer(server);
}
}
}
catch (ex) {
dump("Error opening inbox for server -> " + ex + "\n");
return;
}
}
function GetSearchSession()
{
if (("gSearchSession" in top) && gSearchSession)
return gSearchSession;
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 elements = document.getElementsByAttribute("keywordrelated","true");
var len = elements.length;
for (var i=0; i<len; i++) {
var element = elements[i];
var originalclass = element.getAttribute("originalclass");
// we use XBL for certain headers.
// if the element has keywordrelated="true"
// but no original class, it's an XBL widget
// so to get the real element, use getAnonymousElementByAttribute()
if (!originalclass) {
element = document.getAnonymousElementByAttribute(element, "keywordrelated", "true");
originalclass = element.getAttribute("originalclass");
}
if (aKeywords) {
if (element.getAttribute("appendoriginalclass") == "true") {
aKeywords += " " + originalclass;
}
element.setAttribute("class", aKeywords);
}
else {
// if no keywords, reset class to the original class
element.setAttribute("class", originalclass);
}
}
// cache the keywords
gLastKeywords = aKeywords;
}
function ShowHideToolBarButtons()
{
return;
}
function AddToolBarPrefListener()
{
try {
var pbi = pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
pbi.addObserver(gMailToolBarPrefListener.domain, gMailToolBarPrefListener, false);
} catch(ex) {
dump("Failed to observe prefs: " + ex + "\n");
}
}
function RemoveToolBarPrefListener()
{
try {
var pbi = pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
pbi.removeObserver(gMailToolBarPrefListener.domain, gMailToolBarPrefListener);
} catch(ex) {
dump("Failed to remove pref observer: " + ex + "\n");
}
}
// Pref listener constants
const gMailToolBarPrefListener =
{
domain: "mail.toolbars.showbutton",
observe: function(subject, topic, prefName)
{
// verify that we're changing a button pref
if (topic != "nsPref:changed")
return;
document.getElementById("button-" + prefName.substr(this.domain.length+1)).hidden = !(pref.getBoolPref(prefName));
}
};

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,148 @@
<?xml version="1.0"?>
<!--
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.
-->
<?xml-stylesheet href="chrome://messenger/skin/messageWindow.css" type="text/css"?>
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/platformMailnewsOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/msgHdrViewOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/mailWindowOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/mailOverlay.xul"?>
<!DOCTYPE window [
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
%brandDTD;
<!ENTITY % messengerDTD SYSTEM "chrome://messenger/locale/messenger.dtd" >
%messengerDTD;
]>
<window id="messengerWindow"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:nc="http://home.netscape.com/NC-rdf#"
title="&messengerWindow.title;"
titlemodifier="&titleModifier.label;"
titlemenuseparator="&titleSeparator.label;"
onload="OnLoadMessageWindow()"
onunload="OnUnloadMessageWindow()"
width="750"
height="500"
persist="width height screenX screenY sizemode"
windowtype="mail:messageWindow">
<stringbundleset id="stringbundleset">
<stringbundle id="bundle_brand" src="chrome://global/locale/brand.properties"/>
<stringbundle id="bundle_messenger" src="chrome://messenger/locale/messenger.properties"/>
<stringbundle id="bundle_offlinePrompts" src="chrome://messenger/locale/offline.properties"/>
</stringbundleset>
<!-- XXX: Replace strres.js when nsContextMenu.js is converted -->
<script type="application/x-javascript" src="chrome://global/content/strres.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/shareglue.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/commandglue.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailWindow.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/messageWindow.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/accountUtils.js"/>
<script type="application/x-javascript" src="chrome://communicator/content/nsContextMenu.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailContextMenus.js"/>
<script type="application/x-javascript" src="chrome://communicator/content/contentAreaClick.js"/>
<script type="application/x-javascript" src="chrome://communicator/content/contentAreaUtils.js"/>
<script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>
<script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgViewNavigation.js"/>
<commandset id="mailCommands">
<commandset id="mailFileMenuItems"/>
<commandset id="mailViewMenuItems"/>
<commandset id="mailEditMenuItems"/>
<commandset id="mailSearchMenuItems"/>
<commandset id="mailGoMenuItems"/>
<commandset id="mailMessageMenuItems"/>
<commandset id="mailToolbarItems"/>
<commandset id="mailGetMsgMenuItems"/>
<commandset id="mailMarkMenuItems"/>
<commandset id="mailLabelMenuItems"/>
<commandset id="mailToolsMenuItems"/>
<commandset id="mailEditContextMenuItems"/>
<commandset id="tasksCommands"/>
<commandset id="commandKeys"/>
</commandset>
<broadcasterset id="mailBroadcasters">
<!-- File Menu -->
<broadcaster id="Communicator:WorkMode"/>
<!-- Edit Menu -->
</broadcasterset>
<keyset id="mailKeys">
<keyset id="tasksKeys"/>
</keyset>
<popupset>
<popup id="emailAddressPopup" popupanchor="bottomleft" onpopupshowing="goUpdateCommand('cmd_createFilterFromPopup')">
<menuitem label="&AddToAddressBook.label;"
accesskey="&AddToAddressBook.accesskey;"
oncommand="AddNodeToAddressBook(document.popupNode)"/>
<menuitem label="&SendMailTo.label;"
accesskey="&SendMailTo.accesskey;"
oncommand="SendMailToNode(document.popupNode)"/>
<menuitem label="&CopyEmailAddress.label;"
accesskey="&CopyEmailAddress.accesskey;"
oncommand="CopyEmailAddress(document.popupNode)"/>
<menuitem label="&CreateFilter.label;"
accesskey="&CreateFilter.accesskey;"
oncommand="CreateFilter(document.popupNode)"
observes="cmd_createFilterFromPopup"/>
</popup>
<popup id="allHeadersPopup" onpopupshowing="return fillAllHeadersPopup(document.popupNode);" popupanchor="bottomleft">
<hbox id="allHeadersPopupContainer"/>
</popup>
<popup id="messagePaneContext"/>
</popupset>
<popup id="attachmentListContext"/>
<toolbox id="mail-toolbox" class="toolbox-top">
</toolbox>
<!-- 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);"
ondragexit="nsDragAndDrop.dragExit(event, messagepaneObserver);">
<hbox id="junkBar"/>
<hbox id="msgHeaderView"/>
<!-- message view -->
<browser id="messagepane" context="messagePaneContext"
style="height: 0px; min-height: 1px" flex="1" name="messagepane"
disablesecurity="true" disableHistory="true" type="content-primary"
src="about:blank" onclick="contentAreaClick(event);" autofind="false"/>
</vbox>
</vbox>
<statusbar class="chromeclass-status" id="status-bar"/>
</window>

Просмотреть файл

@ -0,0 +1,188 @@
<?xml version="1.0"?>
<!--
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.
-->
<?xml-stylesheet href="chrome://messenger/skin/mailWindow1.css" type="text/css"?>
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/platformMailnewsOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/threadPane.xul"?>
<?xul-overlay href="chrome://messenger/content/folderPane.xul"?>
<?xul-overlay href="chrome://messenger/content/msgHdrViewOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/mailWindowOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/mailOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/contentAreaContextOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/communicatorOverlay.xul"?>
<!DOCTYPE window [
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
%brandDTD;
<!ENTITY % messengerDTD SYSTEM "chrome://messenger/locale/messenger.dtd" >
%messengerDTD;
]>
<window id="messengerWindow"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:nc="http://home.netscape.com/NC-rdf#"
title="&messengerWindow.title;"
titlemodifier="&titleModifier.label;"
titlemenuseparator="&titleSeparator.label;"
onload="OnLoadMessenger()"
onunload="OnUnloadMessenger()"
width="750"
height="500"
screenX="10" screenY="10"
persist="width height screenX screenY sizemode"
windowtype="mail:3pane">
<stringbundleset id="stringbundleset">
<stringbundle id="bundle_messenger" src="chrome://messenger/locale/messenger.properties"/>
<stringbundle id="bundle_brand" src="chrome://global/locale/brand.properties"/>
<stringbundle id="bundle_search" src="chrome://messenger/locale/search.properties"/>
</stringbundleset>
<script type="application/x-javascript" src="chrome://messenger/content/widgetglue.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/commandglue.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/shareglue.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgViewNavigation.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailWindow.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgMail3PaneWindow.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mail3PaneWindowCommands.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailContextMenus.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/messengerdnd.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/accountUtils.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgAccountCentral.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/searchBar.js"/>
<script type="application/x-javascript" src="chrome://communicator/content/contentAreaClick.js"/>
<script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>
<script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
<commandset id="mailCommands">
<commandset id="mailFileMenuItems"/>
<commandset id="mailViewMenuItems"/>
<commandset id="mailEditMenuItems"/>
<commandset id="mailEditContextMenuItems"/>
<commandset id="mailSearchMenuItems"/>
<commandset id="mailGoMenuItems"/>
<commandset id="mailMessageMenuItems"/>
<commandset id="mailToolbarItems"/>
<commandset id="mailGetMsgMenuItems"/>
<commandset id="mailMarkMenuItems"/>
<commandset id="mailLabelMenuItems"/>
<commandset id="mailToolsMenuItems"/>
<commandset id="globalEditMenuItems"/>
<commandset id="selectEditMenuItems"/>
<commandset id="clipboardEditMenuItems"/>
<commandset id="FocusRingUpdate_Mail"
commandupdater="true"
events="focus"
oncommandupdate="FocusRingUpdate_Mail()"/>
<commandset id="tasksCommands"/>
<command id="toggleSidebar"/>
</commandset>
<broadcasterset id="mailBroadcasters">
<!-- File Menu -->
<broadcaster id="Communicator:WorkMode"/>
<!-- Edit Menu -->
</broadcasterset>
<keyset id="mailKeys">
<key id="showHideSidebar"/>
<keyset id="tasksKeys"/>
</keyset>
<popup id="threadPaneContext"/>
<popup id="folderPaneContext"/>
<popup id="attachmentListContext"/>
<tooltip id="attachmentListTooltip"/>
<popup id="emailAddressPopup" popupanchor="bottomleft" onpopupshowing="goUpdateCommand('cmd_createFilterFromPopup')">
<menuitem label="&AddToAddressBook.label;"
accesskey="&AddToAddressBook.accesskey;"
oncommand="AddNodeToAddressBook(document.popupNode)"/>
<menuitem label="&SendMailTo.label;"
accesskey="&SendMailTo.accesskey;"
oncommand="SendMailToNode(document.popupNode)"/>
<menuitem label="&CopyEmailAddress.label;"
accesskey="&CopyEmailAddress.accesskey;"
oncommand="CopyEmailAddress(document.popupNode)"/>
<menuitem label="&CreateFilter.label;"
accesskey="&CreateFilter.accesskey;"
oncommand="CreateFilter(document.popupNode)"
observes="cmd_createFilterFromPopup"/>
</popup>
<popup id="allHeadersPopup" onpopupshowing="return fillAllHeadersPopup(document.popupNode);" popupanchor="bottomleft">
<hbox id="allHeadersPopupContainer">
</hbox>
</popup>
<popup id="messagePaneContext"/>
<toolbox id="mail-toolbox" class="toolbox-top">
</toolbox>
<hbox style="height:100px" flex="1">
<vbox id="folderPaneBox" flex="1" autostretch="always" persist="width">
<tree id="folderTree" flex="1" style="min-width: 100px;" context="folderPaneContext" persist="collapsed width height"/>
</vbox>
<splitter id="gray_vertical_splitter" collapse="before" persist="state">
<grippy/>
</splitter>
<vbox id="messengerBox" flex="1" persist="width">
<!-- collapse this box. since we are loading on a timeout, the user will see it "jump" if it isn't collapsed" -->
<vbox id="accountCentralBox" flex="1" collapsed="true">
<iframe name="accountCentralPane" flex="1" src="about:blank"/>
</vbox>
<vbox id="messagesBox" flex="1">
<hbox id="searchBox"/>
<tree id="threadTree" flex="2" persist="height" style="height:0px" context="threadPaneContext"/>
<!-- if you change this id, please change GetThreadAndMessagePaneSplitter() and MsgToggleMessagePane() -->
<splitter collapse="after" persist="state"
onmouseup="OnMouseUpThreadAndMessagePaneSplitter()"
id="threadpane-splitter">
<grippy onclick="OnClickThreadAndMessagePaneSplitterGrippy()"/>
</splitter>
<vbox id="messagepanebox" flex="3" persist="collapsed height" onclick="contentAreaClick(event);">
<hbox id="junkBar"/>
<hbox id="msgHeaderView"/>
<browser id="messagepane" context="messagePaneContext"
style="height: 0px; min-height: 1px" flex="1" name="messagepane"
disablehistory="true" type="content-primary" src="about:blank"
disablesecurity="true" autofind="false"/>
</vbox>
</vbox>
</vbox>
</hbox>
<statusbar id="status-bar" class="chromeclass-status mailwindow-statusbar">
<statusbarpanel id="unreadMessageCount" style="min-width: 5px"/>
<statusbarpanel id="totalMessageCount" style="min-width: 5px"/>
</statusbar>
</window>

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,929 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* William A. ("PowerGUI") Law <law@netscape.com>
* Blake Ross <blakeross@telocity.com>
* Gervase Markham <gerv@gerv.net>
*/
/*------------------------------ nsContextMenu ---------------------------------
| This JavaScript "class" is used to implement the browser's content-area |
| context menu. |
| |
| For usage, see references to this class in navigator.xul. |
| |
| Currently, this code is relatively useless for any other purpose. In the |
| longer term, this code will be restructured to make it more reusable. |
------------------------------------------------------------------------------*/
function nsContextMenu( xulMenu ) {
this.target = null;
this.menu = null;
this.popupURL = null;
this.onTextInput = false;
this.onImage = false;
this.onLink = false;
this.onMailtoLink = false;
this.onSaveableLink = false;
this.onMetaDataItem = false;
this.onMathML = false;
this.link = false;
this.inFrame = false;
this.hasBGImage = false;
this.isTextSelected = false;
this.inDirList = false;
this.shouldDisplay = true;
// Initialize new menu.
this.initMenu( xulMenu );
}
// Prototype for nsContextMenu "class."
nsContextMenu.prototype = {
// onDestroy is a no-op at this point.
onDestroy : function () {
},
// Initialize context menu.
initMenu : function ( popup ) {
// Save menu.
this.menu = popup;
// Get contextual info.
this.setTarget( document.popupNode );
this.isTextSelected = this.isTextSelection();
this.initPopupURL();
// Initialize (disable/remove) menu items.
this.initItems();
},
initItems : function () {
this.initOpenItems();
this.initNavigationItems();
this.initViewItems();
this.initMiscItems();
this.initSaveItems();
this.initClipboardItems();
this.initMetadataItems();
},
initOpenItems : function () {
// this.showItem( "context-openlink", this.onSaveableLink || ( this.inDirList && this.onLink ) );
this.showItem( "context-openlinkintab", this.onSaveableLink || ( this.inDirList && this.onLink ) );
this.showItem( "context-sep-open", this.onSaveableLink || ( this.inDirList && this.onLink ) );
},
initNavigationItems : function () {
// Back determined by canGoBack broadcaster.
this.setItemAttrFromNode( "context-back", "disabled", "canGoBack" );
// Forward determined by canGoForward broadcaster.
this.setItemAttrFromNode( "context-forward", "disabled", "canGoForward" );
this.showItem( "context-back", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
this.showItem( "context-forward", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
this.showItem( "context-reload", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
this.showItem( "context-stop", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
this.showItem( "context-sep-stop", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
// XXX: Stop is determined in navigator.js; the canStop broadcaster is broken
//this.setItemAttrFromNode( "context-stop", "disabled", "canStop" );
},
initSaveItems : function () {
this.showItem( "context-savepage", !( this.inDirList || this.isTextSelected || this.onTextInput ) && !( this.onLink && this.onImage ) );
// Save link depends on whether we're in a link.
this.showItem( "context-savelink", this.onSaveableLink );
// Save image depends on whether there is one.
this.showItem( "context-saveimage", this.onImage );
this.showItem( "context-sendimage", this.onImage );
},
initViewItems : function () {
// View source is always OK, unless in directory listing.
this.showItem( "context-viewpartialsource-selection", this.isTextSelected && !this.onTextInput );
this.showItem( "context-viewpartialsource-mathml", this.onMathML && !this.isTextSelected );
this.showItem( "context-viewsource", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
this.showItem( "context-viewinfo", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
this.showItem( "context-sep-properties", !( this.inDirList || this.isTextSelected || this.onTextInput ) );
// Set As Wallpaper depends on whether an image was clicked on, and only works on Windows.
var isWin = navigator.appVersion.indexOf("Windows") != -1;
this.showItem( "context-setWallpaper", isWin && this.onImage );
this.showItem( "context-sep-image", this.onImage );
if( isWin && this.onImage )
// Disable the Set As Wallpaper menu item if we're still trying to load the image
this.setItemAttr( "context-setWallpaper", "disabled", (("complete" in this.target) && !this.target.complete) ? "true" : null );
this.showItem( "context-fitimage", this.onStandaloneImage && _content.document.imageResizingEnabled );
if ( this.onStandaloneImage && _content.document.imageResizingEnabled ) {
this.setItemAttr( "context-fitimage", "disabled", _content.document.imageIsOverflowing ? null : "true");
this.setItemAttr( "context-fitimage", "checked", _content.document.imageIsResized ? "true" : null);
}
// View Image depends on whether an image was clicked on.
this.showItem( "context-viewimage", this.onImage && !this.onStandaloneImage);
// View background image depends on whether there is one.
this.showItem( "context-viewbgimage", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
this.showItem( "context-sep-viewbgimage", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
this.setItemAttr( "context-viewbgimage", "disabled", this.hasBGImage ? null : "true");
},
initMiscItems : function () {
// Use "Bookmark This Link" if on a link.
this.showItem( "context-bookmarkpage", !( this.isTextSelected || this.onTextInput ) );
this.showItem( "context-bookmarklink", this.onLink && !this.onMailtoLink );
this.showItem( "context-searchselect", this.isTextSelected && !this.onTextInput );
this.showItem( "frame", this.inFrame );
this.showItem( "frame-sep", this.inFrame );
var blocking = true;
if (this.popupURL)
try {
const PM = Components.classes["@mozilla.org/PopupWindowManager;1"]
.getService(Components.interfaces.nsIPopupWindowManager);
blocking = PM.testPermission(this.popupURL) ==
Components.interfaces.nsIPopupWindowManager.DENY_POPUP;
} catch (e) {
}
this.showItem( "popupwindow-reject", this.popupURL && !blocking);
this.showItem( "popupwindow-allow", this.popupURL && blocking);
this.showItem( "context-sep-popup", this.popupURL);
},
initClipboardItems : function () {
// Copy depends on whether there is selected text.
// Enabling this context menu item is now done through the global
// command updating system
// this.setItemAttr( "context-copy", "disabled", !this.isTextSelected() );
goUpdateGlobalEditMenuItems();
this.showItem( "context-undo", this.onTextInput );
this.showItem( "context-redo", this.onTextInput );
this.showItem( "context-sep-undo", this.onTextInput );
this.showItem( "context-cut", this.onTextInput );
this.showItem( "context-copy", this.isTextSelected || this.onTextInput);
this.showItem( "context-paste", this.onTextInput );
this.showItem( "context-delete", this.onTextInput );
this.showItem( "context-sep-paste", this.onTextInput );
this.showItem( "context-selectall", true );
this.showItem( "context-sep-selectall", this.isTextSelected && !this.onTextInput );
// In a text area there will be nothing after select all, so we don't want a sep
// Otherwise, if there's text selected then there are extra menu items
// (search for selection and view selection source), so we do want a sep
// XXX dr
// ------
// nsDocumentViewer.cpp has code to determine whether we're
// on a link or an image. we really ought to be using that...
// Copy email link depends on whether we're on an email link.
this.showItem( "context-copyemail", this.onMailtoLink );
// Copy link location depends on whether we're on a link.
this.showItem( "context-copylink", this.onLink );
this.showItem( "context-sep-copylink", this.onLink );
// Copy image location depends on whether we're on an image.
this.showItem( "context-copyimage", this.onImage );
this.showItem( "context-sep-copyimage", this.onImage );
},
initMetadataItems : function () {
// Show if user clicked on something which has metadata.
this.showItem( "context-metadata", this.onMetaDataItem );
},
// Set various context menu attributes based on the state of the world.
setTarget : function ( node ) {
const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
if ( node.namespaceURI == xulNS ) {
this.shouldDisplay = false;
return;
}
// Initialize contextual info.
this.onImage = false;
this.onStandaloneImage = false;
this.onMetaDataItem = false;
this.onTextInput = false;
this.imageURL = "";
this.onLink = false;
this.onMathML = false;
this.inFrame = false;
this.hasBGImage = false;
this.bgImageURL = "";
// Remember the node that was clicked.
this.target = node;
// See if the user clicked on an image.
if ( this.target.nodeType == Node.ELEMENT_NODE ) {
if ( this.target.localName.toUpperCase() == "IMG" ) {
this.onImage = true;
this.imageURL = this.target.src;
var documentType = window._content.document.contentType;
if ( documentType.substr(0,6) == "image/" )
this.onStandaloneImage = true;
// Look for image map.
var mapName = this.target.getAttribute( "usemap" );
if ( mapName ) {
// Find map.
var map = this.target.ownerDocument.getElementById( mapName.substr(1) );
if ( map ) {
// Search child <area>s for a match.
var areas = map.childNodes;
//XXX Client side image maps are too hard for now!
areas.length = 0;
for ( var i = 0; i < areas.length && !this.onLink; i++ ) {
var area = areas[i];
if ( area.nodeType == Node.ELEMENT_NODE
&&
area.localName.toUpperCase() == "AREA" ) {
// Get type (rect/circle/polygon/default).
var type = area.getAttribute( "type" );
var coords = this.parseCoords( area );
switch ( type.toUpperCase() ) {
case "RECT":
case "RECTANGLE":
break;
case "CIRC":
case "CIRCLE":
break;
case "POLY":
case "POLYGON":
break;
case "DEFAULT":
// Default matches entire image.
this.onLink = true;
this.link = area;
this.onSaveableLink = this.isLinkSaveable( this.link );
break;
}
}
}
}
}
} else if ( this.target.localName.toUpperCase() == "OBJECT"
&&
// See if object tag is for an image.
this.objectIsImage( this.target ) ) {
// This is an image.
this.onImage = true;
// URL must be constructed.
this.imageURL = this.objectImageURL( this.target );
} else if ( this.target.localName.toUpperCase() == "INPUT") {
type = this.target.getAttribute("type");
if(type && type.toUpperCase() == "IMAGE") {
this.onImage = true;
// Convert src attribute to absolute URL.
this.imageURL = this.makeURLAbsolute( this.target.baseURI,
this.target.src );
} else /* if (this.target.getAttribute( "type" ).toUpperCase() == "TEXT") */ {
this.onTextInput = this.isTargetATextBox(this.target);
}
} else if ( this.target.localName.toUpperCase() == "TEXTAREA" ) {
this.onTextInput = true;
} else if ( this.target.localName.toUpperCase() == "HTML" ) {
// pages with multiple <body>s are lame. we'll teach them a lesson.
var bodyElt = this.target.ownerDocument.getElementsByTagName("body")[0];
if ( bodyElt ) {
var computedURL = this.getComputedURL( bodyElt, "background-image" );
if ( computedURL ) {
this.hasBGImage = true;
this.bgImageURL = this.makeURLAbsolute( bodyElt.baseURI,
computedURL );
}
}
} else if ( "HTTPIndex" in _content &&
_content.HTTPIndex instanceof Components.interfaces.nsIHTTPIndex ) {
this.inDirList = true;
// Bubble outward till we get to an element with URL attribute
// (which should be the href).
var root = this.target;
while ( root && !this.link ) {
if ( root.tagName == "tree" ) {
// Hit root of tree; must have clicked in empty space;
// thus, no link.
break;
}
if ( root.getAttribute( "URL" ) ) {
// Build pseudo link object so link-related functions work.
this.onLink = true;
this.link = { href : root.getAttribute("URL"),
getAttribute: function (attr) {
if (attr == "title") {
return root.firstChild.firstChild.getAttribute("label");
} else {
return "";
}
}
};
// If element is a directory, then you can't save it.
if ( root.getAttribute( "container" ) == "true" ) {
this.onSaveableLink = false;
} else {
this.onSaveableLink = true;
}
} else {
root = root.parentNode;
}
}
}
}
// We have meta data on images.
this.onMetaDataItem = this.onImage;
// See if the user clicked on MathML
const NS_MathML = "http://www.w3.org/1998/Math/MathML";
if ((this.target.nodeType == Node.TEXT_NODE &&
this.target.parentNode.namespaceURI == NS_MathML)
|| (this.target.namespaceURI == NS_MathML))
this.onMathML = true;
// See if the user clicked in a frame.
if ( this.target.ownerDocument != window._content.document ) {
this.inFrame = true;
}
// Bubble out, looking for items of interest
var elem = this.target;
while ( elem ) {
if ( elem.nodeType == Node.ELEMENT_NODE ) {
var localname = elem.localName.toUpperCase();
// Link?
if ( !this.onLink &&
( (localname === "A" && elem.href) ||
localname === "AREA" ||
localname === "LINK" ||
elem.getAttributeNS( "http://www.w3.org/1999/xlink", "type") == "simple" ) ) {
// Clicked on a link.
this.onLink = true;
this.onMetaDataItem = true;
// Remember corresponding element.
this.link = elem;
this.onMailtoLink = this.isLinkType( "mailto:", this.link );
// Remember if it is saveable.
this.onSaveableLink = this.isLinkSaveable( this.link );
}
// Text input?
if ( !this.onTextInput ) {
// Clicked on a link.
this.onTextInput = this.isTargetATextBox(elem);
}
// Metadata item?
if ( !this.onMetaDataItem ) {
// We currently display metadata on anything which fits
// the below test.
if ( ( localname === "BLOCKQUOTE" && 'cite' in elem && elem.cite) ||
( localname === "Q" && 'cite' in elem && elem.cite) ||
( localname === "TABLE" && 'summary' in elem && elem.summary) ||
( ( localname === "INS" || localname === "DEL" ) &&
( ( 'cite' in elem && elem.cite ) ||
( 'dateTime' in elem && elem.dateTime ) ) ) ||
( 'title' in elem && elem.title ) ||
( 'lang' in elem && elem.lang ) ) {
dump("On metadata item.\n");
this.onMetaDataItem = true;
}
}
// Background image? Don't bother if we've already found a
// background image further down the hierarchy. Otherwise,
// we look for the computed background-image style.
if ( !this.hasBGImage ) {
var bgImgUrl = this.getComputedURL( elem, "background-image" );
if ( bgImgUrl ) {
this.hasBGImage = true;
this.bgImageURL = this.makeURLAbsolute( elem.baseURI,
bgImgUrl );
}
}
}
elem = elem.parentNode;
}
},
initPopupURL: function() {
// quick check: if no opener, it can't be a popup
if (!window.content.opener)
return;
try {
var show = false;
// is it a popup window?
const CI = Components.interfaces;
var xulwin = window
.QueryInterface(CI.nsIInterfaceRequestor)
.getInterface(CI.nsIWebNavigation)
.QueryInterface(CI.nsIDocShellTreeItem)
.treeOwner
.QueryInterface(CI.nsIInterfaceRequestor)
.getInterface(CI.nsIXULWindow);
if (xulwin.contextFlags &
CI.nsIWindowCreator2.PARENT_IS_LOADING_OR_RUNNING_TIMEOUT) {
// do the pref settings allow site-by-site popup management?
const PB = Components.classes["@mozilla.org/preferences-service;1"]
.getService(CI.nsIPrefBranch);
show = !PB.getBoolPref("dom.disable_open_during_load");
}
if (show) {
// initialize popupURL
const IOS = Components.classes["@mozilla.org/network/io-service;1"]
.getService(CI.nsIIOService);
var spec = Components.lookupMethod(window.content.opener, "location")
.call();
this.popupURL = IOS.newURI(spec, null, null);
// but cancel if it's an unsuitable URL
const PM = Components.classes["@mozilla.org/PopupWindowManager;1"]
.getService(CI.nsIPopupWindowManager);
}
} catch(e) {
}
},
// Returns the computed style attribute for the given element.
getComputedStyle: function( elem, prop ) {
return elem.ownerDocument.defaultView.getComputedStyle( elem, '' ).getPropertyValue( prop );
},
// Returns a "url"-type computed style attribute value, with the url() stripped.
getComputedURL: function( elem, prop ) {
var url = elem.ownerDocument.defaultView.getComputedStyle( elem, '' ).getPropertyCSSValue( prop );
return ( url.primitiveType == CSSPrimitiveValue.CSS_URI ) ? url.getStringValue() : null;
},
// Returns true iff clicked on link is saveable.
isLinkSaveable : function ( link ) {
// We don't do the Right Thing for news/snews yet, so turn them off
// until we do.
return !(this.isLinkType( "mailto:" , link ) ||
this.isLinkType( "javascript:" , link ) ||
this.isLinkType( "news:", link ) ||
this.isLinkType( "snews:", link ) );
},
// Returns true iff clicked on link is of type given.
isLinkType : function ( linktype, link ) {
try {
// Test for missing protocol property.
if ( !link.protocol ) {
// We must resort to testing the URL string :-(.
var protocol;
if ( link.href ) {
protocol = link.href.substr( 0, linktype.length );
} else {
protocol = link.getAttributeNS("http://www.w3.org/1999/xlink","href");
if ( protocol ) {
protocol = protocol.substr( 0, linktype.length );
}
}
return protocol.toLowerCase() === linktype;
} else {
// Presume all but javascript: urls are saveable.
return link.protocol.toLowerCase() === linktype;
}
} catch (e) {
// something was wrong with the link,
// so we won't be able to save it anyway
return false;
}
},
// Block popup windows
rejectPopupWindows: function(andClose) {
const PM = Components.classes["@mozilla.org/PopupWindowManager;1"]
.getService(Components.interfaces.nsIPopupWindowManager);
PM.add(this.popupURL, false);
if (andClose) {
const OS = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
OS.notifyObservers(window, "popup-perm-close", this.popupURL.spec);
}
},
// Unblock popup windows
allowPopupWindows: function() {
const PM = Components.classes["@mozilla.org/PopupWindowManager;1"]
.getService(Components.interfaces.nsIPopupWindowManager);
PM.add(this.popupURL, true);
},
// Reload clicked-in frame.
reloadFrame : function () {
this.target.ownerDocument.location.reload();
},
// Open clicked-in frame in its own window.
openFrame : function () {
openNewWindowWith( this.target.ownerDocument.location.href );
},
// Open clicked-in frame in the same window
showOnlyThisFrame : function () {
window.loadURI(this.target.ownerDocument.location.href);
},
// View Partial Source
viewPartialSource : function ( context ) {
var focusedWindow = document.commandDispatcher.focusedWindow;
if (focusedWindow == window)
focusedWindow = _content;
var docCharset = null;
if (focusedWindow)
docCharset = "charset=" + focusedWindow.document.characterSet;
// "View Selection Source" and others such as "View MathML Source"
// are mutually exclusive, with the precedence given to the selection
// when there is one
var reference = null;
if (context == "selection")
reference = focusedWindow.__proto__.getSelection.call(focusedWindow);
else if (context == "mathml")
reference = this.target;
else
throw "not reached";
var docUrl = null; // unused (and play nice for fragments generated via XSLT too)
window.openDialog("chrome://navigator/content/viewPartialSource.xul",
"_blank", "scrollbars,resizable,chrome,dialog=no",
docUrl, docCharset, reference, context);
},
// Open new "view source" window with the frame's URL.
viewFrameSource : function () {
BrowserViewSourceOfDocument(this.target.ownerDocument);
},
viewInfo : function () {
BrowserPageInfo();
},
viewFrameInfo : function () {
BrowserPageInfo(this.target.ownerDocument);
},
toggleImageSize : function () {
_content.document.toggleImageSize();
},
// Change current window to the URL of the image.
viewImage : function () {
openTopWin( this.imageURL );
},
// Change current window to the URL of the background image.
viewBGImage : function () {
openTopWin( this.bgImageURL );
},
setWallpaper: function() {
var winhooks = Components.classes[ "@mozilla.org/winhooks;1" ].
getService(Components.interfaces.nsIWindowsHooks);
winhooks.setImageAsWallpaper(this.target, false);
},
// Save URL of clicked-on frame.
saveFrame : function () {
saveDocument( this.target.ownerDocument );
},
// Save URL of clicked-on link.
saveLink : function () {
saveURL( this.linkURL(), this.linkText(), null, true );
},
// Save URL of clicked-on image.
saveImage : function () {
saveURL( this.imageURL, null, "SaveImageTitle", false );
},
// Generate email address and put it on clipboard.
copyEmail : function () {
// Copy the comma-separated list of email addresses only.
// There are other ways of embedding email addresses in a mailto:
// link, but such complex parsing is beyond us.
var url = this.linkURL();
var qmark = url.indexOf( "?" );
var addresses;
if ( qmark > 7 ) { // 7 == length of "mailto:"
addresses = url.substring( 7, qmark );
} else {
addresses = url.substr( 7 );
}
var clipboard = this.getService( "@mozilla.org/widget/clipboardhelper;1",
Components.interfaces.nsIClipboardHelper );
clipboard.copyString(addresses);
},
addBookmark : function() {
var docshell = document.getElementById( "content" ).webNavigation;
BookmarksUtils.addBookmark( docshell.currentURI.spec,
docshell.document.title,
docshell.document.charset,
false );
},
addBookmarkForFrame : function() {
var doc = this.target.ownerDocument;
var uri = doc.location.href;
var title = doc.title;
if ( !title )
title = uri;
BookmarksUtils.addBookmark( uri,
title,
doc.charset,
false );
},
// Open Metadata window for node
showMetadata : function () {
window.openDialog( "chrome://navigator/content/metadata.xul",
"_blank",
"scrollbars,resizable,chrome,dialog=no",
this.target);
},
///////////////
// Utilities //
///////////////
// Create instance of component given contractId and iid (as string).
createInstance : function ( contractId, iidName ) {
var iid = Components.interfaces[ iidName ];
return Components.classes[ contractId ].createInstance( iid );
},
// Get service given contractId and iid (as string).
getService : function ( contractId, iidName ) {
var iid = Components.interfaces[ iidName ];
return Components.classes[ contractId ].getService( iid );
},
// Show/hide one item (specified via name or the item element itself).
showItem : function ( itemOrId, show ) {
var item = itemOrId.constructor == String ? document.getElementById(itemOrId) : itemOrId;
if (item)
item.hidden = !show;
},
// Set given attribute of specified context-menu item. If the
// value is null, then it removes the attribute (which works
// nicely for the disabled attribute).
setItemAttr : function ( id, attr, val ) {
var elem = document.getElementById( id );
if ( elem ) {
if ( val == null ) {
// null indicates attr should be removed.
elem.removeAttribute( attr );
} else {
// Set attr=val.
elem.setAttribute( attr, val );
}
}
},
// Set context menu attribute according to like attribute of another node
// (such as a broadcaster).
setItemAttrFromNode : function ( item_id, attr, other_id ) {
var elem = document.getElementById( other_id );
if ( elem && elem.getAttribute( attr ) == "true" ) {
this.setItemAttr( item_id, attr, "true" );
} else {
this.setItemAttr( item_id, attr, null );
}
},
// Temporary workaround for DOM api not yet implemented by XUL nodes.
cloneNode : function ( item ) {
// Create another element like the one we're cloning.
var node = document.createElement( item.tagName );
// Copy attributes from argument item to the new one.
var attrs = item.attributes;
for ( var i = 0; i < attrs.length; i++ ) {
var attr = attrs.item( i );
node.setAttribute( attr.nodeName, attr.nodeValue );
}
// Voila!
return node;
},
// Generate fully-qualified URL for clicked-on link.
linkURL : function () {
if (this.link.href) {
return this.link.href;
}
var href = this.link.getAttributeNS("http://www.w3.org/1999/xlink","href");
if (!href || !href.match(/\S/)) {
throw "Empty href"; // Without this we try to save as the current doc, for example, HTML case also throws if empty
}
href = this.makeURLAbsolute(this.link.baseURI,href);
return href;
},
// Get text of link.
linkText : function () {
var text = gatherTextUnder( this.link );
if (!text || !text.match(/\S/)) {
text = this.link.getAttribute("title");
if (!text || !text.match(/\S/)) {
text = this.link.getAttribute("alt");
if (!text || !text.match(/\S/)) {
if (this.link.href) {
text = this.link.href;
} else {
text = getAttributeNS("http://www.w3.org/1999/xlink", "href");
if (text && text.match(/\S/)) {
text = this.makeURLAbsolute(this.link.baseURI, text);
}
}
}
}
}
return text;
},
//Get selected object and convert it to a string to get
//selected text. Only use the first 15 chars.
isTextSelection : function() {
var result = false;
var selection = this.searchSelected();
var bundle = srGetStrBundle("chrome://communicator/locale/contentAreaCommands.properties");
var searchSelectText;
if (selection != "") {
searchSelectText = selection.toString();
if (searchSelectText.length > 15)
searchSelectText = searchSelectText.substr(0,15) + "...";
result = true;
// format "Search for <selection>" string to show in menu
searchSelectText = bundle.formatStringFromName("searchText",
[searchSelectText], 1);
this.setItemAttr("context-searchselect", "label", searchSelectText);
}
return result;
},
searchSelected : function() {
var focusedWindow = document.commandDispatcher.focusedWindow;
var searchStr = focusedWindow.__proto__.getSelection.call(focusedWindow);
searchStr = searchStr.toString();
searchStr = searchStr.replace( /^\s+/, "" );
searchStr = searchStr.replace(/(\n|\r|\t)+/g, " ");
searchStr = searchStr.replace(/\s+$/,"");
return searchStr;
},
// Determine if target <object> is an image.
objectIsImage : function ( objElem ) {
var result = false;
// Get type and data attributes.
var type = objElem.getAttribute( "type" );
var data = objElem.getAttribute( "data" );
// Presume any mime type of the form "image/..." is an image.
// There must be a data= attribute with an URL, also.
if ( type.substring( 0, 6 ) == "image/" && data && data != "" ) {
result = true;
}
return result;
},
// Extract image URL from <object> tag.
objectImageURL : function ( objElem ) {
// Extract url from data= attribute.
var data = objElem.getAttribute( "data" );
// Make it absolute.
return this.makeURLAbsolute( objElem.baseURI, data );
},
// Convert relative URL to absolute, using document's <base>.
makeURLAbsolute : function ( base, url ) {
// Construct nsIURL.
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var baseURI = ioService.newURI(base, null, null);
return ioService.newURI(baseURI.resolve(url), null, null).spec;
},
// Parse coords= attribute and return array.
parseCoords : function ( area ) {
return [];
},
toString : function () {
return "contextMenu.target = " + this.target + "\n" +
"contextMenu.onImage = " + this.onImage + "\n" +
"contextMenu.onLink = " + this.onLink + "\n" +
"contextMenu.link = " + this.link + "\n" +
"contextMenu.inFrame = " + this.inFrame + "\n" +
"contextMenu.hasBGImage = " + this.hasBGImage + "\n";
},
isTargetATextBox : function ( node )
{
if (node.nodeType != Node.ELEMENT_NODE)
return false;
if (node.localName.toUpperCase() == "INPUT") {
var attrib = "";
var type = node.getAttribute("type");
if (type)
attrib = type.toUpperCase();
return( (attrib != "IMAGE") &&
(attrib != "CHECKBOX") &&
(attrib != "RADIO") &&
(attrib != "SUBMIT") &&
(attrib != "RESET") &&
(attrib != "HIDDEN") &&
(attrib != "RESET") &&
(attrib != "BUTTON") );
} else {
return(node.localName.toUpperCase() == "TEXTAREA");
}
},
// Determines whether or not the separator with the specified ID should be
// shown or not by determining if there are any non-hidden items between it
// and the previous separator.
shouldShowSeparator : function ( aSeparatorID )
{
var separator = document.getElementById(aSeparatorID);
if (separator) {
var sibling = separator.previousSibling;
while (sibling && sibling.localName != "menuseparator") {
if (sibling.getAttribute("hidden") != "true")
return true;
sibling = sibling.previousSibling;
}
}
return false;
}
};
/*************************************************************************
*
* nsDefaultEngine : nsIObserver
*
*************************************************************************/
function nsDefaultEngine()
{
try
{
var pb = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefBranch);
var pbi = pb.QueryInterface(
Components.interfaces.nsIPrefBranchInternal);
pbi.addObserver(this.domain, this, false);
// reuse code by explicitly invoking initial |observe| call
// to initialize the |icon| and |name| member variables
this.observe(pb, "", this.domain);
}
catch (ex)
{
}
}
nsDefaultEngine.prototype =
{
name: "",
icon: "",
domain: "browser.search.defaultengine",
// nsIObserver implementation
observe: function(aPrefBranch, aTopic, aPrefName)
{
try
{
var rdf = Components.
classes["@mozilla.org/rdf/rdf-service;1"].
getService(Components.interfaces.nsIRDFService);
var ds = rdf.GetDataSource("rdf:internetsearch");
var defaultEngine = aPrefBranch.getCharPref(aPrefName);
var res = rdf.GetResource(defaultEngine);
// get engine ``pretty'' name
const kNC_Name = rdf.GetResource(
"http://home.netscape.com/NC-rdf#Name");
var engineName = ds.GetTarget(res, kNC_Name, true);
if (engineName)
{
this.name = engineName.QueryInterface(
Components.interfaces.nsIRDFLiteral).Value;
}
// get URL to engine vendor icon
const kNC_Icon = rdf.GetResource(
"http://home.netscape.com/NC-rdf#Icon");
var iconURL = ds.GetTarget(res, kNC_Icon, true);
if (iconURL)
{
this.icon = iconURL.QueryInterface(
Components.interfaces.nsIRDFLiteral).Value;
}
}
catch (ex)
{
}
}
}

Просмотреть файл

@ -0,0 +1,50 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://communicator/skin/tasksOverlay.css" type="text/css"?>
<!DOCTYPE overlay [
<!ENTITY % tasksDTD SYSTEM "chrome://communicator/locale/tasksOverlay.dtd" >
%tasksDTD;
]>
<overlay id="tasksOverlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="chrome://communicator/content/tasksOverlay.js"/>
<keyset id="tasksKeys">
</keyset>
<commandset id="tasksCommands">
</commandset>
<!-- Tasks Menu -->
<menu id="tasksMenu" label="&tasksMenu.label;" accesskey="&tasksMenu.accesskey;">
<menupopup id="taskPopup">
<menuitem label="&javaScriptConsoleCmd.label;" accesskey="&javaScriptConsoleCmd.accesskey;" oncommand="toJavaScriptConsole();"/>
</menupopup>
</menu>
<menu id="windowMenu" label="&windowMenu.label;" accesskey="&windowMenu.accesskey;"
datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot"
onpopupshown="checkFocusedWindow();">
<template>
<rule>
<menupopup>
<menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#KeyIndex rdf:http://home.netscape.com/NC-rdf#Name" type="radio"
oncommand="ShowWindowFromResource(event.target)" accesskey="rdf:http://home.netscape.com/NC-rdf#KeyIndex"/>
</menupopup>
</rule>
</template>
<menupopup id="windowPopup">
</menupopup>
</menu>
<statusbarpanel id="component-bar" persist="collapsed">
<toolbarbutton class="taskbutton" id="mini-nav" oncommand="toNavigator();"
tooltiptext="&taskNavigator.tooltip;"/>
</statusbarpanel>
</overlay>

Просмотреть файл

Просмотреть файл

@ -0,0 +1,225 @@
<?xml version="1.0"?>
<?xul-overlay href="chrome://communicator/content/platformCommunicatorOverlay.xul"?>
<!DOCTYPE overlay [
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd">
%brandDTD;
<!ENTITY % globalRegionDTD SYSTEM "chrome://global-region/locale/region.dtd">
%globalRegionDTD;
<!ENTITY % utilityDTD SYSTEM "chrome://communicator/locale/utilityOverlay.dtd">
%utilityDTD;
]>
<overlay id="utilityOverlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript"
src="chrome://global/content/strres.js"/>
<script type="application/x-javascript"
src="chrome://communicator/content/utilityOverlay.js"/>
<script type="application/x-javascript"
src="chrome://communicator/content/builtinURLs.js"/>
<!-- online/offline status indicators -->
<broadcaster id="Communicator:WorkMode"
label="&offlineGoOfflineCmd.label;"
type="checkbox"
oncommand="toggleOfflineStatus();"/>
<statusbarpanel id="offline-status"
observes="Communicator:WorkMode"/>
<menuitem id="offlineGoOfflineCmd"
label="&offlineGoOfflineCmd.label;"
accesskey="&offlineGoOfflineCmd.accesskey;"
observes="Communicator:WorkMode"/>
<!-- File Menu -->
<menu id="menu_File"
label="&fileMenu.label;"
accesskey="&fileMenu.accesskey;"/>
<menu id="menu_New"
label="&newMenu.label;"
accesskey="&newMenu.accesskey;"/>
<!-- Edit Menu -->
<menu id="menu_Edit"
label="&editMenu.label;"
accesskey="&editMenu.accesskey;"/>
<menuitem id="menu_undo"
label="&undoCmd.label;"
key="key_undo"
accesskey="&undoCmd.accesskey;"
command="cmd_undo"/>
<menuitem id="menu_redo"
label="&redoCmd.label;"
key="key_redo"
accesskey="&redoCmd.accesskey;"
command="cmd_redo"/>
<menuitem id="menu_cut"
label="&cutCmd.label;"
key="key_cut"
accesskey="&cutCmd.accesskey;"
command="cmd_cut"/>
<menuitem id="menu_copy"
label="&copyCmd.label;"
key="key_copy"
accesskey="&copyCmd.accesskey;"
command="cmd_copy"/>
<menuitem id="menu_paste"
label="&pasteCmd.label;"
key="key_paste"
accesskey="&pasteCmd.accesskey;"
command="cmd_paste"/>
<menuitem id="menu_delete"
label="&deleteCmd.label;"
key="key_delete"
accesskey="&deleteCmd.accesskey;"
command="cmd_delete"/>
<menuitem id="menu_selectAll"
label="&selectAllCmd.label;"
key="key_selectAll"
accesskey="&selectAllCmd.accesskey;"
command="cmd_selectAll"/>
<menuitem id="menu_findTypeText"
label="&findTypeTextCmd.label;"
key="key_findTypeText"
accesskey="&findTypeTextCmd.accesskey;"
command="cmd_findTypeText"/>
<menuitem id="menu_findTypeLinks"
label="&findTypeLinksCmd.label;"
key="key_findTypeLinks"
accesskey="&findTypeLinksCmd.accesskey;"
command="cmd_findTypeLinks"/>
<!-- These key nodes are here only for show. The real bindings come from
XBL, in platformHTMLBindings.xml. See bugs 57078 and 71779. -->
<key id="key_undo"
key="&undoCmd.key;"
modifiers="accel"/>
<key id="key_redo"
key="&redoCmd.key;"
modifiers="accel"/>
<key id="key_cut"
key="&cutCmd.key;"
modifiers="accel"/>
<key id="key_copy"
key="&copyCmd.key;"
modifiers="accel"/>
<key id="key_paste"
key="&pasteCmd.key;"
modifiers="accel"/>
<commandset id="globalEditMenuItems"
commandupdater="true"
events="focus"
oncommandupdate="goUpdateGlobalEditMenuItems()"/>
<commandset id="selectEditMenuItems"
commandupdater="true"
events="select"
oncommandupdate="goUpdateSelectEditMenuItems()"/>
<commandset id="undoEditMenuItems"
commandupdater="true"
events="undo"
oncommandupdate="goUpdateUndoEditMenuItems()"/>
<commandset id="clipboardEditMenuItems"
commandupdater="true"
events="clipboard"
oncommandupdate="goUpdatePasteMenuItems()"/>
<commandset id="findTypeMenuItems"
commandupdater="true"
events="focus"
oncommandupdate="goUpdateFindTypeMenuItems()"/>
<command id="cmd_copyLink"
oncommand="goDoCommand('cmd_copyLink')"
disabled="false"/>
<command id="cmd_copyImageLocation"
oncommand="goDoCommand('cmd_copyImageLocation')"
disabled="false"/>
<command id="cmd_copyImageContents"
oncommand="goDoCommand('cmd_copyImageContents')"
disabled="false"/>
<command id="cmd_undo"
oncommand="goDoCommand('cmd_undo')"
disabled="true"/>
<command id="cmd_redo"
oncommand="goDoCommand('cmd_redo')"
disabled="true"/>
<command id="cmd_cut"
oncommand="goDoCommand('cmd_cut')"
disabled="true"/>
<command id="cmd_copy"
oncommand="goDoCommand('cmd_copy')"
disabled="true"/>
<command id="cmd_paste"
oncommand="goDoCommand('cmd_paste')"
disabled="true"/>
<command id="cmd_delete"
oncommand="goDoCommand('cmd_delete')"
valueDefault="&deleteCmd.label;"
disabled="true"/>
<command id="cmd_selectAll"
oncommand="goDoCommand('cmd_selectAll')"
disabled="true"/>
<command id="cmd_findTypeText"
oncommand="goDoCommand('cmd_findTypeText')"/>
<command id="cmd_findTypeLinks"
oncommand="goDoCommand('cmd_findTypeLinks')"/>
<!-- Not needed yet, window will need this: -->
<!-- broadcaster id="cmd_preferences"/ -->
<menuitem id="menu_preferences"
label="&preferencesCmd.label;"
key="key_preferences"
accesskey="&preferencesCmd.accesskey;"/>
<!-- View Menu -->
<menu id="menu_View"
label="&viewMenu.label;"
accesskey="&viewMenu.accesskey;"/>
<menu id="menu_Toolbars"
label="&viewToolbarsMenu.label;"
accesskey="&viewToolbarsMenu.accesskey;"/>
<menuitem id="menu_showTaskbar"
label="&showTaskbarCmd.label;"
accesskey="&showTaskbarCmd.accesskey;"
oncommand="goToggleToolbar('status-bar', 'menu_showTaskbar')"
checked="true"/>
<!-- Help Menu -->
<menu id="menu_Help"
label="&helpMenu.label;"
accesskey="&helpMenu.accesskey;">
<menupopup id="helpPopup">
<menuitem accesskey="&releaseCmd.accesskey;"
label="&releaseCmd.label;"
id="releaseUrl"
oncommand="openTopWin('&releaseURL;');"/>
<menuseparator id="menu_HelpAboutSeparator"/>
<menuitem class="about"
accesskey="&aboutCommPluginsCmd.accesskey;"
label="&aboutCommPluginsCmd.label;"
id="pluginInfo"
oncommand="openTopWin('about:plugins')"/>
<menuitem accesskey="&aboutCmd.accesskey;"
label="&aboutCmd.label;"
id="aboutName"
oncommand="goAboutDialog();"/>
</menupopup>
</menu>
<!-- Toolbar boxes -->
<hbox id="toolbar_button_box"
flex="100%"/>
</overlay>

Просмотреть файл

Просмотреть файл

@ -0,0 +1,38 @@
<!-- for SearchDialog.xul -->
<!ENTITY searchHeading.label "Search for messages in:">
<!ENTITY searchHeading.accesskey "h">
<!ENTITY searchSubfolders.label "Search subfolders">
<!ENTITY searchSubfolders.accesskey "e">
<!ENTITY searchButton.label "Search">
<!ENTITY searchButton.accesskey "S">
<!ENTITY resetButton.label "Clear">
<!ENTITY resetButton.accesskey "C">
<!ENTITY helpButton.label "Help">
<!ENTITY helpButton.accesskey "l">
<!ENTITY optionsButton.label "Options">
<!ENTITY closeButton.label "Close">
<!ENTITY openButton.label "Open">
<!ENTITY openButton.accesskey "n">
<!ENTITY deleteButton.label "Delete">
<!ENTITY deleteButton.accesskey "D">
<!ENTITY searchDialogTitle.label "Search Messages">
<!ENTITY conditionDesc.label "Search for messages that match:">
<!ENTITY conditions.label "Criteria">
<!ENTITY results.label "Results">
<!ENTITY fileHereMenu.label "File Here">
<!ENTITY fileHereMenu.accesskey "F">
<!ENTITY fileButton.label "File">
<!ENTITY fileButton.accesskey "i">
<!ENTITY goToFolderButton.label "Open Message Folder">
<!ENTITY goToFolderButton.accesskey "r">
<!-- for ABSearchDialog.xul -->
<!ENTITY abSearchHeading.label "Search in:">
<!ENTITY abSearchHeading.accesskey "S">
<!ENTITY propertiesButton.label "Properties">
<!ENTITY propertiesButton.accesskey "P">
<!ENTITY composeButton.label "Write">
<!ENTITY composeButton.accesskey "W">
<!ENTITY abSearchDialogTitle.label "Advanced Address Book Search">

Просмотреть файл

@ -0,0 +1,4 @@
<!ENTITY lang.version "1.4">
<!ENTITY brandShortName "Minotaur">
<!ENTITY vendorShortName "Minotaur">
<!ENTITY sidebarName "Sidebar">

Просмотреть файл

@ -0,0 +1,3 @@
brandShortName=Minotaur
vendorShortName=Minotaur
sidebarName=Sidebar

Просмотреть файл

Просмотреть файл

Просмотреть файл

@ -0,0 +1,25 @@
<!-- LOCALIZATION NOTE (messengerCmd.label): DONT_TRANSLATE -->
<!ENTITY messengerCmd.label "Mail &amp; Newsgroups">
<!ENTITY messengerCmd.accesskey "m">
<!ENTITY messengerCmd.commandkey "1">
<!ENTITY addressBookCmd.label "Address Book">
<!ENTITY addressBookCmd.accesskey "a">
<!ENTITY addressBookCmd.commandkey "2">
<!ENTITY taskMessenger.tooltip "Mail &amp; Newsgroups">
<!ENTITY taskAddressBook.tooltip "Address Book">
<!-- searchAddressesCmd is also used by addressbook -->
<!ENTITY searchAddressesCmd.label "Search Addresses...">
<!ENTITY searchAddressesCmd.accesskey "A">
<!ENTITY searchMailCmd.label "Search Messages...">
<!ENTITY searchMailCmd.accesskey "e">
<!ENTITY searchMailCmd.key "f">
<!ENTITY javaScriptConsoleCmd.label "JavaScript Console">
<!ENTITY javaScriptConsoleCmd.accesskey "S">
<!ENTITY tasksMenu.label "Tools">
<!ENTITY tasksMenu.accesskey "T">

Просмотреть файл

@ -64,20 +64,14 @@ Rights Reserved.
<!ENTITY emptyTrashCmd.accesskey "y">
<!ENTITY importCmd.label "Import...">
<!ENTITY importCmd.accesskey "I">
<!ENTITY offlineMenu.label "Offline">
<!ENTITY offlineMenu.accesskey "l">
<!ENTITY synchronizeOfflineCmd.label "Download/Sync Now...">
<!ENTITY synchronizeOfflineCmd.accesskey "S">
<!ENTITY settingsOfflineCmd.label "Offline Settings">
<!ENTITY settingsOfflineCmd.accesskey "e">
<!ENTITY downloadSelectedCmd.label "Get Selected Messages">
<!ENTITY downloadSelectedCmd.accesskey "M">
<!ENTITY downloadFlaggedCmd.label "Get Flagged Messages">
<!ENTITY downloadFlaggedCmd.accesskey "F">
<!ENTITY printPreviewCmd.label ".Print Preview">
<!ENTITY printCmd.label "Print...">
<!ENTITY printCmd.accesskey "P">
<!ENTITY printCmd.key "p">
<!ENTITY printPreviewCmd.label "Print Preview">
<!ENTITY printPreviewCmd.accesskey "v">
<!ENTITY printPreviewCmd.key "v">
<!ENTITY printSetupCmd.label "Page Setup...">
<!ENTITY printSetupCmd.accesskey "u">
<!-- Edit Menu -->
<!ENTITY deleteMsgCmd.label "Delete Message">
@ -103,18 +97,16 @@ Rights Reserved.
<!ENTITY selectThreadCmd.key "a">
<!ENTITY selectInvertCmd.label ".Invert Selection">
<!ENTITY selectInvertCmd.accesskey "I">
<!ENTITY spamFiltersCmd.label ".Junk Mail Filter">
<!ENTITY spamFiltersCmd.accesskey "J">
<!ENTITY filtersCmd.label "Message Filters...">
<!ENTITY filtersCmd.accesskey "F">
<!ENTITY filtersApply.label "Run Filters on Selected Folder">
<!ENTITY filtersApply.label "Run Filters on Folder">
<!ENTITY filtersApply.accesskey "R">
<!ENTITY folderPropsCmd.label "Properties...">
<!ENTITY folderPropsFolderCmd.label "Folder Properties...">
<!ENTITY folderPropsNewsgroupCmd.label "Newsgroup Properties...">
<!ENTITY folderPropsCmd.accesskey "o">
<!ENTITY accountManagerCmd.label "Mail &amp; Newsgroups Account Settings...">
<!ENTITY accountManagerCmd.accesskey "M">
<!ENTITY accountManagerCmd.label "Account Settings...">
<!ENTITY accountManagerCmd.accesskey "A">
<!ENTITY undoDeleteMsgCmd.label "Undo Delete Message">
<!ENTITY redoDeleteMsgCmd.label "Redo Delete Message">
<!ENTITY undoMoveMsgCmd.label "Undo Move Message">
@ -134,6 +126,9 @@ Rights Reserved.
<!ENTITY showMessengerToolbarCmd.label "Mail Toolbar">
<!ENTITY showMessengerToolbarCmd.accesskey "o">
<!ENTITY customizeToolbar.label "Customize...">
<!ENTITY customizeToolbar.accesskey "C">
<!-- showSearchToolbarCmd is also used by addressbook -->
<!ENTITY showSearchToolbarCmd.label "Search Bar">
<!ENTITY showSearchToolbarCmd.accesskey "e">
@ -145,7 +140,7 @@ Rights Reserved.
<!-- sortMenu is also used by addressbook -->
<!ENTITY sortMenu.label "Sort by">
<!ENTITY sortMenu.accesskey "t">
<!ENTITY sortMenu.accesskey "S">
<!ENTITY sortByDateCmd.label "Date">
<!ENTITY sortByDateCmd.accesskey "e">
@ -159,13 +154,13 @@ Rights Reserved.
<!ENTITY sortByStatusCmd.accesskey "u">
<!ENTITY sortByLabelCmd.label "Label">
<!ENTITY sortByLabelCmd.accesskey "L">
<!ENTITY sortByScoreCmd.label "Junk Score">
<!ENTITY sortByScoreCmd.accesskey "C">
<!ENTITY sortByJunkStatusCmd.label "Junk Status">
<!ENTITY sortByJunkStatusCmd.accesskey "J">
<!ENTITY sortBySubjectCmd.label "Subject">
<!ENTITY sortBySubjectCmd.accesskey "S">
<!-- Sender / Recipient lives in messenger.properties, since that item is dynamic -->
<!ENTITY sortByUnreadCmd.label "Unread">
<!ENTITY sortByUnreadCmd.accesskey "n">
<!ENTITY sortByUnreadCmd.label "Read">
<!ENTITY sortByUnreadCmd.accesskey "R">
<!ENTITY sortByThreadCmd.label "Thread">
<!ENTITY sortByThreadCmd.accesskey "T">
<!ENTITY sortByOrderReceivedCmd.label "Order Received">
@ -185,7 +180,7 @@ Rights Reserved.
<!ENTITY expandAllThreadsCmd.key "*">
<!ENTITY collapseAllThreadsCmd.label "Collapse All Threads">
<!ENTITY collapseAllThreadsCmd.accesskey "C">
<!ENTITY collapseAllThreadsCmd.key "/">
<!ENTITY collapseAllThreadsCmd.key "\">
<!ENTITY unreadMsgsCmd.label "Unread">
<!ENTITY unreadMsgsCmd.accesskey "U">
<!ENTITY threadsWithUnreadCmd.label "Threads With Unread">
@ -203,14 +198,14 @@ Rights Reserved.
<!ENTITY headersBriefCmd.label ".Brief">
<!ENTITY headersBriefCmd.accesskey "B">
<!ENTITY bodyMenu.label "Message Body As">
<!ENTITY bodyMenu.accesskey "O">
<!ENTITY bodyMenu.accesskey "B">
<!ENTITY bodyAllowHTML.label "Original HTML">
<!ENTITY bodyAllowHTML.accesskey "H">
<!ENTITY bodySanitized.label "Simple HTML">
<!ENTITY bodySanitized.accesskey "S">
<!ENTITY bodyAsPlaintext.label "Plain Text">
<!ENTITY bodyAsPlaintext.accesskey "P">
<!ENTITY viewAttachmentsInlineCmd.label ".View Attachments Inline">
<!ENTITY viewAttachmentsInlineCmd.label "Display Attachments Inline">
<!ENTITY viewAttachmentsInlineCmd.accesskey "A">
<!ENTITY reloadCmd.label "Reload">
<!ENTITY reloadCmd.accesskey "R">
@ -335,6 +330,8 @@ Rights Reserved.
<!ENTITY watchThreadMenu.key "w">
<!ENTITY fileHereMenu.label "File Here">
<!ENTITY fileHereMenu.accesskey "F">
<!ENTITY copyHereMenu.label "Copy Here">
<!ENTITY copyHereMenu.accesskey "C">
<!ENTITY addSenderToAddressBookCmd.label ".Add Sender to Address Book">
<!ENTITY addSenderToAddressBookCmd.accesskey "S">
<!ENTITY addAllToAddressBookCmd.label ".Add All to Address Book">
@ -375,6 +372,10 @@ Rights Reserved.
<!ENTITY markAllReadCmd.key "c">
<!ENTITY markFlaggedCmd.label "Flag">
<!ENTITY markFlaggedCmd.accesskey "F">
<!ENTITY markAsJunkCmd.label "As Junk">
<!ENTITY markAsJunkCmd.accesskey "J">
<!ENTITY markAsNotJunkCmd.label "As Not Junk">
<!ENTITY markAsNotJunkCmd.accesskey "N">
<!ENTITY openMessageWindowCmd.label "Open Message">
<!ENTITY openMessageWindowCmd.accesskey "O">
<!ENTITY openMessageWindowCmd.key "o">
@ -385,8 +386,8 @@ Rights Reserved.
<!ENTITY totalColumn.label "Total">
<!-- Toolbar items -->
<!ENTITY getMsgButton.label "Get Msgs">
<!ENTITY newMsgButton.label "Compose">
<!ENTITY getMsgButton.label "Get Mail">
<!ENTITY newMsgButton.label "Write">
<!ENTITY replyButton.label "Reply">
<!ENTITY replyAllButton.label "Reply All">
<!ENTITY forwardButton.label "Forward">
@ -397,8 +398,12 @@ Rights Reserved.
<!ENTITY printButton.label "Print">
<!ENTITY stopButton.label "Stop">
<!ENTITY junkButton.label "Junk">
<!ENTITY notJunkButton.label "Not Junk">
<!ENTITY addressBookButton.label "Address Book">
<!--Tooltips-->
<!ENTITY menuBar.tooltip "Menu Bar">
<!ENTITY mailToolbar.tooltip "Mail Toolbar">
<!ENTITY advancedButton.tooltip "Advanced message search">
<!ENTITY clearButton.tooltip "Clear the search criteria and show all messages">
<!ENTITY getMsgButton.tooltip "Get new messages">
@ -413,7 +418,9 @@ Rights Reserved.
<!ENTITY printButton.tooltip "Print this message">
<!ENTITY stopButton.tooltip "Stop the current transfer">
<!ENTITY throbber.tooltip "Go to the &vendorShortName; home page">
<!ENTITY junkButton.tooltip "Mark the selected messages as junk (or not junk)">
<!ENTITY junkButton.tooltip "Mark the selected messages as junk">
<!ENTITY notJunkButton.tooltip "Mark the selected messages as not junk">
<!ENTITY addressBookButton.tooltip "Go to the address book">
<!-- Statusbar -->
<!ENTITY statusText.label "Done">
@ -443,6 +450,7 @@ Rights Reserved.
<!ENTITY contextSaveAs.accesskey "S">
<!ENTITY contextPrint.label "Print...">
<!ENTITY contextPrint.accesskey "P">
<!ENTITY contextPrintPreview.label "Print Preview">
<!ENTITY contextDelete.label "Delete">
<!ENTITY contextDelete.accesskey "D">
<!ENTITY contextAddSenderToAddressBook.label "Add Sender To Address Book">
@ -512,54 +520,53 @@ Rights Reserved.
<!ENTITY junkMailCmd.label "Junk Mail Controls...">
<!ENTITY junkMailCmd.accesskey "J">
<!ENTITY toolsMenu.label "Tools">
<!ENTITY toolsMenu.accesskey "T">
<!ENTITY runJunkControls.label "Run Junk Mail Controls on Folder">
<!ENTITY runJunkControls.accesskey "u">
<!ENTITY textZoomEnlargeCmd.label "Increase Text Size">
<!ENTITY textZoomEnlargeCmd.accesskey "I">
<!ENTITY textZoomEnlargeCmd.commandkey "+">
<!ENTITY textZoomEnlargeCmd.commandkey2 "="> <!-- + is above this key on many keyboards -->
<!ENTITY deleteJunk.label "Delete Mail Marked as Junk in Folder">
<!ENTITY deleteJunk.accesskey "e">
<!ENTITY textZoomReduceCmd.label "Decrease Text Size">
<!ENTITY textZoomReduceCmd.accesskey "D">
<!ENTITY textZoomReduceCmd.commandkey "-">
<!ENTITY newMessageCmd.key "M">
<!ENTITY newMessageCmd.label "Message">
<!ENTITY newMessageCmd.accesskey "m">
<!ENTITY threadColumn.label "Thread">
<!ENTITY senderColumn.label "Sender">
<!ENTITY subjectColumn.label "Subject">
<!ENTITY dateColumn.label "Date">
<!ENTITY priorityColumn.label "Priority">
<!ENTITY labelColumn.label "Label">
<!ENTITY statusColumn.label "Status">
<!ENTITY sizeColumn.label "Size">
<!ENTITY scoreColumn.label "Junk Score">
<!ENTITY linesColumn.label "Lines">
<!ENTITY unreadColumn.label "Unread">
<!ENTITY totalColumn.label "Total">
<!ENTITY orderReceivedColumn.label "Order Received">
<!ENTITY readColumn.label "Read">
<!ENTITY flagColumn.label "Flag">
<!ENTITY locationColumn.label "Location">
<!-- junk bar -->
<!ENTITY junkBarMessage.label "&brandShortName; thinks this message is junk mail">
<!ENTITY notJunkButton.label "This is Not Junk">
<!ENTITY junkInfoButton.label "?">
<!--Tooltips-->
<!ENTITY threadColumnHeader.tooltip "Click to display message threads">
<!ENTITY columnChooser.tooltip "Click to select columns to display">
<!ENTITY nameColumn.label "Name">
<!ENTITY unreadColumn.label "Unread">
<!ENTITY totalColumn.label "Total">
<!ENTITY accounts.label "Accounts">
<!-- LOCALIZATION NOTE (accounts.img) : DONT_TRANSLATE -->
<!ENTITY accounts.img "chrome://messenger/skin/local-mailhost.gif">
<!--- Tools Menu Bar-->
<!-- LOCALIZATION NOTE (messengerCmd.label): DONT_TRANSLATE -->
<!ENTITY messengerCmd.label "Mail &amp; Newsgroups">
<!ENTITY messengerCmd.accesskey "m">
<!ENTITY messengerCmd.commandkey "1">
<!ENTITY addressBookCmd.label "Address Book">
<!ENTITY addressBookCmd.accesskey "a">
<!ENTITY addressBookCmd.commandkey "2">
<!ENTITY taskMessenger.tooltip "Mail &amp; Newsgroups">
<!ENTITY taskAddressBook.tooltip "Address Book">
<!-- searchAddressesCmd is also used by addressbook -->
<!ENTITY searchAddressesCmd.label "Search Addresses...">
<!ENTITY searchAddressesCmd.accesskey "A">
<!ENTITY searchMailCmd.label "Search Messages...">
<!ENTITY searchMailCmd.accesskey "e">
<!ENTITY searchMailCmd.key "f">
<!ENTITY javaScriptConsoleCmd.label "JavaScript Console">
<!ENTITY javaScriptConsoleCmd.accesskey "S">
<!-- Tasks Menu -->
<!ENTITY tasksMenu.label "Tools">
<!ENTITY tasksMenu.accesskey "T">
<!-- Help Menu -->
<!ENTITY helpMenu.label "Help">
<!ENTITY helpMenu.accesskey "H">
<!ENTITY helpMenu.accesskey "H">
<!ENTITY releaseCmd.label "Release Notes">
<!ENTITY releaseCmd.accesskey "R">
<!ENTITY aboutCmd.label "About">
<!ENTITY aboutCmd.accesskey "A">
<!ENTITY viewMenu.label "View">
<!ENTITY viewMenu.accesskey "V">
<!ENTITY viewToolbars.label "Toolbars">
<!ENTITY viewToolbars.accesskey "T">
<!ENTITY releaseCmd.accesskey "R">
<!ENTITY hintsAndTips.label "Minotaur Help">
<!ENTITY hintsAndTips.accesskey "M">

Просмотреть файл

@ -0,0 +1,40 @@
<!--
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.
Contributor(s):
Stephen Donner <stephend@netscape.com>
Seth Spitzer <sspitzer@netscape.com>
-->
<!ENTITY emailSectionHdr.label "Email">
<!ENTITY readMsgsLink.label "Read messages">
<!ENTITY composeMsgLink.label "Write a new message">
<!ENTITY newsSectionHdr.label "Newsgroups">
<!ENTITY subscribeNewsLink.label "Subscribe to newsgroups">
<!ENTITY accountsSectionHdr.label "Accounts">
<!ENTITY settingsLink.label "View settings for this account">
<!ENTITY newAcctLink.label "Create a new account">
<!ENTITY advFeaturesSectionHdr.label "Advanced Features">
<!ENTITY searchMsgsLink.label "Search messages">
<!ENTITY filtersLink.label "Create message filters">
<!ENTITY junkSettings.label "Junk mail settings">
<!ENTITY offlineLink.label "Offline settings">

Просмотреть файл

@ -1,10 +1,12 @@
#
# messenger.properties
# mailnews.js
mailnews.start_page.url=http://www.mozilla.org/mailnews/start.html
messenger.throbber.url=http://www.mozilla.org/
compose.throbber.url=http://www.mozilla.org/
addressbook.throbber.url=http://www.mozilla.org/
mailnews.start_page.url=http://www.mozilla.org/mailnews/minotaur/
mailnews.release_notes.url=http://www.mozilla.org/mailnews/minotaur/
mailnews.hints_and_tips.url=http://texturizer.net/minotaur/
messenger.throbber.url=http://www.mozilla.org/mailnews/minotaur/
compose.throbber.url=http://www.mozilla.org/mailnews/minotaur/
addressbook.throbber.url=http://www.mozilla.org/mailnews/minotaur/
# To make mapit buttons to disappear in the addressbook, specify empty string. For example:
# mail.addr_book.mapit_url.format=
# The format for "mail.addr_book.mapit_url.format" is:

Просмотреть файл

@ -0,0 +1,72 @@
<!-- these things need to move into utilityOverlay.xul -->
<!ENTITY offlineGoOfflineCmd.label "Work Offline">
<!ENTITY offlineGoOfflineCmd.accesskey "w">
<!-- LOCALIZATION NOTE : FILE This file contains the global menu items -->
<!ENTITY fileMenu.label "File">
<!ENTITY fileMenu.accesskey "f">
<!ENTITY newMenu.label "New">
<!ENTITY newMenu.accesskey "N">
<!ENTITY newBlankPageCmd.label "Composer Page">
<!ENTITY newBlankPageCmd.accesskey "P" >
<!ENTITY newBlankPageCmd.key "n" >
<!ENTITY newPageFromTemplateCmd.label "Page Using Template">
<!ENTITY newPageFromTemplateCmd.accesskey "t">
<!ENTITY newPageFromDraftCmd.label "Page Using Draft">
<!ENTITY newPageFromDraftCmd.accesskey "d">
<!-- LOCALIZATION NOTE (newNavigatorCmd.label): Do NOT translate "Navigator" -->
<!ENTITY newNavigatorCmd.label "Navigator Window">
<!ENTITY newNavigatorCmd.key "N">
<!ENTITY newNavigatorCmd.accesskey "N">
<!ENTITY editMenu.label "Edit">
<!ENTITY editMenu.accesskey "e">
<!ENTITY undoCmd.label "Undo">
<!ENTITY undoCmd.key "Z">
<!ENTITY undoCmd.accesskey "u">
<!ENTITY redoCmd.label "Redo">
<!ENTITY redoCmd.key "Y">
<!ENTITY redoCmd.accesskey "r">
<!ENTITY cutCmd.label "Cut">
<!ENTITY cutCmd.key "X">
<!ENTITY cutCmd.accesskey "t">
<!ENTITY copyCmd.label "Copy">
<!ENTITY copyCmd.key "C">
<!ENTITY copyCmd.accesskey "c">
<!ENTITY pasteCmd.label "Paste">
<!ENTITY pasteCmd.key "V">
<!ENTITY pasteCmd.accesskey "p">
<!ENTITY deleteCmd.label "Delete">
<!ENTITY deleteCmd.key "D">
<!ENTITY deleteCmd.accesskey "d">
<!ENTITY selectAllCmd.label "Select All">
<!ENTITY selectAllCmd.key "A">
<!ENTITY selectAllCmd.accesskey "a">
<!ENTITY preferencesCmd.label "Options...">
<!ENTITY preferencesCmd.key "O">
<!ENTITY preferencesCmd.accesskey "O">
<!ENTITY findTypeTextCmd.label "Find Text As You Type">
<!ENTITY findTypeTextCmd.accesskey "x">
<!ENTITY findTypeLinksCmd.label "Find Links As You Type">
<!ENTITY findTypeLinksCmd.accesskey "k">
<!ENTITY viewMenu.label "View">
<!ENTITY viewMenu.accesskey "v">
<!ENTITY viewToolbarsMenu.label "Toolbars">
<!ENTITY viewToolbarsMenu.accesskey "T">
<!ENTITY showTaskbarCmd.label "Status Bar">
<!ENTITY showTaskbarCmd.accesskey "S">
<!ENTITY helpMenu.label "Help">
<!ENTITY helpMenu.accesskey "h">
<!-- NOTE (whatNewCmd.label): This is not used in Mozilla but is used in Netscape -->
<!ENTITY whatNewCmd.label "What's New">
<!ENTITY releaseCmd.label "Release Notes">
<!ENTITY releaseCmd.accesskey "r">
<!ENTITY aboutCmd.label "About &brandShortName;">
<!ENTITY aboutCmd.accesskey "A">
<!ENTITY aboutCommPluginsCmd.label "About Plug-ins">
<!ENTITY aboutCommPluginsCmd.accesskey "p">

Просмотреть файл

@ -0,0 +1,83 @@
/*
* 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.
*/
/* ===== accountCentral.css ==========================================
== Styles for the Messenger Account Central panel.
======================================================================= */
@import url("chrome://messenger/skin/");
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#acctCentralGrid {
background-color: #FFFFFF;
}
separator {
height: 5px;
}
separator.thin {
height: 15px;
}
/* ::::: rows ::::: */
#acctCentralHeaderRow {
padding: 10px 0px 10px 10px;
font-size: 180%;
font-weight: bold;
color: #000000;
}
.acctCentralRow {
margin-left: 10px;
font-size: 125%;
color: #000000;
}
.row-iconic-icon {
list-style-image: inherit;
margin-right: 10px;
}
.acctCentralRowTitleBox {
background-color: -moz-Dialog;
font-size: 150%;
font-weight: bold;
color: #000000;
}
/* ::::: links ::::: */
.acctCentralLinkText {
cursor: pointer;
color: #212731;
text-decoration: underline;
}
.acctCentralLinkText:hover {
color: #39598E;
}
.acctCentralLinkText:hover:active {
color: #000000;
}

Просмотреть файл

Просмотреть файл

Просмотреть файл

@ -0,0 +1,66 @@
/*
* 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-2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Joe Hewitt (hewitt@netscape.com)
*/
/* ===== toolbar.css ====================================================
== Styles used by XUL toolbar-related elements.
======================================================================= */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* ::::: toolbox ::::: */
toolbox {
-moz-appearance: toolbox;
background-color: -moz-Dialog;
border-left: 1px solid ThreeDShadow;
border-top: 1px solid ThreeDShadow;
border-right: none;
border-bottom: 1px solid #000000;
}
/* ::::: toolbar & menubar ::::: */
toolbar,
menubar {
-moz-appearance: toolbar;
min-width: 1px; /* DON'T DELETE!
Prevents hiding of scrollbars in browser when window is made smaller.*/
}
.toolbar-holder {
border-left: 1px solid ThreeDHighlight;
border-top: 1px solid ThreeDHighlight;
border-right: 1px solid ThreeDShadow;
border-bottom: 1px solid ThreeDShadow;
}
/* ::::: toolbarseparator ::::: */
toolbarseparator {
-moz-appearance : separator;
margin : 2px 0.2em 2px 0.2em;
border-right : 1px solid ThreeDHighlight;
border-left : 1px solid ThreeDShadow;
width : 2px;
}

Просмотреть файл

@ -0,0 +1,179 @@
/*
* 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.
*
* Contributor(s):
*
*/
/* ===== messageHeader.css ==============================================
== Styles for the header toolbars of a mail message.
======================================================================= */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* ::::: msg header toolbars ::::: */
#collapsedHeaderView,
#expandedHeaderView {
min-width: 1px;
}
/* ::::: msg header buttons ::::: */
#expandedAttachmentBox {
width: 20em;
height: 0;
list-style-image: url("chrome://messenger/skin/icons/attach.gif");
}
#attachmentTree {
margin: 3px 0;
border: none;
height: 0;
width: 20em;
}
#attachmentText {
font-weight: bold;
}
/* ::::: msg header captions ::::: */
#msgHeaderView {
border-right: 1px solid ThreeDShadow;
border-left: 1px solid ThreeDShadow;
-moz-appearance: toolbox;
background-color: -moz-Dialog;
}
#collapsedHeaderView,
#expandedHeaderView {
border-bottom: 1px solid ThreeDDarkShadow;
min-width: 1px;
background-color: transparent;
}
.headerNameBox {
width: 7.7em;
background-color: transparent;
}
.headerName {
margin: 0 .5em 0 0;
min-height: 18px;
font-weight: bold;
text-align: right;
background-color: transparent;
}
.headerValue {
margin: 0 0 .25em 0;
min-width: 50px;
white-space: normal;
background-color: transparent;
}
.subjectvalue {
font-weight: bold;
background-color: transparent;
}
/* ::::: msg header email addresses ::::: */
.emailDisplayButton {
cursor: pointer;
color: #0000FF;
text-decoration: underline;
margin: 0;
background-color: transparent;
}
.emailDisplayButton:hover {
color: #FF0000;
}
.emailDisplayImage {
padding-left: 2px;
-moz-box-pack: end;
}
/* ::::: email address twisty ::::: */
.addresstwisty {
margin: 2px;
list-style-image: url("chrome://global/skin/tree/twisty-clsd.gif");
}
.addresstwisty[open] {
list-style-image: url("chrome://global/skin/tree/twisty-open.gif");
}
/* ::::: view expand and collapse twisties ::::: */
.expandHeaderViewButton,
.collapsedHeaderViewButton {
margin: 2px .5em 0 .5em;
}
.expandHeaderViewButton {
list-style-image: url("chrome://global/skin/tree/twisty-open.gif");
}
.collapsedHeaderViewButton {
list-style-image: url("chrome://global/skin/tree/twisty-clsd.gif");
}
/* ::::: collapsed view styles ::::: */
#collapsedAttachmentBox {
-moz-box-pack: center;
}
#collapseddateValue {
margin: 0 .5em;
text-align: right;
background-color: transparent;
}
#collapsedfromBox {
width: 18em;
background-color: transparent;
}
#collapseddateBox {
width: 12em;
background-color: transparent;
}
.collapsedHeaderDisplayName {
margin: 0 .5em 0 .7em;
min-height: 16px;
font-weight: bold;
background-color: transparent;
}
.collapsedHeaderValue {
margin: 0;
background-color: transparent;
}
.collapsedAttachmentButton {
list-style-image: url("chrome://messenger/skin/icons/message-mail-attach.gif");
margin-right: .5em;
}

Просмотреть файл

@ -0,0 +1,272 @@
/*
* 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.
*
* Contributor(s):
*
*/
/* ===== primaryToolbar.css =============================================
== Images for the Mail primary toolbar.
======================================================================= */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* this toolbox declaration should not need to be here, but for some reason this is the only
way to get the toolbar to look right on win XP. Including toolbar.css isn't enought.
*/
toolbox {
-moz-appearance: toolbox;
background-color: -moz-Dialog;
}
/* ::::: primary toolbar buttons ::::: */
.toolbarbutton-1 {
list-style-image: url("chrome://messenger/skin/icons/btn1.gif");
}
#button-getmsg {
-moz-image-region: rect(105px 23px 126px 0px);
}
#button-getmsg[buttonover] {
-moz-image-region: rect(105px 46px 126px 23px);
}
#button-getmsg[buttondown] {
-moz-image-region: rect(105px 69px 126px 46px);
}
#button-getmsg[disabled] {
-moz-image-region: rect(105px 92px 126px 69px) !important;
}
#button-newmsg {
-moz-image-region: rect(126px 23px 147px 0px);
}
#button-newmsg:hover {
-moz-image-region: rect(126px 46px 147px 23px);
}
#button-newmsg:hover:active {
-moz-image-region: rect(126px 69px 147px 46px);
}
#button-newmsg[disabled] {
-moz-image-region: rect(126px 92px 147px 69px) !important;
}
#button-reply {
-moz-image-region: rect(168px 23px 189px 0px);
}
#button-reply:hover {
-moz-image-region: rect(168px 46px 189px 23px);
}
#button-reply:hover:active {
-moz-image-region: rect(168px 69px 189px 46px);
}
#button-reply[disabled] {
-moz-image-region: rect(168px 92px 189px 69px) !important;
}
#button-replyall {
-moz-image-region: rect(189px 23px 210px 0px);
}
#button-replyall:hover {
-moz-image-region: rect(189px 46px 210px 23px);
}
#button-replyall:hover:active {
-moz-image-region: rect(189px 69px 210px 46px);
}
#button-replyall[disabled] {
-moz-image-region: rect(189px 92px 210px 69px) !important;
}
#button-forward {
-moz-image-region: rect(84px 23px 105px 0px);
}
#button-forward:hover {
-moz-image-region: rect(84px 46px 105px 23px);
}
#button-forward:hover:active {
-moz-image-region: rect(84px 69px 105px 46px);
}
#button-forward[disabled] {
-moz-image-region: rect(84px 92px 105px 69px) !important;
}
#button-file {
-moz-image-region: rect(63px 23px 84px 0px);
}
#button-file:hover {
-moz-image-region: rect(63px 46px 84px 23px);
}
#button-file:hover:active,
#button-file[open] {
-moz-image-region: rect(63px 69px 84px 46px);
}
#button-file[disabled] {
-moz-image-region: rect(63px 92px 84px 69px) !important;
}
#button-next {
-moz-image-region: rect(147px 23px 168px 0px);
}
#button-next:hover {
-moz-image-region: rect(147px 46px 168px 23px);
}
#button-next:hover:active {
-moz-image-region: rect(147px 69px 168px 46px);
}
#button-next[disabled] {
-moz-image-region: rect(147px 92px 168px 69px) !important;
}
#button-delete {
-moz-image-region: rect(210px 23px 231px 0px);
}
#button-delete:hover {
-moz-image-region: rect(210px 46px 231px 23px);
}
#button-delete:hover:active {
-moz-image-region: rect(210px 69px 231px 46px);
}
#button-delete[disabled] {
-moz-image-region: rect(210px 92px 231px 69px) !important;
}
#button-mark {
-moz-image-region: rect(336px 23px 357px 0);
}
#button-mark[buttonover] {
-moz-image-region: rect(336px 46px 357px 23px);
}
#button-mark[buttondown] {
-moz-image-region: rect(336px 69px 357px 46px);
}
#button-mark[disabled] {
-moz-image-region: rect(336px 92px 357px 69px) !important;
}
#button-junk{
-moz-image-region: rect(357px 23px 378px 0);
}
#button-junk:hover {
-moz-image-region: rect(357px 46px 378px 23px);
}
#button-junk:hover:active {
-moz-image-region: rect(357px 69px 378px 46px);
}
#button-junk[disabled="true"] {
-moz-image-region: rect(357px 92px 378px 69px) !important;
}
#button-print {
list-style-image: url("chrome://communicator/skin/icons/btn1.gif");
-moz-image-region: rect(0px 23px 21px 0px);
}
#button-print[buttonover] {
-moz-image-region: rect(0px 46px 21px 23px);
}
#button-print[buttondown] {
-moz-image-region: rect(0px 69px 21px 46px);
}
#button-print[disabled] {
-moz-image-region: rect(0px 92px 21px 69px) !important;
}
#button-address {
-moz-image-region: rect(231px 23px 252px 0px);
}
#button-address:hover {
-moz-image-region: rect(231px 46px 252px 23px);
}
#button-address:hover:active {
-moz-image-region: rect(231px 46px 252px 23px);
}
#button-address[disabled="true"] {
-moz-image-region: rect(231px 92px 252px 69px) !important;
}
#button-stop {
list-style-image: url("chrome://communicator/skin/icons/btn1.gif");
-moz-image-region: rect(21px 22px 42px 0px);
}
#button-stop:hover {
-moz-image-region: rect(21px 44px 42px 22px);
}
#button-stop:hover:active {
-moz-image-region: rect(21px 66px 42px 44px);
}
#button-stop[disabled="true"] {
-moz-image-region: rect(21px 88px 42px 66px) !important;
}
#junkBarImage {
list-style-image: url("chrome://messenger/skin/icons/junkBar.gif");
}
#junkBarMessage {
font-weight: bold;
}
#junkBar {
border-bottom: 1px solid;
-moz-border-bottom-colors: #000000;
background-color: #C7BC8F;
}
#junkIcon {
list-style-image: url("chrome://messenger/skin/icons/folder-junk.gif");
}

Просмотреть файл

@ -0,0 +1,242 @@
/*
* 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-2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Scott MacGregor (mscott@netscape.com)
* Joe Hewitt (hewitt@netscape.com)
*/
/* ===== threadPane.css ==============================================
== Styles for the thread pane in the Messenger 3-pane window.
======================================================================= */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* ::::: thread decoration ::::: */
treechildren:-moz-tree-cell-text(read) {
font-weight: normal;
}
treechildren:-moz-tree-cell-text(unread) {
font-weight: bold;
}
/* on a collapsed thread, if the top level message is read, but the thread has
* unread children, underline the text. 4.x mac did this, very slick
*/
treechildren:-moz-tree-cell-text(container, closed, hasUnread, read) {
text-decoration: underline;
}
/* ::::: priority colors ::::: */
/****
**** Priority colors currently not being used at the moment. It has been
**** disabled so as to not conflict with the labels color feature.
****
treechildren:-moz-tree-cell-text(priorityCol, priority-highest) {
color: red;
}
treechildren:-moz-tree-cell-text(priorityCol, priority-high) {
color: rgb(128, 0, 0);
}
treechildren:-moz-tree-cell-text(priorityCol, priority-lowest) {
color: rgb(170, 170, 170);
}
treechildren:-moz-tree-cell-text(priorityCol, priority-low) {
color: rgb(85, 85, 85);
}
treechildren:-moz-tree-cell-text(priorityCol, selected) {
color: -moz-DialogText;
}
treechildren:-moz-tree-cell-text(priorityCol, selected, focus) {
color: HighlightText;
}
****/
/* ::::: message icons ::::: */
/* ::::: message column icons ::::: */
/* ..... thread column ..... */
treecol.threadColumnHeader {
list-style-image: url("chrome://messenger/skin/icons/unthreadcol.gif");
}
treecol.threadColumnHeader[sortDirection="ascending"] {
list-style-image: url("chrome://messenger/skin/icons/threadcol.gif");
}
treecol.threadColumnHeader[sortDirection="descending"] {
list-style-image: url("chrome://messenger/skin/icons/threadcol.gif");
}
treechildren:-moz-tree-image(threadCol, container) {
list-style-image: url("chrome://messenger/skin/icons/thread-closed.gif");
}
treechildren:-moz-tree-image(threadCol, container, open) {
list-style-image: url("chrome://messenger/skin/icons/thread-open.gif");
}
treechildren:-moz-tree-image(threadCol, container, hasUnread) {
list-style-image: url("chrome://messenger/skin/icons/thread-new-closed.gif");
}
treechildren:-moz-tree-image(threadCol, container, hasUnread, open) {
list-style-image: url("chrome://messenger/skin/icons/thread-new-open.gif");
}
/* ..... read column ..... */
treecol.readColumnHeader {
list-style-image: url("chrome://messenger/skin/icons/readcol.gif");
}
treechildren:-moz-tree-image(unreadButtonColHeader) {
list-style-image: url("chrome://messenger/skin/icons/readmail.gif");
}
treechildren:-moz-tree-image(unreadButtonColHeader, unread) {
list-style-image: url("chrome://messenger/skin/icons/unreadmail.gif");
}
/* ..... flag column ..... */
treecol.flagColumnHeader {
list-style-image: url("chrome://messenger/skin/icons/flagcol.gif");
}
treechildren:-moz-tree-image(flaggedCol) {
list-style-image: url("chrome://messenger/skin/icons/readmail.gif");
}
treechildren:-moz-tree-image(flaggedCol, flagged) {
list-style-image: url("chrome://messenger/skin/icons/flaggedmail.gif");
}
/* ..... junkStatus column ..... */
treecol.junkStatusHeader {
list-style-image: url("chrome://messenger/skin/icons/folder-junk.gif");
}
/* "unknown" now looks like "not junk". see bug #182386 */
treechildren:-moz-tree-image(junkStatusCol) {
list-style-image: url("chrome://messenger/skin/icons/readmail.gif");
padding-left: 0px;
padding-right: 4px;
}
treechildren:-moz-tree-image(junkStatusCol, junk) {
list-style-image: url("chrome://messenger/skin/icons/folder-junk.gif");
}
treechildren:-moz-tree-image(junkStatusCol, notjunk) {
list-style-image: url("chrome://messenger/skin/icons/readmail.gif");
padding-left: 0px;
padding-right: 4px;
}
/* ..... subject column ..... */
treechildren:-moz-tree-image(subjectCol) {
margin-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail.gif");
}
treechildren:-moz-tree-image(subjectCol, new) {
list-style-image: url("chrome://messenger/skin/icons/message-mail-new.gif");
}
treechildren:-moz-tree-image(subjectCol, attach) {
list-style-image: url("chrome://messenger/skin/icons/message-mail-attach.gif");
}
treechildren:-moz-tree-image(subjectCol, imapdeleted) {
list-style-image: url("chrome://messenger/skin/icons/message-mail-imapdelete.gif");
}
treechildren:-moz-tree-image(subjectCol, news) {
list-style-image: url("chrome://messenger/skin/icons/message-news.gif");
}
treechildren:-moz-tree-image(subjectCol, news, attach) {
list-style-image: url("chrome://messenger/skin/icons/message-news-attach.gif");
}
treechildren:-moz-tree-image(subjectCol, news, attach, offline) {
list-style-image: url("chrome://messenger/skin/icons/message-news-attach-offl.gif");
}
treechildren:-moz-tree-image(subjectCol, news, new) {
list-style-image: url("chrome://messenger/skin/icons/message-news-new.gif");
}
treechildren:-moz-tree-image(subjectCol, news, new, attach) {
list-style-image: url("chrome://messenger/skin/icons/message-news-new-attach.gif");
}
/* ..... new thread icons for watch and ignore ..... */
treechildren:-moz-tree-image(news, threadCol, watch) {
list-style-image: url("chrome://messenger/skin/icons/thread-closed-eye.gif");
}
treechildren:-moz-tree-image(news, threadCol, ignore) {
list-style-image: url("chrome://messenger/skin/icons/thread-closed-kill.gif");
}
treechildren:-moz-tree-image(news, threadCol, container, hasUnread, watch) {
list-style-image: url("chrome://messenger/skin/icons/thread-new-closed-eye.gif");
}
treechildren:-moz-tree-image(news, threadCol, container, hasUnread, ignore) {
list-style-image: url("chrome://messenger/skin/icons/thread-new-closed-kill.gif");
}
treechildren:-moz-tree-image(news, threadCol, container, hasUnread, watch, open) {
list-style-image: url("chrome://messenger/skin/icons/thread-new-open-eye.gif");
}
treechildren:-moz-tree-image(news, threadCol, container, hasUnread, ignore, open) {
list-style-image: url("chrome://messenger/skin/icons/thread-new-open-kill.gif");
}
treechildren:-moz-tree-image(news, threadCol, container, watch, open) {
list-style-image: url("chrome://messenger/skin/icons/thread-open-eye.gif");
}
treechildren:-moz-tree-image(news, threadCol, container, ignore, open) {
list-style-image: url("chrome://messenger/skin/icons/thread-open-kill.gif");
}
#sizeCol,
#unreadCol,
#totalCol {
text-align: right;
}

Просмотреть файл

289
mail/base/skin/tree.css Normal file
Просмотреть файл

@ -0,0 +1,289 @@
/*
* 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-2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Joe Hewitt (hewitt@netscape.com)
* Dean Tessman (dean_tessman@hotmail.com)
*/
/* ===== tree.css ===================================================
== Styles used by the XUL outline element.
======================================================================= */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* ::::: tree ::::: */
tree {
margin: 0px 4px;
border: 2px solid;
-moz-border-top-colors: ThreeDShadow ThreeDDarkShadow;
-moz-border-right-colors: ThreeDHighlight ThreeDLightShadow;
-moz-border-bottom-colors: ThreeDHighlight ThreeDLightShadow;
-moz-border-left-colors: ThreeDShadow ThreeDDarkShadow;
background-color: -moz-Field;
color: -moz-FieldText;
-moz-appearance: listbox;
}
/* ::::: tree rows ::::: */
tree[selstyle="primary"] > treechildren:-moz-tree-row,
treechildren:-moz-tree-row {
border: 1px solid transparent;
background-color: transparent;
min-height: 18px;
height: 1.3em;
}
treechildren:-moz-tree-row(selected) {
background-color: -moz-Dialog;
}
treechildren:-moz-tree-row(selected, focus) {
background-color: Highlight;
}
treechildren:-moz-tree-row(current, focus) {
border: 1px dotted #000000;
}
treechildren:-moz-tree-row(selected, current, focus) {
border: 1px dotted #C0C0C0;
}
/* ::::: tree cells ::::: */
treechildren:-moz-tree-cell {
padding: 0px 2px 0px 2px;
}
tree[selstyle="primary"] > treechildren:-moz-tree-cell-text,
treechildren:-moz-tree-cell-text {
border: 1px solid transparent;
color: inherit;
}
treechildren:-moz-tree-cell-text(selected) {
color: -moz-DialogText;
}
tree[selstyle="primary"] > treechildren:-moz-tree-cell-text(primary, selected) {
background-color: -moz-Dialog;
color: -moz-DialogText;
}
treechildren:-moz-tree-cell-text(selected, focus) {
color: HighlightText;
}
tree[selstyle="primary"] > treechildren:-moz-tree-cell-text(primary, selected, focus) {
background-color: Highlight;
color: HighlightText;
}
tree[selstyle="primary"] > treechildren:-moz-tree-cell-text(primary, current, focus) {
border: 1px dotted #000000;
}
tree[selstyle="primary"] > treechildren:-moz-tree-cell-text(primary, selected, current, focus) {
border: 1px dotted #C0C0C0;
}
/* ::::: lines connecting cells ::::: */
tree[selstyle="primary"] > treechildren:-moz-tree-line,
treechildren:-moz-tree-line {
border: 1px dotted ThreeDShadow;
}
treechildren:-moz-tree-line(selected, focus) {
border: 1px dotted HighlightText;
}
/* ::::: tree separator ::::: */
treechildren:-moz-tree-separator {
border-top: 1px solid ThreeDShadow;
border-bottom: 1px solid ThreeDHighlight;
}
/* ::::: drop feedback ::::: */
tree[selstyle="primary"] > treechildren:-moz-tree-cell-text(primary, dropOn),
treechildren:-moz-tree-cell-text(primary, dropOn) {
background-color: Highlight;
color: HighlightText;
}
treechildren:-moz-tree-drop-feedback {
background-color: Highlight;
width: 50px;
height: 2px;
margin-left: 5px;
}
/* ::::: tree progress meter ::::: */
treechildren:-moz-tree-progressmeter {
margin: 2px 4px;
border: 2px solid;
-moz-border-top-colors: ThreeDShadow -moz-Dialog;
-moz-border-right-colors: ThreeDHighlight -moz-Dialog;
-moz-border-bottom-colors: ThreeDHighlight -moz-Dialog;
-moz-border-left-colors: ThreeDShadow -moz-Dialog;
background-color: -moz-Dialog;
color: ThreeDShadow;
}
treechildren:-moz-tree-progressmeter(progressUndetermined) {
list-style-image: url("chrome://global/skin/progressmeter/progressmeter-busy.gif");
}
treechildren:-moz-tree-cell-text(progressmeter) {
margin: 2px 4px;
}
/* ::::: tree columns ::::: */
treecol,
treecolpicker {
-moz-appearance: treeheadercell;
-moz-box-align: center;
-moz-box-pack: center;
border: 2px solid;
-moz-border-top-colors: ThreeDHighlight ThreeDLightShadow;
-moz-border-right-colors: ThreeDDarkShadow ThreeDShadow;
-moz-border-bottom-colors: ThreeDDarkShadow ThreeDShadow;
-moz-border-left-colors: ThreeDHighlight ThreeDLightShadow;
background-color: -moz-Dialog;
color: -moz-DialogText;
padding: 0px 4px;
}
.treecol-image {
padding: 0px 1px;
}
.treecol-text {
margin: 0px !important;
}
treecol[hideheader="true"] {
-moz-appearance: none;
border: none;
padding: 0;
}
/* ..... internal box ..... */
treecol:hover:active,
treecolpicker:hover:active {
border-top: 2px solid;
border-right: 1px solid;
border-bottom: 1px solid;
border-left: 2px solid;
-moz-border-top-colors: ThreeDShadow -moz-Dialog;
-moz-border-right-colors: ThreeDShadow;
-moz-border-bottom-colors: ThreeDShadow;
-moz-border-left-colors: ThreeDShadow -moz-Dialog;
padding: 1px 4px 0px 5px;
}
.treecol-image:hover:active {
padding: 1px 1px 0px 2px;
}
/* ::::: column drag and drop styles ::::: */
treecol[dragging="true"] {
-moz-border-top-colors: ThreeDDarkShadow transparent !important;
-moz-border-right-colors: ThreeDDarkShadow transparent!important;
-moz-border-bottom-colors: ThreeDDarkShadow transparent !important;
-moz-border-left-colors: ThreeDDarkShadow transparent !important;
background-color: ThreeDShadow !important;
color: ThreeDHighlight !important;
}
treecol[insertafter="true"] {
-moz-border-right-colors: ThreeDDarkShadow ThreeDShadow;
}
treecol[insertbefore="true"] {
-moz-border-left-colors: ThreeDDarkShadow ThreeDShadow;
}
treechildren:-moz-tree-column(insertbefore) {
border-left: 1px solid ThreeDShadow;
}
treechildren:-moz-tree-column(insertafter) {
border-right: 1px solid ThreeDShadow;
}
/* ::::: sort direction indicator ::::: */
.treecol-sortdirection {
list-style-image: none;
}
.treecol-sortdirection[sortDirection="ascending"] {
list-style-image: url("chrome://global/skin/tree/sort-asc.gif");
}
.treecol-sortdirection[sortDirection="descending"] {
list-style-image: url("chrome://global/skin/tree/sort-dsc.gif");
}
/* ::::: column picker ::::: */
.tree-columnpicker-icon {
list-style-image: url("chrome://global/skin/tree/columnpicker.gif");
}
/* ::::: twisty ::::: */
treechildren:-moz-tree-twisty {
padding-right: 2px;
width: 10px; /* The image's width is 9 pixels */
list-style-image: url("chrome://global/skin/tree/twisty-clsd.gif");
}
treechildren:-moz-tree-twisty(open) {
width: 10px; /* The image's width is 9 pixels */
list-style-image: url("chrome://global/skin/tree/twisty-open.gif");
}
treechildren:-moz-tree-indentation {
width: 16px;
}
/* ::::: gridline style ::::: */
treechildren.gridlines:-moz-tree-cell {
border-right: 1px solid GrayText;
border-bottom: 1px solid GrayText;
}
treechildren.gridlines:-moz-tree-row {
border: none;
}

Просмотреть файл

@ -0,0 +1,25 @@
#
# 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.org code.
#
# Contributor(s):
#
DEPTH = ../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk

Просмотреть файл

@ -0,0 +1,522 @@
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* 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.
*
* Original Author:
* Paul Hangas <hangas@netscape.com>
*
* Contributor(s):
* Alec Flett <alecf@netscape.com>
* Seth Spitzer <sspitzer@netscape.com>
*/
//NOTE: gAddressBookBundle must be defined and set or this Overlay won't work
var gPrefs = Components.classes["@mozilla.org/preferences-service;1"];
gPrefs = gPrefs.getService();
gPrefs = gPrefs.QueryInterface(Components.interfaces.nsIPrefBranch);
var gProfileDirURL;
var gMapItURLFormat = gPrefs.getComplexValue("mail.addr_book.mapit_url.format",
Components.interfaces.nsIPrefLocalizedString).data;
var gAddrbookSession = Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession);
var gIOService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
var gFileHandler = gIOService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
var zListName;
var zPrimaryEmail;
var zSecondaryEmail;
var zScreenName;
var zNickname;
var zDisplayName;
var zWork;
var zHome;
var zFax;
var zCellular;
var zPager;
var zCustom1;
var zCustom2;
var zCustom3;
var zCustom4;
var cvData;
function OnLoadCardView()
{
zPrimaryEmail = gAddressBookBundle.getString("propertyPrimaryEmail");
zSecondaryEmail = gAddressBookBundle.getString("propertySecondaryEmail");
zScreenName = gAddressBookBundle.getString("propertyScreenName");
zNickname = gAddressBookBundle.getString("propertyNickname");
zDisplayName = gAddressBookBundle.getString("propertyDisplayName");
zListName = gAddressBookBundle.getString("propertyListName");
zWork = gAddressBookBundle.getString("propertyWork");
zHome = gAddressBookBundle.getString("propertyHome");
zFax = gAddressBookBundle.getString("propertyFax");
zCellular = gAddressBookBundle.getString("propertyCellular");
zPager = gAddressBookBundle.getString("propertyPager");
zCustom1 = gAddressBookBundle.getString("propertyCustom1");
zCustom2 = gAddressBookBundle.getString("propertyCustom2");
zCustom3 = gAddressBookBundle.getString("propertyCustom3");
zCustom4 = gAddressBookBundle.getString("propertyCustom4");
var doc = document;
/* data for address book, prefixes: "cvb" = card view box
"cvh" = crad view header
"cv" = card view (normal fields) */
cvData = new Object;
// Card View Box
cvData.CardViewBox = doc.getElementById("CardViewInnerBox");
// Title
cvData.CardTitle = doc.getElementById("CardTitle");
// Name section
cvData.cvbContact = doc.getElementById("cvbContact");
cvData.cvhContact = doc.getElementById("cvhContact");
cvData.cvNickname = doc.getElementById("cvNickname");
cvData.cvDisplayName = doc.getElementById("cvDisplayName");
cvData.cvEmail1Box = doc.getElementById("cvEmail1Box");
cvData.cvEmail1 = doc.getElementById("cvEmail1");
cvData.cvScreennameBox = doc.getElementById("cvScreennameBox");
cvData.cvAimPresence = doc.getElementById("cvAimPresence");
cvData.cvScreenname = doc.getElementById("cvScreenname");
cvData.cvBuddyIcon = doc.getElementById("cvBuddyIcon");
cvData.cvListNameBox = doc.getElementById("cvListNameBox");
cvData.cvListName = doc.getElementById("cvListName");
cvData.cvEmail2Box = doc.getElementById("cvEmail2Box");
cvData.cvEmail2 = doc.getElementById("cvEmail2");
// Home section
cvData.cvbHome = doc.getElementById("cvbHome");
cvData.cvhHome = doc.getElementById("cvhHome");
cvData.cvHomeAddress = doc.getElementById("cvHomeAddress");
cvData.cvHomeAddress2 = doc.getElementById("cvHomeAddress2");
cvData.cvHomeCityStZip = doc.getElementById("cvHomeCityStZip");
cvData.cvHomeCountry = doc.getElementById("cvHomeCountry");
cvData.cvbHomeMapItBox = doc.getElementById("cvbHomeMapItBox");
cvData.cvHomeMapIt = doc.getElementById("cvHomeMapIt");
cvData.cvHomeWebPageBox = doc.getElementById("cvHomeWebPageBox");
cvData.cvHomeWebPage = doc.getElementById("cvHomeWebPage");
// Other section
cvData.cvbOther = doc.getElementById("cvbOther");
cvData.cvhOther = doc.getElementById("cvhOther");
cvData.cvCustom1 = doc.getElementById("cvCustom1");
cvData.cvCustom2 = doc.getElementById("cvCustom2");
cvData.cvCustom3 = doc.getElementById("cvCustom3");
cvData.cvCustom4 = doc.getElementById("cvCustom4");
cvData.cvNotes = doc.getElementById("cvNotes");
// Description section (mailing lists only)
cvData.cvbDescription = doc.getElementById("cvbDescription");
cvData.cvhDescription = doc.getElementById("cvhDescription");
cvData.cvDescription = doc.getElementById("cvDescription");
// Addresses section (mailing lists only)
cvData.cvbAddresses = doc.getElementById("cvbAddresses");
cvData.cvhAddresses = doc.getElementById("cvhAddresses");
cvData.cvAddresses = doc.getElementById("cvAddresses");
// Phone section
cvData.cvbPhone = doc.getElementById("cvbPhone");
cvData.cvhPhone = doc.getElementById("cvhPhone");
cvData.cvPhWork = doc.getElementById("cvPhWork");
cvData.cvPhHome = doc.getElementById("cvPhHome");
cvData.cvPhFax = doc.getElementById("cvPhFax");
cvData.cvPhCellular = doc.getElementById("cvPhCellular");
cvData.cvPhPager = doc.getElementById("cvPhPager");
// Work section
cvData.cvbWork = doc.getElementById("cvbWork");
cvData.cvhWork = doc.getElementById("cvhWork");
cvData.cvJobTitle = doc.getElementById("cvJobTitle");
cvData.cvDepartment = doc.getElementById("cvDepartment");
cvData.cvCompany = doc.getElementById("cvCompany");
cvData.cvWorkAddress = doc.getElementById("cvWorkAddress");
cvData.cvWorkAddress2 = doc.getElementById("cvWorkAddress2");
cvData.cvWorkCityStZip = doc.getElementById("cvWorkCityStZip");
cvData.cvWorkCountry = doc.getElementById("cvWorkCountry");
cvData.cvbWorkMapItBox = doc.getElementById("cvbWorkMapItBox");
cvData.cvWorkMapIt = doc.getElementById("cvWorkMapIt");
cvData.cvWorkWebPageBox = doc.getElementById("cvWorkWebPageBox");
cvData.cvWorkWebPage = doc.getElementById("cvWorkWebPage");
}
// XXX todo
// some similar code (in spirit) already exists, see OnLoadEditList()
// perhaps we could combine and put in abCommon.js?
function GetAddressesFromURI(uri)
{
var addresses = "";
var editList = GetDirectoryFromURI(uri);
var addressList = editList.addressLists;
if (addressList) {
var total = addressList.Count();
if (total > 0)
addresses = addressList.GetElementAt(0).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
for (var i = 1; i < total; i++ ) {
addresses += ", " + addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
}
}
return addresses;
}
function GoIM()
{
LaunchUrl(top.cvData.cvAimPresence.getAttribute("url"));
}
function DisplayCardViewPane(card)
{
var generatedName = gAddrbookSession.generateNameFromCard(card, gPrefs.getIntPref("mail.addr_book.lastnamefirst"));
var data = top.cvData;
var visible;
var titleString;
if (generatedName == "")
titleString = card.primaryEmail; // if no generatedName, use email
else
titleString = generatedName;
// set fields in card view pane
if (card.isMailList)
cvSetNode(data.CardTitle, gAddressBookBundle.getFormattedString("viewListTitle", [generatedName]));
else
cvSetNode(data.CardTitle, gAddressBookBundle.getFormattedString("viewCardTitle", [titleString]));
// Contact section
cvSetNodeWithLabel(data.cvNickname, zNickname, card.nickName);
if (card.isMailList) {
// email1, display name and screenname always hidden when a mailing list.
cvSetVisible(data.cvDisplayName, false);
cvSetVisible(data.cvEmail1Box, false);
cvSetVisible(data.cvScreennameBox, false);
visible = HandleLink(data.cvListName, zListName, card.displayName, data.cvListNameBox, "mailto:" + escape(GenerateAddressFromCard(card))) || visible;
}
else {
// listname always hidden if not a mailing list
cvSetVisible(data.cvListNameBox, false);
cvSetNodeWithLabel(data.cvDisplayName, zDisplayName, card.displayName);
visible = HandleLink(data.cvEmail1, zPrimaryEmail, card.primaryEmail, data.cvEmail1Box, "mailto:" + card.primaryEmail) || visible;
}
var goimURL = "aim:goim?screenname=" + card.aimScreenName;
var hasScreenName = HandleLink(data.cvScreenname, zScreenName, card.aimScreenName, data.cvScreennameBox, goimURL);
if (!hasScreenName || gIOService.offline) {
data.cvAimPresence.removeAttribute("src");
data.cvAimPresence.removeAttribute("url");
data.cvAimPresence.setAttribute("width","0");
}
else {
data.cvAimPresence.setAttribute("src","http://big.oscar.aol.com:80/" + card.aimScreenName + "?on_url=http://ncmail.netscape.com/include/nc/images/online.gif&off_url=http://ncmail.netscape.com/include/nc/images/offline.gif");
data.cvAimPresence.setAttribute("url", goimURL);
data.cvAimPresence.setAttribute("width","16");
}
visible = hasScreenName || visible;
visible = HandleLink(data.cvEmail2, zSecondaryEmail, card.secondEmail, data.cvEmail2Box, "mailto:" + card.secondEmail) || visible;
// Home section
visible = cvSetNode(data.cvHomeAddress, card.homeAddress);
visible = cvSetNode(data.cvHomeAddress2, card.homeAddress2) || visible;
visible = cvSetCityStateZip(data.cvHomeCityStZip, card.homeCity, card.homeState, card.homeZipCode) || visible;
visible = cvSetNode(data.cvHomeCountry, card.homeCountry) || visible;
if (visible) {
var homeMapItUrl = CreateMapItURL(card.homeAddress, card.homeAddress2, card.homeCity, card.homeState, card.homeZipCode, card.homeCountry);
if (homeMapItUrl) {
cvSetVisible(data.cvbHomeMapItBox, true);
data.cvHomeMapIt.setAttribute('url', homeMapItUrl);
}
else {
cvSetVisible(data.cvbHomeMapItBox, false);
}
}
else {
cvSetVisible(data.cvbHomeMapItBox, false);
}
visible = HandleLink(data.cvHomeWebPage, "", card.webPage2, data.cvHomeWebPageBox, card.webPage2) || visible;
cvSetVisible(data.cvhHome, visible);
cvSetVisible(data.cvbHome, visible);
if (card.isMailList) {
// Description section
visible = cvSetNode(data.cvDescription, card.notes)
cvSetVisible(data.cvbDescription, visible);
// Addresses section
visible = cvAddAddressNodes(data.cvAddresses, card.mailListURI);
cvSetVisible(data.cvbAddresses, visible);
// Other section, not shown for mailing lists.
cvSetVisible(data.cvbOther, false);
}
else {
// Other section
visible = cvSetNodeWithLabel(data.cvCustom1, zCustom1, card.custom1);
visible = cvSetNodeWithLabel(data.cvCustom2, zCustom2, card.custom2) || visible;
visible = cvSetNodeWithLabel(data.cvCustom3, zCustom3, card.custom3) || visible;
visible = cvSetNodeWithLabel(data.cvCustom4, zCustom4, card.custom4) || visible;
visible = cvSetNode(data.cvNotes, card.notes) || visible;
visible = setBuddyIcon(card, data.cvBuddyIcon) || visible;
cvSetVisible(data.cvhOther, visible);
cvSetVisible(data.cvbOther, visible);
// hide description section, not show for non-mailing lists
cvSetVisible(data.cvbDescription, false);
// hide addresses section, not show for non-mailing lists
cvSetVisible(data.cvbAddresses, false);
}
// Phone section
visible = cvSetNodeWithLabel(data.cvPhWork, zWork, card.workPhone);
visible = cvSetNodeWithLabel(data.cvPhHome, zHome, card.homePhone) || visible;
visible = cvSetNodeWithLabel(data.cvPhFax, zFax, card.faxNumber) || visible;
visible = cvSetNodeWithLabel(data.cvPhCellular, zCellular, card.cellularNumber) || visible;
visible = cvSetNodeWithLabel(data.cvPhPager, zPager, card.pagerNumber) || visible;
cvSetVisible(data.cvhPhone, visible);
cvSetVisible(data.cvbPhone, visible);
// Work section
visible = cvSetNode(data.cvJobTitle, card.jobTitle);
visible = cvSetNode(data.cvDepartment, card.department) || visible;
visible = cvSetNode(data.cvCompany, card.company) || visible;
var addressVisible = cvSetNode(data.cvWorkAddress, card.workAddress);
addressVisible = cvSetNode(data.cvWorkAddress2, card.workAddress2) || addressVisible;
addressVisible = cvSetCityStateZip(data.cvWorkCityStZip, card.workCity, card.workState, card.workZipCode) || addressVisible;
addressVisible = cvSetNode(data.cvWorkCountry, card.workCountry) || addressVisible;
if (addressVisible) {
var workMapItUrl = CreateMapItURL(card.workAddress, card.workAddress2, card.workCity, card.workState, card.workZipCode, card.workCountry);
data.cvWorkMapIt.setAttribute('url', workMapItUrl);
if (workMapItUrl) {
cvSetVisible(data.cvbWorkMapItBox, true);
data.cvWorkMapIt.setAttribute('url', workMapItUrl);
}
else {
cvSetVisible(data.cvbWorkMapItBox, false);
}
}
else {
cvSetVisible(data.cvbWorkMapItBox, false);
}
visible = HandleLink(data.cvWorkWebPage, "", card.webPage1, data.cvWorkWebPageBox, card.webPage1) || addressVisible || visible;
cvSetVisible(data.cvhWork, visible);
cvSetVisible(data.cvbWork, visible);
// make the card view box visible
cvSetVisible(top.cvData.CardViewBox, true);
}
function setBuddyIcon(card, buddyIcon)
{
try {
var myScreenName = gPrefs.getCharPref("aim.session.screenname");
if (myScreenName && card.primaryEmail) {
if (!gProfileDirURL) {
// lazily create these file urls, and keep them around
var profile = Components.classes["@mozilla.org/profile/manager;1"].getService(Components.interfaces.nsIProfileInternal);
gProfileDirURL = gIOService.newFileURI(profile.getProfileDir(profile.currentProfile));
}
// if we did have a buddy icon on disk for this screenname, this would be the file url spec for it
var iconURLStr = gProfileDirURL.spec + "/NIM/" + myScreenName + "/picture/" + card.aimScreenName + ".gif";
// check if the file exists
var file = gFileHandler.getFileFromURLSpec(iconURLStr);
// check if the file exists
// is this a perf hit? (how expensive is stat()?)
if (file.exists()) {
buddyIcon.setAttribute("src", iconURLStr);
return true;
}
}
}
catch (ex) {
// can get here if no screenname
}
buddyIcon.setAttribute("src", "");
return false;
}
function ClearCardViewPane()
{
cvSetVisible(top.cvData.CardViewBox, false);
}
function cvSetNodeWithLabel(node, label, text)
{
if (text) {
if (label)
return cvSetNode(node, label + ": " + text);
else
return cvSetNode(node, text);
}
else
return cvSetNode(node, "");
}
function cvSetCityStateZip(node, city, state, zip)
{
var text = "";
if ( city )
{
text = city;
if ( state || zip )
text += ", ";
}
if ( state )
text += state + " ";
if ( zip )
text += zip;
return cvSetNode(node, text);
}
function cvSetNode(node, text)
{
if ( node )
{
if ( node.childNodes.length == 0 )
{
var textNode = document.createTextNode(text);
node.appendChild(textNode);
}
else if ( node.childNodes.length == 1 )
node.childNodes[0].nodeValue = text;
var visible;
if ( text )
visible = true;
else
visible = false;
cvSetVisible(node, visible);
}
return visible;
}
function cvAddAddressNodes(node, uri)
{
var visible = false;
if ( node )
{
var displayName = "";
var address = "";
var editList = GetDirectoryFromURI(uri);
var addressList = editList.addressLists;
if (addressList) {
var total = addressList.Count();
if (total > 0) {
for (var i = node.childNodes.length - 1; i >= 0; i--) {
node.removeChild(node.childNodes[i]);
}
for (i = 0; i < total; i++ ) {
var descNode = document.createElement("description");
address = addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
displayName = addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).displayName;
descNode.setAttribute("class", "CardViewLink");
node.appendChild(descNode);
var linkNode = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
linkNode.setAttribute("id", "addr#" + i);
linkNode.setAttribute("href", "mailto:" + address);
descNode.appendChild(linkNode);
var textNode = document.createTextNode(displayName + " <" + address + ">");
linkNode.appendChild(textNode);
}
visible = true;
}
}
cvSetVisible(node, visible);
}
return visible;
}
function cvSetVisible(node, visible)
{
if ( visible )
node.removeAttribute("collapsed");
else
node.setAttribute("collapsed", "true");
}
function HandleLink(node, label, value, box, link)
{
var visible = cvSetNodeWithLabel(node, label, value);
if (visible)
node.setAttribute('href', link);
cvSetVisible(box, visible);
return visible;
}
function MapIt(id)
{
var button = document.getElementById(id);
try {
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance();
messenger = messenger.QueryInterface(Components.interfaces.nsIMessenger);
messenger.loadURL(window, button.getAttribute('url'));
} catch (ex) {}
}
function CreateMapItURL(address1, address2, city, state, zip, country)
{
if (!gMapItURLFormat)
return null;
var urlFormat = gMapItURLFormat.replace("@A1", escape(address1));
urlFormat = urlFormat.replace("@A2", escape(address2));
urlFormat = urlFormat.replace("@CO", escape(country));
urlFormat = urlFormat.replace("@CI", escape(city));
urlFormat = urlFormat.replace("@ST", escape(state));
urlFormat = urlFormat.replace("@ZI", escape(zip));
return urlFormat;
}
// XXX merge with the code in Map It
function openLink(id)
{
try {
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance();
messenger = messenger.QueryInterface(Components.interfaces.nsIMessenger);
messenger.loadURL(window, document.getElementById(id).getAttribute("href"));
} catch (ex) {}
// return false, so we don't load the href in the addressbook window
return false;
}

Просмотреть файл

@ -0,0 +1,834 @@
/* ***** 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.
*
* The Original Code is Mozilla Addressbook.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corp.
* Portions created by the Initial Developer are Copyright (C) 1999-2001
* the Initial Developer. All Rights Reserved.
*
* Original Author:
* Paul Hangas <hangas@netscape.com>
*
* Contributor(s):
* Seth Spitzer <sspitzer@netscape.com>
*
* 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 ***** */
var cvPrefs = 0;
var addressbook = 0;
var gAddressBookBundle;
var gSearchTimer = null;
var gStatusText = null;
var gQueryURIFormat = null;
var gSearchInput;
var gPrintSettings = null;
var gDirTree;
var gSearchBox;
var gCardViewBox;
var gCardViewBoxEmail1;
// Constants that correspond to choices
// in Address Book->View -->Show Name as
const kDisplayName = 0;
const kLastNameFirst = 1;
const kFirstNameFirst = 2;
const kLDAPDirectory = 0; // defined in nsDirPrefs.h
const kPABDirectory = 2; // defined in nsDirPrefs.h
var gAddressBookAbListener = {
onItemAdded: function(parentDir, item) {
// will not be called
},
onItemRemoved: function(parentDir, item) {
// will only be called when an addressbook is deleted
try {
var directory = item.QueryInterface(Components.interfaces.nsIAbDirectory);
// check if the item being removed is the directory
// that we are showing in the addressbook
// if so, select the personal addressbook (it can't be removed)
if (directory && directory == GetAbView().directory) {
SelectFirstAddressBook();
}
}
catch (ex) {
}
},
onItemPropertyChanged: function(item, property, oldValue, newValue) {
// will not be called
}
};
function OnUnloadAddressBook()
{
var addrbookSession = Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession);
addrbookSession.removeAddressBookListener(gAddressBookAbListener);
RemovePrefObservers();
CloseAbView();
}
var gAddressBookAbViewListener = {
onSelectionChanged: function() {
ResultsPaneSelectionChanged();
},
onCountChanged: function(total) {
SetStatusText(total);
}
};
function GetAbViewListener()
{
return gAddressBookAbViewListener;
}
const kPrefMailAddrBookLastNameFirst = "mail.addr_book.lastnamefirst";
var gMailAddrBookLastNameFirstObserver = {
observe: function(subject, topic, value) {
if (topic == "nsPref:changed" && value == kPrefMailAddrBookLastNameFirst) {
UpdateCardView();
}
}
}
function AddPrefObservers()
{
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
var prefBranch = prefService.getBranch(null).QueryInterface(Components.interfaces.nsIPrefBranchInternal);
prefBranch.addObserver(kPrefMailAddrBookLastNameFirst, gMailAddrBookLastNameFirstObserver, false);
}
function RemovePrefObservers()
{
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
var prefBranch = prefService.getBranch(null).QueryInterface(Components.interfaces.nsIPrefBranchInternal);
prefBranch.removeObserver(kPrefMailAddrBookLastNameFirst, gMailAddrBookLastNameFirstObserver);
}
// we won't show the window until the onload() handler is finished
// so we do this trick (suggested by hyatt / blaker)
function OnLoadAddressBook()
{
setTimeout(delayedOnLoadAddressBook, 0); // when debugging, set this to 5000, so you can see what happens after the window comes up.
}
function delayedOnLoadAddressBook()
{
gAddressBookBundle = document.getElementById("bundle_addressBook");
gSearchInput = document.getElementById("searchInput");
verifyAccounts(null); // this will do migration, if we need to.
top.addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
InitCommonJS();
UpgradeAddressBookResultsPaneUI("mailnews.ui.addressbook_results.version");
GetCurrentPrefs();
AddPrefObservers();
// FIX ME - later we will be able to use onload from the overlay
OnLoadCardView();
SetupAbCommandUpdateHandlers();
//workaround - add setTimeout to make sure dynamic overlays get loaded first
setTimeout('OnLoadDirTree()', 0);
// if the pref is locked disable the menuitem New->LDAP directory
if (gPrefs.prefIsLocked("ldap_2.disable_button_add"))
document.getElementById("addLDAP").setAttribute("disabled", "true");
// add a listener, so we can switch directories if
// the current directory is deleted
var addrbookSession = Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession);
// this listener only cares when a directory is removed
addrbookSession.addAddressBookListener(gAddressBookAbListener, Components.interfaces.nsIAbListener.directoryRemoved);
// initialize the customizeDone method on the customizeable toolbar
var toolbox = document.getElementById("ab-toolbox");
toolbox.customizeDone = MailToolboxCustomizeDone;
var toolbarset = document.getElementById('customToolbars');
toolbox.toolbarset = toolbarset;
}
function OnLoadDirTree() {
var treeBuilder = dirTree.builder.QueryInterface(Components.interfaces.nsIXULTreeBuilder);
treeBuilder.addObserver(abDirTreeObserver);
SelectFirstAddressBook();
}
function GetCurrentPrefs()
{
// prefs
if ( cvPrefs == 0 )
cvPrefs = new Object;
cvPrefs.prefs = gPrefs;
// check "Show Name As" menu item based on pref
var menuitemID;
switch (gPrefs.getIntPref("mail.addr_book.lastnamefirst"))
{
case kFirstNameFirst:
menuitemID = 'firstLastCmd';
break;
case kLastNameFirst:
menuitemID = 'lastFirstCmd';
break;
case kDisplayName:
default:
menuitemID = 'displayNameCmd';
break;
}
var menuitem = top.document.getElementById(menuitemID);
if ( menuitem )
menuitem.setAttribute('checked', 'true');
// initialize phonetic
var showPhoneticFields =
gPrefs.getComplexValue("mail.addr_book.show_phonetic_fields",
Components.interfaces.nsIPrefLocalizedString).data;
// show phonetic fields if indicated by the pref
if (showPhoneticFields == "true")
document.getElementById("cmd_SortBy_PhoneticName")
.setAttribute("hidden", "false");
}
function SetNameColumn(cmd)
{
var prefValue;
switch ( cmd )
{
case 'firstLastCmd':
prefValue = kFirstNameFirst;
break;
case 'lastFirstCmd':
prefValue = kLastNameFirst;
break;
case 'displayNameCmd':
prefValue = kDisplayName;
break;
}
cvPrefs.prefs.setIntPref("mail.addr_book.lastnamefirst", prefValue);
}
function CommandUpdate_AddressBook()
{
goUpdateCommand('button_delete');
}
function ResultsPaneSelectionChanged()
{
UpdateCardView();
}
function UpdateCardView()
{
var cards = GetSelectedAbCards();
// display the selected card, if exactly one card is selected.
// either no cards, or more than one card is selected, clear the pane.
if (cards.length == 1)
OnClickedCard(cards[0])
else
ClearCardViewPane();
}
function OnClickedCard(card)
{
if (card)
DisplayCardViewPane(card);
else
ClearCardViewPane();
}
function AbClose()
{
top.close();
}
function AbNewLDAPDirectory()
{
window.openDialog("chrome://messenger/content/addressbook/pref-directory-add.xul",
"",
"chrome,modal=yes,resizable=no,centerscreen",
null);
}
function AbNewAddressBook()
{
var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
getService(Components.interfaces.nsIStringBundleService);
var bundle = strBundleService.createBundle("chrome://messenger/locale/addressbook/addressBook.properties");
var dialogTitle = bundle.GetStringFromName('newAddressBookTitle');
var dialog = window.openDialog(
"chrome://messenger/content/addressbook/abAddressBookNameDialog.xul",
"", "chrome,modal=yes,resizable=no,centerscreen", {title: dialogTitle, okCallback:AbOnCreateNewAddressBook});
}
function AbRenameAddressBook()
{
var selectedABURI = GetSelectedDirectory();
// the rdf service
var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
// the RDF resource URI for LDAPDirectory will be like: "moz-abmdbdirectory://abook-3.mab"
var selectedABDirectory = RDF.GetResource(selectedABURI).QueryInterface(Components.interfaces.nsIAbDirectory);
var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
getService(Components.interfaces.nsIStringBundleService);
var bundle = strBundleService.createBundle("chrome://messenger/locale/addressbook/addressBook.properties");
var dialogTitle = bundle.GetStringFromName('renameAddressBookTitle');
// you can't rename the PAB or the CAB
var canRename = (selectedABURI != kCollectedAddressbookURI && selectedABURI != kPersonalAddressbookURI);
var dialog = window.openDialog(
"chrome://messenger/content/addressbook/abAddressBookNameDialog.xul",
"", "chrome,modal=yes,resizable=no,centerscreen", {title: dialogTitle, canRename: canRename, name: selectedABDirectory.directoryProperties.description,
okCallback:AbOnRenameAddressBook});
}
function AbOnCreateNewAddressBook(aName)
{
var properties = Components.classes["@mozilla.org/addressbook/properties;1"].createInstance(Components.interfaces.nsIAbDirectoryProperties);
properties.description = aName;
properties.dirType = kPABDirectory;
top.addressbook.newAddressBook(properties);
}
function AbOnRenameAddressBook(aName)
{
// When the UI code for renaming addrbooks (bug #17230) is ready, just
// change 'properties.description' setting below and it should just work.
// get select ab
var selectedABURI = GetSelectedDirectory();
//dump("In AbRenameAddressBook() selectedABURI=" + selectedABURI + "\n");
// the rdf service
var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
// get the datasource for the addressdirectory
var addressbookDS = RDF.GetDataSource("rdf:addressdirectory");
// moz-abdirectory:// is the RDF root to get all types of addressbooks.
var parentDir = RDF.GetResource("moz-abdirectory://").QueryInterface(Components.interfaces.nsIAbDirectory);
// the RDF resource URI for LDAPDirectory will be like: "moz-abmdbdirectory://abook-3.mab"
var selectedABDirectory = RDF.GetResource(selectedABURI).QueryInterface(Components.interfaces.nsIAbDirectory);
// Copy existing dir type category id and mod time so they won't get reset.
var oldProperties = selectedABDirectory.directoryProperties;
// Create and fill in properties info
var properties = Components.classes["@mozilla.org/addressbook/properties;1"].createInstance(Components.interfaces.nsIAbDirectoryProperties);
properties.URI = selectedABURI;
properties.dirType = oldProperties.dirType;
properties.categoryId = oldProperties.categoryId;
properties.syncTimeStamp = oldProperties.syncTimeStamp;
properties.description = aName;
// Now do the modification.
addressbook.modifyAddressBook(addressbookDS, parentDir, selectedABDirectory, properties);
}
function GetPrintSettings()
{
var prevPS = gPrintSettings;
try {
if (gPrintSettings == null) {
var useGlobalPrintSettings = true;
var pref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
if (pref) {
useGlobalPrintSettings = pref.getBoolPref("print.use_global_printsettings", false);
}
// I would rather be using nsIWebBrowserPrint API
// but I really don't have a document at this point
var printSettingsService = Components.classes["@mozilla.org/gfx/printsettings-service;1"]
.getService(Components.interfaces.nsIPrintSettingsService);
if (useGlobalPrintSettings) {
gPrintSettings = printSettingsService.globalPrintSettings;
} else {
gPrintSettings = printSettingsService.CreatePrintSettings();
}
}
} catch (e) {
dump("GetPrintSettings "+e);
}
return gPrintSettings;
}
function AbPrintCardInternal(doPrintPreview, msgType)
{
var selectedItems = GetSelectedAbCards();
var numSelected = selectedItems.length;
if (!numSelected)
return;
var addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
var uri = GetSelectedDirectory();
if (!uri)
return;
var statusFeedback;
statusFeedback = Components.classes["@mozilla.org/messenger/statusfeedback;1"].createInstance();
statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback);
var selectionArray = new Array(numSelected);
var totalCard = 0;
for(var i = 0; i < numSelected; i++)
{
var card = selectedItems[i];
var printCardUrl = CreatePrintCardUrl(card);
if (printCardUrl)
{
selectionArray[totalCard++] = printCardUrl;
}
}
if (!gPrintSettings) {
gPrintSettings = GetPrintSettings();
}
printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
"",
"chrome,dialog=no,all",
totalCard, selectionArray, statusFeedback,
gPrintSettings, doPrintPreview, msgType);
return;
}
function AbPrintCard()
{
AbPrintCardInternal(false, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINT_AB_CARD);
}
function AbPrintPreviewCard()
{
AbPrintCardInternal(true, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINTPREVIEW_AB_CARD);
}
function CreatePrintCardUrl(card)
{
var url = "data:text/xml;base64," + card.convertToBase64EncodedXML();
return url;
}
function AbPrintAddressBookInternal(doPrintPreview, msgType)
{
var addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
var uri = GetSelectedDirectory();
if (!uri)
return;
var statusFeedback;
statusFeedback = Components.classes["@mozilla.org/messenger/statusfeedback;1"].createInstance();
statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback);
/*
turn "moz-abmdbdirectory://abook.mab" into
"addbook://moz-abmdbdirectory/abook.mab?action=print"
*/
var abURIArr = uri.split("://");
var printUrl = "addbook://" + abURIArr[0] + "/" + abURIArr[1] + "?action=print"
if (!gPrintSettings) {
gPrintSettings = GetPrintSettings();
}
printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
"",
"chrome,dialog=no,all",
1, [printUrl], statusFeedback, gPrintSettings, doPrintPreview, msgType);
return;
}
function AbPrintAddressBook()
{
AbPrintAddressBookInternal(false, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINT_ADDRBOOK);
}
function AbPrintPreviewAddressBook()
{
AbPrintAddressBookInternal(true, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINTPREVIEW_ADDRBOOK);
}
function AbExport()
{
try {
var selectedABURI = GetSelectedDirectory();
if (!selectedABURI) return;
var directory = GetDirectoryFromURI(selectedABURI);
addressbook.exportAddressBook(directory);
}
catch (ex) {
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
if (promptService) {
var message;
switch (ex.result) {
case Components.results.NS_ERROR_FILE_ACCESS_DENIED:
message = gAddressBookBundle.getString("failedToExportMessageFileAccessDenied");
break;
case Components.results.NS_ERROR_FILE_NO_DEVICE_SPACE:
message = gAddressBookBundle.getString("failedToExportMessageNoDeviceSpace");
break;
default:
message = ex.message;
break;
}
promptService.alert(window,
gAddressBookBundle.getString("failedToExportTitle"),
message);
}
}
}
function AbDeleteDirectory()
{
var selectedABURI = GetSelectedDirectory();
if (!selectedABURI) return;
var isPersonalOrCollectedAbsSelectedForDeletion = false;
var parentArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
if (!parentArray)
return;
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
// check to see if personal or collected address books is selected for deletion.
// if yes, prompt the user an appropriate message saying these cannot be deleted
if ((selectedABURI != kCollectedAddressbookURI) &&
(selectedABURI != kPersonalAddressbookURI)) {
var parentRow = GetParentRow(dirTree, dirTree.currentIndex);
var parentId;
if (parentRow == -1)
parentId = "moz-abdirectory://";
else
parentId = dirTree.builderView.getResourceAtIndex(parentRow).Value;
var parentDir = GetDirectoryFromURI(parentId);
parentArray.AppendElement(parentDir);
}
else {
promptService.alert(window,
gAddressBookBundle.getString("cannotDeleteTitle"),
gAddressBookBundle.getString("cannotDeleteMessage"));
return;
}
var confirmDeleteMessage;
var directory = GetDirectoryFromURI(selectedABURI);
if (directory.isMailList)
confirmDeleteMessage = gAddressBookBundle.getString("confirmDeleteMailingList");
else
confirmDeleteMessage = gAddressBookBundle.getString("confirmDeleteAddressbook");
if (!promptService.confirm(window, null, confirmDeleteMessage))
return;
var resourceArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
var selectedABResource = GetDirectoryFromURI(selectedABURI).QueryInterface(Components.interfaces.nsIRDFResource);
resourceArray.AppendElement(selectedABResource);
top.addressbook.deleteAddressBooks(dirTree.database, parentArray, resourceArray);
SelectFirstAddressBook();
}
function SetStatusText(total)
{
if (!gStatusText)
gStatusText = document.getElementById('statusText');
try {
var statusText;
if (gSearchInput.value)
statusText = gAddressBookBundle.getFormattedString("matchesFound", [total]);
else
statusText = gAddressBookBundle.getFormattedString("totalCardStatus", [gAbView.directory.dirName, total]);
gStatusText.setAttribute("label", statusText);
}
catch(ex) {
dump("failed to set status text: " + ex + "\n");
}
}
function AbResultsPaneDoubleClick(card)
{
AbEditCard(card);
}
function onAdvancedAbSearch()
{
var selectedABURI = GetSelectedDirectory();
if (!selectedABURI) return;
window.openDialog("chrome://messenger/content/ABSearchDialog.xul", "",
"chrome,resizable,status,centerscreen,dialog=no", {directory: selectedABURI} );
}
function onEnterInSearchBar()
{
ClearCardViewPane();
if (!gQueryURIFormat)
gQueryURIFormat = gPrefs.getComplexValue("mail.addr_book.quicksearchquery.format",
Components.interfaces.nsIPrefLocalizedString).data;
var searchURI = GetSelectedDirectory();
if (!searchURI) return;
var sortColumn = gAbView.sortColumn;
var sortDirection = gAbView.sortDirection;
/*
XXX todo, handle the case where the LDAP url
already has a query, like
moz-abldapdirectory://nsdirectory.netscape.com:389/ou=People,dc=netscape,dc=com?(or(Department,=,Applications))
*/
if (gSearchInput.value != "") {
// replace all instances of @V with the escaped version
// of what the user typed in the quick search text input
searchURI += gQueryURIFormat.replace(/@V/g, escape(gSearchInput.value));
}
SetAbView(searchURI, sortColumn, sortDirection);
// XXX todo
// this works for synchronous searches of local addressbooks,
// but not for LDAP searches
SelectFirstCard();
}
function SwitchPaneFocus(event)
{
var focusedElement = WhichPaneHasFocus();
var cardViewBox = GetCardViewBox();
var cardViewBoxEmail1 = GetCardViewBoxEmail1();
var searchBox = GetSearchBox();
var dirTree = GetDirTree();
var searchInput = GetSearchInput();
if (event && event.shiftKey)
{
if (focusedElement == gAbResultsTree && searchBox.getAttribute('hidden') != 'true')
searchInput.focus();
else if ((focusedElement == gAbResultsTree || focusedElement == searchBox) && !IsDirPaneCollapsed())
dirTree.focus();
else if (focusedElement != cardViewBox && !IsCardViewAndAbResultsPaneSplitterCollapsed())
{
if(cardViewBoxEmail1)
cardViewBoxEmail1.focus();
else
cardViewBox.focus();
}
else
gAbResultsTree.focus();
}
else
{
if (focusedElement == searchBox)
gAbResultsTree.focus();
else if (focusedElement == gAbResultsTree && !IsCardViewAndAbResultsPaneSplitterCollapsed())
{
if(cardViewBoxEmail1)
cardViewBoxEmail1.focus();
else
cardViewBox.focus();
}
else if (focusedElement != dirTree && !IsDirPaneCollapsed())
dirTree.focus();
else if (searchBox.getAttribute('hidden') != 'true')
searchInput.focus();
else
gAbResultsTree.focus();
}
}
function WhichPaneHasFocus()
{
var cardViewBox = GetCardViewBox();
var searchBox = GetSearchBox();
var dirTree = GetDirTree();
var currentNode = top.document.commandDispatcher.focusedElement;
while (currentNode)
{
var nodeId = currentNode.getAttribute('id');
if(currentNode == gAbResultsTree ||
currentNode == cardViewBox ||
currentNode == searchBox ||
currentNode == dirTree)
return currentNode;
currentNode = currentNode.parentNode;
}
return null;
}
function GetDirTree()
{
if (!gDirTree)
gDirTree = document.getElementById('dirTree');
return gDirTree;
}
function GetSearchInput()
{
if (!gSearchInput)
gSearchInput = document.getElementById('searchInput');
return gSearchInput;
}
function GetSearchBox()
{
if (!gSearchBox)
gSearchBox = document.getElementById('searchBox');
return gSearchBox;
}
function GetCardViewBox()
{
if (!gCardViewBox)
gCardViewBox = document.getElementById('CardViewBox');
return gCardViewBox;
}
function GetCardViewBoxEmail1()
{
if (!gCardViewBoxEmail1)
{
try {
gCardViewBoxEmail1 = document.getElementById('cvEmail1');
}
catch (ex) {
gCardViewBoxEmail1 = null;
}
}
return gCardViewBoxEmail1;
}
function IsDirPaneCollapsed()
{
var dirPaneBox = GetDirTree().parentNode;
return dirPaneBox.getAttribute("collapsed") == "true" ||
dirPaneBox.getAttribute("hidden") == "true";
}
function IsCardViewAndAbResultsPaneSplitterCollapsed()
{
var cardViewBox = document.getElementById('CardViewOuterBox');
try {
return (cardViewBox.getAttribute("collapsed") == "true");
}
catch (ex) {
return false;
}
}
function LaunchUrl(url)
{
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(Components.interfaces.nsIMessenger);
messenger.SetWindow(window,null);
messenger.OpenURL(url);
}
function AbIMSelected()
{
var cards = GetSelectedAbCards();
var count = cards.length;
var screennames;
var screennameCount = 0;
for (var i=0;i<count;i++) {
var screenname = cards[i].aimScreenName;
if (screenname) {
if (screennameCount == 0)
screennames = screenname;
else
screennames += "," + screenname;
screennameCount++
}
}
var url = "aim:";
if (screennameCount == 0)
url += "goim";
else if (screennameCount == 1)
url += "goim?screenname=" + screennames;
else {
url += "SendChatInvite?listofscreennames=" + screennames;
url += "&message=" + gAddressBookBundle.getString("joinMeInThisChat");
}
LaunchUrl(url);
}
function loadThrobberUrl(urlPref)
{
var url;
try {
url = gPrefs.getComplexValue(urlPref, Components.interfaces.nsIPrefLocalizedString).data;
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance();
messenger = messenger.QueryInterface(Components.interfaces.nsIMessenger);
messenger.loadURL(window, url);
} catch (ex) {}
}

Просмотреть файл

@ -0,0 +1,397 @@
<?xml version="1.0"?>
<!--
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.
Contributor(s):
Seth Spitzer <sspitzer@netscape.com>
-->
<?xml-stylesheet href="chrome://messenger/skin/addressbook/addressbook.css" type="text/css"?>
<?xml-stylesheet href="chrome://communicator/skin/tasksOverlay.css" type="text/css"?>
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/contentAreaContextOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/addressbook/abDirTreeOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/addressbook/abResultsPaneOverlay.xul"?>
<?xul-overlay href="chrome://messenger/content/addressbook/abCardViewOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/communicatorOverlay.xul"?>
<!DOCTYPE window [
<!ENTITY % abMainWindowDTD SYSTEM "chrome://messenger/locale/addressbook/abMainWindow.dtd" >
%abMainWindowDTD;
<!ENTITY % abResultsPaneOverlayDTD SYSTEM "chrome://messenger/locale/addressbook/abResultsPaneOverlay.dtd" >
%abResultsPaneOverlayDTD;
<!ENTITY % messengerDTD SYSTEM "chrome://messenger/locale/messenger.dtd" >
%messengerDTD;
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
%brandDTD;
]>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
id="addressbookWindow"
height="450"
width="750"
title="&addressbookWindow.title;"
windowtype="mail:addressbook"
persist="width height screenX screenY sizemode"
onload="OnLoadAddressBook()"
onunload="OnUnloadAddressBook()">
<stringbundleset id="stringbundleset">
<stringbundle id="bundle_addressBook" src="chrome://messenger/locale/addressbook/addressBook.properties"/>
<stringbundle id="bundle_messenger" src="chrome://messenger/locale/messenger.properties"/>
<stringbundle id="bundle_brand" src="chrome://global/locale/brand.properties"/>
</stringbundleset>
<script type="application/x-javascript" src="chrome://messenger/content/accountUtils.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/widgetglue.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailCore.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/addressbook/addressbook.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/addressbook/abCommon.js"/>
<script type="application/x-javascript" src="chrome://communicator/content/contentAreaClick.js"/>
<script type="application/x-javascript" src="chrome://communicator/content/printing.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgPrintEngine.js"/>
<commandset id="addressBook">
<commandset id="CommandUpdate_AddressBook"
commandupdater="true"
events="focus,addrbook-select"
oncommandupdate="CommandUpdate_AddressBook()"/>
<commandset id="selectEditMenuItems"/>
<commandset id="undoEditMenuItems"/>
<commandset id="globalEditMenuItems"/>
<command id="cmd_printSetup" oncommand="NSPrintSetup()"/>
<command id="cmd_printCard" oncommand="AbPrintCard()"/>
<command id="cmd_printPreviewCard" oncommand="AbPrintPreviewCard()"/>
<command id="cmd_printAddressBook" oncommand="AbPrintAddressBook()"/>
<command id="cmd_printPreviewAddressBook" oncommand="AbPrintPreviewAddressBook()"/>
<command id="cmd_quit"/>
<command id="cmd_close" oncommand="AbClose()"/>
<command id="cmd_properties" oncommand="goDoCommand('button_edit');"/>
<command id="cmd_undo"/>
<command id="cmd_redo"/>
<command id="cmd_copy"/>
<command id="cmd_paste"/>
<command id="cmd_cut"/>
<command id="cmd_selectAll"/>
<command id="cmd_swapFirstNameLastName" oncommand="AbSwapFirstNameLastName()"/>
</commandset>
<broadcasterset id="abBroadcasters">
<!-- File Menu -->
<!-- Edit Menu -->
<broadcaster id="cmd_delete"
valueAddressBook="&deleteAbCmd.label;"
valueCard="&deleteCardCmd.label;"
valueCards="&deleteCardsCmd.label;"/>
<broadcaster id="broadcaster-throbber" busy="false"/>
<broadcaster id="button_delete" disabled="true"/>
<broadcaster id="Communicator:WorkMode"/>
</broadcasterset>
<keyset id="tasksKeys">
<!-- File Menu -->
<key id="key_printCard" key="&printCardViewCmd.key;" command="cmd_printCard" modifiers="accel"/>
<key id="key_close"/>
<key id="key_quit"/>
<!-- Edit Menu -->
<key id="key_delete"/>
<key id="key_undo"/>
<key id="key_redo"/>
<key id="key_cut"/>
<key id="key_copy"/>
<key id="key_paste"/>
<key id="key_selectAll"/>
<key id="key_properties" key="&propertiesCmd.key;" command="cmd_properties" modifiers="accel"/>
<!-- Tab/F6 Keys -->
<key keycode="VK_TAB" oncommand="SwitchPaneFocus(event);" modifiers="control,shift"/>
<key keycode="VK_TAB" oncommand="SwitchPaneFocus(event);" modifiers="control"/>
<key keycode="VK_F6" oncommand="SwitchPaneFocus(event);" modifiers="control,shift"/>
<key keycode="VK_F6" oncommand="SwitchPaneFocus(event);" modifiers="control"/>
<key keycode="VK_F6" oncommand="SwitchPaneFocus(event);" modifiers="shift"/>
<key keycode="VK_F6" oncommand="SwitchPaneFocus(event);"/>
<key id="key_mail" key="&messengerCmd.commandkey;" oncommand="toMessengerWindow();" modifiers="accel"/>
</keyset>
<toolbox id="ab-toolbox" class="toolbox-top" mode="icons">
<toolbar type="menubar" id="addrbook-toolbar-menubar" class="chromeclass-menubar" customizable="false"
defaultset="menubar-items" mode="icons">
<toolbaritem id="menubar-items" align="center">
<menubar id="mail-menubar" style="border:0px;padding:0px;margin:0px;-moz-appearance:none">
<menu id="menu_File">
<menupopup id="menu_FilePopup">
<menu id="menu_New">
<menupopup id="menu_NewPopup">
<menuitem label="&newCard.label;" accesskey="&newCard.accesskey;" oncommand="AbNewCard('dirTree')"/>
<menuitem label="&newListCmd.label;" accesskey="&newListCmd.accesskey;" oncommand="AbNewList('dirTree')"/>
<menuitem label="&newAddressBookCmd.label;" accesskey="&newAddressBookCmd.accesskey;" oncommand="AbNewAddressBook()"/>
<menuitem label="&newLDAPDirectoryCmd.label;" id="addLDAP" accesskey="&newLDAPDirectoryCmd.accesskey;" oncommand="AbNewLDAPDirectory()"/>
<menuseparator/>
</menupopup>
</menu>
<menuitem id="menu_close"/>
<menuseparator/>
<menuitem id="printSetupMenuItem" label="&printSetupCmd.label;" accesskey="&printSetupCmd.accesskey;" command="cmd_printSetup"/>
<menuitem id="printPreviewMenuItem" label="&printPreviewCardViewCmd.label;" accesskey="&printPreviewCardViewCmd.accesskey;" command="cmd_printPreviewCard"/>
<menuitem id="printPreviewAddressBook" label="&printPreviewAddressBook.label;" accesskey="&printPreviewAddressBook.accesskey;" command="cmd_printPreviewAddressBook"/>
<menuitem id="printMenuItem" label="&printCardViewCmd.label;" accesskey="&printCardViewCmd.accesskey;" key="key_printCard" command="cmd_printCard"/>
<menuitem id="printAddressBook" label="&printAddressBook.label;" accesskey="&printAddressBook.accesskey;" command="cmd_printAddressBook"/>
</menupopup>
</menu>
<menu id="menu_Edit">
<menupopup>
<menuitem id="menu_undo"/>
<menuitem id="menu_redo"/>
<menuseparator/>
<menuitem id="menu_cut"/>
<menuitem id="menu_copy"/>
<menuitem id="menu_paste"/>
<menuitem id="menu_delete" observes="button_delete"/>
<menuseparator/>
<menuitem id="menu_selectAll"/>
<menuseparator/>
<!-- LOCALIZATION NOTE: set "hideSwapFnLnUI" to false in .dtd to enable the UI -->
<menuitem label="&swapFirstNameLastNameCmd.label;"
accesskey="&swapFirstNameLastNameCmd.accesskey;"
hidden="&hideSwapFnLnUI;"
command="cmd_swapFirstNameLastName"/>
<menuitem label="&propertiesCmd.label;"
accesskey="&propertiesCmd.accesskey;"
key="key_properties"
command="cmd_properties"/>
</menupopup>
</menu>
<menu id="menu_View">
<menupopup id="menu_View_Popup">
<menu id="menu_Toolbars">
<menupopup id="view_toolbars_popup">
<menuitem id="menu_showAbToolbar"
label="&showAbToolbarCmd.label;"
accesskey="&showAbToolbarCmd.accesskey;"
oncommand="onViewToolbarCommand('ab-bar', event);"
checked="true" type="checkbox"/>
<menuitem label="&showSearchToolbarCmd.label;"
accesskey="&showSearchToolbarCmd.accesskey;"
oncommand="goToggleToolbar('searchBox','menu_showSearchToolbar')"
checked="true" type="checkbox"/>
<menuitem id="menu_showTaskbar"
type="checkbox"/>
<menuitem id="menu_showCardPane"
label="&showCardPane.label;"
accesskey="&showCardPane.accesskey;"
oncommand="goToggleSplitter('results-splitter', 'menu_showCardPane')"
checked="true" type="checkbox"/>
<menuseparator/>
<menuitem id="menu_customizeToolbar" oncommand="CustomizeMailToolbar('ab-toolbox');" label="&customizeToolbar.label;" accesskey="&customizeToolbar.accesskey;"/>
</menupopup>
</menu>
<menuseparator/>
<menu label="&menu_ShowNameAs.label;" accesskey="&menu_ShowNameAs.accesskey;">
<menupopup>
<menuitem type="radio" name="shownameas"
id="firstLastCmd"
label="&firstLastCmd.label;"
accesskey="&firstLastCmd.accesskey;"
oncommand="SetNameColumn('firstLastCmd')"/>
<menuitem type="radio" name="shownameas"
id="lastFirstCmd"
label="&lastFirstCmd.label;"
accesskey="&lastFirstCmd.accesskey;"
oncommand="SetNameColumn('lastFirstCmd')"/>
<menuitem type="radio" name="shownameas"
id="displayNameCmd"
label="&displayNameCmd.label;"
accesskey="&displayNameCmd.accesskey;"
oncommand="SetNameColumn('displayNameCmd')"/>
</menupopup>
</menu>
<menu label="&sortMenu.label;" accesskey="&sortMenu.accesskey;">
<menupopup id="sortMenuPopup" onpopupshowing="InitViewSortByMenu()">
<menuitem label="&GeneratedName.label;"
id="cmd_SortByGeneratedName"
accesskey="&GeneratedName.accesskey;"
oncommand="SortResultPane('GeneratedName');" name="sortas" type="radio" checked="true"/>
<menuitem label="&PrimaryEmail.label;"
id="cmd_SortByPrimaryEmail"
accesskey="&PrimaryEmail.accesskey;"
oncommand="SortResultPane('PrimaryEmail');" name="sortas" type="radio" checked="true"/>
<menuitem label="&ScreenName.label;"
id="cmd_SortBy_AimScreenName"
accesskey="&ScreenName.accesskey;"
oncommand="SortResultPane('_AimScreenName');" name="sortas" type="radio" checked="true"/>
<menuitem label="&Company.label;"
id="cmd_SortByCompany"
accesskey="&Company.accesskey;"
oncommand="SortResultPane('Company');" name="sortas" type="radio" checked="true"/>
<!-- LOCALIZATION NOTE:
Fields for phonetic are disabled as default and can be enabled by
editing "mail.addr_book.show_phonetic_fields"
-->
<menuitem label="&_PhoneticName.label;"
id="cmd_SortBy_PhoneticName"
hidden="true"
accesskey="&_PhoneticName.accesskey;"
oncommand="SortResultPane('_PhoneticName');" name="sortas" type="radio" checked="true"/>
<menuitem label="&NickName.label;"
id="cmd_SortByNickName"
accesskey="&NickName.accesskey;"
oncommand="SortResultPane('NickName');" name="sortas" type="radio" checked="true"/>
<menuitem label="&SecondEmail.label;"
id="cmd_SortBySecondEmail"
accesskey="&SecondEmail.accesskey;"
oncommand="SortResultPane('SecondEmail');" name="sortas" type="radio" checked="true"/>
<menuitem label="&Department.label;"
id="cmd_SortByDepartment"
accesskey="&Department.accesskey;"
oncommand="SortResultPane('Department');" name="sortas" type="radio" checked="true"/>
<menuitem label="&JobTitle.label;"
id="cmd_SortByJobTitle"
accesskey="&JobTitle.accesskey;"
oncommand="SortResultPane('JobTitle');" name="sortas" type="radio" checked="true"/>
<menuitem label="&CellularNumber.label;"
id="cmd_SortByCellularNumber"
accesskey="&CellularNumber.accesskey;"
oncommand="SortResultPane('CellularNumber');" name="sortas" type="radio" checked="true"/>
<menuitem label="&PagerNumber.label;"
id="cmd_SortByPagerNumber"
accesskey="&PagerNumber.accesskey;"
oncommand="SortResultPane('PagerNumber');" name="sortas" type="radio" checked="true"/>
<menuitem label="&FaxNumber.label;"
id="cmd_SortByFaxNumber"
accesskey="&FaxNumber.accesskey;"
oncommand="SortResultPane('FaxNumber');" name="sortas" type="radio" checked="true"/>
<menuitem label="&HomePhone.label;"
id="cmd_SortByHomePhone"
accesskey="&HomePhone.accesskey;"
oncommand="SortResultPane('HomePhone');" name="sortas" type="radio" checked="true"/>
<menuitem label="&WorkPhone.label;"
id="cmd_SortByWorkPhone"
accesskey="&WorkPhone.accesskey;"
oncommand="SortResultPane('WorkPhone');" name="sortas" type="radio" checked="true"/>
<menuseparator/>
<menuitem id="sortAscending" type="radio" name="sortdirection" label="&sortAscending.label;" accesskey="&sortAscending.accesskey;" oncommand="AbSortAscending()"/>
<menuitem id="sortDescending" type="radio" name="sortdirection" label="&sortDescending.label;" accesskey="&sortDescending.accesskey;" oncommand="AbSortDescending()"/>
</menupopup>
</menu>
</menupopup>
</menu>
<menu id="tasksMenu" label="&tasksMenu.label;" accesskey="&tasksMenu.accesskey;">
<menupopup id="taskPopup">
<menuitem accesskey="&messengerCmd.accesskey;" label="&messengerCmd.label;" key="key_mail" oncommand="toMessengerWindow();" id="tasksMenuMail" class="menuitem-iconic icon-mail16 menu-iconic"/>
<menuseparator />
<menuitem label="&searchAddressesCmd.label;"
accesskey="&searchAddressesCmd.accesskey;"
id="menu_search_addresses"
oncommand="onAdvancedAbSearch();"/>
<menuitem label="&importCmd.label;" accesskey="&importCmd.accesskey;" oncommand="toImport()"/>
<menuitem label="&exportCmd.label;" accesskey="&exportCmd.accesskey;" oncommand="AbExport()"/>
<menuseparator />
<menuitem id="menu_preferences" oncommand="goPreferences('mailnews', 'chrome://messenger/content/addressbook/pref-addressing.xul', 'mailaddressbookpref')"/>
</menupopup>
</menu>
<menu label="&helpMenu.label;" accesskey="&helpMenu.accesskey;">
<menupopup id="menu_HelpPopup">
<menuitem accesskey="&releaseCmd.accesskey;" label="&releaseCmd.label;" oncommand="loadThrobberUrl('mailnews.release_notes.url');"/>
<menuitem accesskey="&hintsAndTips.accesskey;" label="&hintsAndTips.label;" oncommand="loadThrobberUrl('mailnews.hints_and_tips.url');"/>
</menupopup>
</menu>
</menubar>
</toolbaritem>
</toolbar>
<toolbarpalette id="AddressBookToolbarPalette">
<toolbarbutton class="toolbarbutton-1" id="button-newcard" label="&newcardButton.label;" tooltiptext="&newcardButton.tooltip;" oncommand="AbNewCard('dirTree');"/>
<toolbarbutton class="toolbarbutton-1" id="button-newlist" label="&newlistButton.label;" tooltiptext="&newlistButton.tooltip;" oncommand="AbNewList('dirTree');"/>
<toolbarbutton class="toolbarbutton-1" id="button-editcard" label="&editButton.label;" tooltiptext="&editButton.tooltip;" oncommand="goDoCommand('button_edit');"/>
<toolbarbutton class="toolbarbutton-1" id="button-newmessage" label="&newmsgButton.label;" tooltiptext="&newmsgButton.tooltip;" oncommand="AbNewMessage();"/>
<toolbarbutton id="button-newim" class="toolbarbutton-1" label="&newIM.label;" tooltiptext="&newIM.tooltip;" oncommand="AbIMSelected();"/>
<toolbarbutton class="toolbarbutton-1" id="button-delete" observes="button_delete" label="&deleteButton.label;" tooltiptext="&deleteButton.tooltip;" oncommand="goDoCommand('button_delete');"/>
<toolbaritem id="throbber-box" align="center" pack="center">
<button id="navigator-throbber" oncommand="loadThrobberUrl('addressbook.throbber.url')" tooltiptext="&throbber.tooltip;">
<observes element="broadcaster_throbber" attribute="busy"/>
</button>
</toolbaritem>
</toolbarpalette>
<!-- toolbar -->
<toolbar id="ab-bar" class="toolbar-primary chromeclass-toolbar"
toolbarname="Mail"
fullscreentoolbar="true" mode="icons"
customizable="true"
defaultset="button-newcard,button-newlist,space,button-editcard,button-newmessage,button-newim,button-delete,spring,throbber-box">
</toolbar>
<toolbarset id="customToolbars" context="toolbar-context-menu"/>
</toolbox>
<!-- The main address book three pane -->
<hbox flex="1">
<vbox id="dirTreeBox" persist="width collapsed">
<tree id="dirTree" style="min-width:150px" flex="1" persist="width"/>
</vbox>
<splitter id="dirTree-splitter" collapse="before" persist="state">
<grippy/>
</splitter>
<vbox flex="1" style="min-width:100px">
<hbox id="searchBox" persist="collapsed" align="center">
<label id="searchCriteria" value="&SearchNameOrEmail.label;"
accesskey="&SearchNameOrEmail.accesskey;"
control="searchInput"/>
<textbox id="searchInput" flex="1"
oninput="onAbSearchInput(false);"
onkeypress="onAbSearchKeyPress(event);"
onfocus="this.select();" onclick="this.select();"/>
<button id="clear" label="&clearButton.label;" disabled="true"
accesskey="&clearButton.accesskey;"
oncommand="onAbClearSearch();"
tooltiptext="&clearButton.tooltip;"/>
<button id="advancedButton" label="&advancedButton.label;"
accesskey="&advancedButton.accesskey;"
tooltiptext="&advancedButton.tooltip;"
oncommand="onAdvancedAbSearch();"/>
</hbox>
<!-- results pane -->
<tree id="abResultsTree" flex="1" persist="height"/>
<splitter id="results-splitter" collapse="after" persist="state">
<grippy/>
</splitter>
<!-- card view -->
<hbox id="CardViewOuterBox" flex="1">
<vbox id="CardViewBox" style="height:170px; min-height:1px; min-width:1px"/>
</hbox>
</vbox>
</hbox>
<statusbar id="status-bar" class="chromeclass-status">
<statusbarpanel id="statusText" flex="1" value="&statusText.label;"/>
</statusbar>
</window>

Просмотреть файл

@ -0,0 +1,10 @@
classic.jar:
+ skin/classic/messenger/addressbook/addressbook.css (skin/addressbook.css)
messenger.jar:
+ content/messenger/addressbook/abCardViewOverlay.js (content/abCardViewOverlay.js)
+ content/messenger/addressbook/addressbook.js (content/addressbook.js)
+ content/messenger/addressbook/addressbook.xul (content/addressbook.xul)
en-US.jar:
+ locale/en-US/messenger/addressbook/abMainWindow.dtd (locale/abMainWindow.dtd)

Просмотреть файл

@ -0,0 +1,116 @@
<!--
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.
-->
<!-- Title -->
<!ENTITY addressbookWindow.title "Address Book">
<!-- Menus: the . means that the menu item isn't implemented yet -->
<!-- File Menu -->
<!ENTITY newCard.label "Address Book Card...">
<!-- LOCALIZATION NOTE (newCard.accesskey) : DONT_TRANSLATE -->
<!ENTITY newCard.accesskey "C">
<!ENTITY newListCmd.label "Mailing List...">
<!-- LOCALIZATION NOTE (newListCmd.accesskey) : DONT_TRANSLATE -->
<!ENTITY newListCmd.accesskey "L">
<!ENTITY newAddressBookCmd.label "Address Book...">
<!ENTITY newAddressBookCmd.accesskey "B">
<!ENTITY renameAddressBookCmd.label "Rename Address Book...">
<!ENTITY renameAddressBookCmd.accesskey "R">
<!ENTITY newLDAPDirectoryCmd.label "LDAP Directory...">
<!-- LOCALIZATION NOTE (newLDAPDirectoryCmd.accesskey) : DONT_TRANSLATE -->
<!ENTITY newLDAPDirectoryCmd.accesskey "D">
<!ENTITY newIM.label "IM">
<!ENTITY importCmd.label "Import...">
<!ENTITY importCmd.accesskey "I">
<!ENTITY exportCmd.label "Export...">
<!ENTITY exportCmd.accesskey "E">
<!ENTITY printCardViewCmd.label "Print Card...">
<!ENTITY printCardViewCmd.accesskey "p">
<!ENTITY printPreviewCardViewCmd.label "Print Preview Card">
<!ENTITY printPreviewCardViewCmd.accesskey "v">
<!-- LOCALIZATION NOTE (printCardViewCmd.key) : DONT_TRANSLATE -->
<!ENTITY printCardViewCmd.key "P">
<!ENTITY printAddressBook.label "Print Address Book...">
<!ENTITY printAddressBook.accesskey "A">
<!ENTITY printPreviewAddressBook.label "Print Preview Address Book">
<!ENTITY printPreviewAddressBook.accesskey "B">
<!ENTITY printSetupCmd.label "Page Setup...">
<!ENTITY printSetupCmd.accesskey "u">
<!-- Edit Menu -->
<!ENTITY deleteAbCmd.label "Delete Address Book">
<!ENTITY deleteCardCmd.label "Delete Card">
<!ENTITY deleteCardsCmd.label "Delete Selected Cards">
<!ENTITY swapFirstNameLastNameCmd.label "Swap First/Last Name">
<!ENTITY swapFirstNameLastNameCmd.accesskey "w">
<!ENTITY propertiesCmd.label "Properties...">
<!-- LOCALIZATION NOTE (propertiesCmd.accesskey) : DONT_TRANSLATE -->
<!ENTITY propertiesCmd.accesskey "i">
<!ENTITY propertiesCmd.key "i">
<!-- View Menu -->
<!ENTITY showAbToolbarCmd.label "Address Book Toolbar">
<!ENTITY showAbToolbarCmd.accesskey "o">
<!ENTITY showCardPane.label "Card Summary Pane">
<!ENTITY showCardPane.accesskey "C">
<!ENTITY menu_ShowNameAs.label "Show Name As">
<!ENTITY menu_ShowNameAs.accesskey "n">
<!ENTITY firstLastCmd.label "First Last">
<!ENTITY firstLastCmd.accesskey "f">
<!ENTITY lastFirstCmd.label "Last, First">
<!ENTITY lastFirstCmd.accesskey "l">
<!ENTITY displayNameCmd.label "Display Name">
<!ENTITY displayNameCmd.accesskey "d">
<!ENTITY stopSearchingCmd.label ".Stop Searching">
<!-- Toolbar items -->
<!ENTITY newcardButton.label "New Card">
<!ENTITY newlistButton.label "New List">
<!ENTITY editButton.label "Properties">
<!ENTITY newmsgButton.label "Write">
<!ENTITY deleteButton.label "Delete">
<!ENTITY stopButton.label ".Stop">
<!ENTITY searchButton.label ".Search">
<!ENTITY showNames.label "Show names containing:">
<!-- Tooltips -->
<!ENTITY addressbookToolbar.tooltip "Address Book Toolbar">
<!ENTITY newcardButton.tooltip "Create a new address book card">
<!ENTITY newlistButton.tooltip "Create a new list">
<!ENTITY editButton.tooltip "Edit the selected card">
<!ENTITY newmsgButton.tooltip "Send a mail message">
<!ENTITY newIM.tooltip "Send an instant message or chat">
<!ENTITY deleteButton.tooltip "Delete selected card or address book">
<!ENTITY stopButton.tooltip "Stop the current transfer">
<!ENTITY searchButton.tooltip "Search the selected address book">
<!ENTITY throbber.tooltip "Go to the &vendorShortName; home page">
<!ENTITY clearButton.tooltip "Clear the search criteria and show all entries">
<!ENTITY advancedButton.tooltip "Advanced address search">
<!-- Status Bar -->
<!ENTITY statusText.label "">
<!-- LOCALIZATION NOTE (hideSwapFnLnUI) : DONT_TRANSLATE -->
<!-- Swap FN/LN UI Set to "false" to show swap fn/ln UI -->
<!ENTITY hideSwapFnLnUI "true">