зеркало из https://github.com/mozilla/pjs.git
minotaur landing
This commit is contained in:
Родитель
d06d19e60b
Коммит
a5c274b6a3
|
@ -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="©Cmd.label;"
|
||||
key="key_copy"
|
||||
accesskey="©Cmd.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="©Cmd.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 & 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 & 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 & 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 & 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 & 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;
|
||||
}
|
||||
|
|
@ -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">
|
Загрузка…
Ссылка в новой задаче