pjs/mail/components/preferences/compose.js

427 строки
14 KiB
JavaScript

# -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
# ***** 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 the Thunderbird Preferences System.
#
# The Initial Developer of the Original Code is
# Scott MacGregor.
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Scott MacGregor <mscott@mozilla.org>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
const kLDAPPrefContractID="@mozilla.org/ldapprefs-service;1";
var gRefresh = false; // leftover hack from the old preferences dialog
var gComposePane = {
mInitialized: false,
mDirectories: null,
mLDAPPrefsService: null,
mSpellChecker: null,
mDictCount : 0,
init: function ()
{
if (kLDAPPrefContractID in Components.classes)
this.mLDAPPrefsService = Components.classes[kLDAPPrefContractID].getService(Components.interfaces.nsILDAPPrefsService);
this.createDirectoriesList();
// build the local address book menu list. We do this by hand instead of using the xul template
// builder because of Bug #285076,
this.createLocalDirectoriesList();
this.enableAutocomplete();
this.initLanguageMenu();
this.populateFonts();
document.getElementById('downloadDictionaries').setAttribute('href', this.getDictionaryURL());
var preference = document.getElementById("mail.preferences.compose.selectedTabIndex");
if (preference.value)
document.getElementById("composePrefs").selectedIndex = preference.value;
this.mInitialized = true;
},
getDictionaryURL: function()
{
var formatter = Components.classes["@mozilla.org/toolkit/URLFormatterService;1"]
.getService(Components.interfaces.nsIURLFormatter);
return formatter.formatURLPref("spellchecker.dictionaries.download.url");
},
tabSelectionChanged: function ()
{
if (this.mInitialized)
{
var preference = document.getElementById("mail.preferences.compose.selectedTabIndex");
preference.valueFromPreferences = document.getElementById("composePrefs").selectedIndex;
}
},
sendOptionsDialog: function()
{
document.documentElement.openSubDialog("chrome://messenger/content/preferences/sendoptions.xul","", null);
},
htmlComposeDialog: function()
{
document.documentElement.openSubDialog("chrome://messenger/content/preferences/htmlcompose.xul","", null);
},
enableAutocomplete: function()
{
var directoriesList = document.getElementById("directoriesList");
var directoriesListPopup = document.getElementById("directoriesListPopup");
var editButton = document.getElementById("editButton");
if (document.getElementById("autocompleteLDAP").checked)
{
editButton.removeAttribute("disabled");
directoriesList.removeAttribute("disabled");
directoriesListPopup.removeAttribute("disabled");
}
else
{
directoriesList.setAttribute("disabled", true);
directoriesListPopup.setAttribute("disabled", true);
editButton.setAttribute("disabled", true);
}
// if we do not have any directories disable the dropdown list box
if (!this.mDirectories || (this.mDirectories < 1))
directoriesList.setAttribute("disabled", true);
},
createLocalDirectoriesList: function ()
{
var abPopup = document.getElementById("abPopup-menupopup");
if (abPopup)
this.loadLocalDirectories(abPopup);
},
loadLocalDirectories: function (aPopup)
{
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
.getService(Components.interfaces.nsIRDFService);
var parentDir = rdfService.GetResource("moz-abdirectory://").QueryInterface(Components.interfaces.nsIAbDirectory);
var enumerator = parentDir.childNodes;
var preference = document.getElementById("mail.collect_addressbook");
if (enumerator)
{
while (enumerator.hasMoreElements())
{
var addrbook = enumerator.getNext();
if (addrbook instanceof Components.interfaces.nsIAbDirectory && !addrbook.isRemote && !addrbook.isMailList)
{
var abURI = addrbook.URI;
item = document.createElement("menuitem");
item.setAttribute("label", addrbook.dirName);
item.setAttribute("value", abURI);
aPopup.appendChild(item);
if (preference.value == abURI)
{
aPopup.parentNode.value = abURI;
aPopup.selectedItem = item;
}
}
}
}
},
createDirectoriesList: function()
{
var directoriesListPopup = document.getElementById("directoriesListPopup");
if (directoriesListPopup)
this.loadDirectories(directoriesListPopup);
},
loadDirectories: function(aPopup)
{
var prefCount = {value:0};
var description = "";
var item;
var j=0;
var arrayOfDirectories;
var position;
var dirType;
var prefService;
prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
if (!this.mDirectories)
{
try
{
if (this.mLDAPPrefsService)
arrayOfDirectories = this.mLDAPPrefsService.getServerList(prefService, prefCount);
}
catch (ex) {}
if (arrayOfDirectories)
{
this.mDirectories = new Array();
for (var i = 0; i < prefCount.value; i++)
{
if ((arrayOfDirectories[i] != "ldap_2.servers.pab") &&
(arrayOfDirectories[i] != "ldap_2.servers.history"))
{
try
{
position = prefService.getIntPref(arrayOfDirectories[i]+".position");
}
catch(ex)
{
position = 1;
}
try
{
dirType = prefService.getIntPref(arrayOfDirectories[i]+".dirType");
}
catch(ex)
{
dirType = 1;
}
if ((position != 0) && (dirType == 1))
{
try
{
description = prefService.getComplexValue(arrayOfDirectories[i]+".description",
Components.interfaces.nsISupportsString).data;
}
catch(ex)
{
description="";
}
if (description != "")
{
if (aPopup)
{
item = document.createElement("menuitem");
item.setAttribute("label", description);
item.setAttribute("value", arrayOfDirectories[i]);
aPopup.appendChild(item);
}
this.mDirectories[j++] = {value:arrayOfDirectories[i], label:description};
}
}
}
}
if (aPopup)
{
// we are in mail/news Account settings
item = document.createElement("menuitem");
var addressBookBundle = document.getElementById("bundle_addressBook");
var directoryName = addressBookBundle.getString("directoriesListItemNone");
item.setAttribute("label", directoryName);
item.setAttribute("value", "");
aPopup.appendChild(item);
// Now check what we are displaying is valid.
var directoriesList = document.getElementById("directoriesList");
var value = directoriesList.value;
directoriesList.selectedItem = null;
directoriesList.value = value;
if (!directoriesList.selectedItem)
{
directoriesList.value = "";
// If we have no other directories, also disable the popup.
if (gAvailDirectories.length == 0)
directoriesList.disabled = true;
}
else if (!prefService.prefIsLocked("ldap_2.autoComplete.directoryServer"))
directoriesList.disabled = false;
}
}
}
},
editDirectories: function()
{
var args = {fromGlobalPref: true};
window.openDialog("chrome://messenger/content/addressbook/pref-editdirectories.xul",
"editDirectories", "chrome,modal=yes,resizable=no", args);
if (gRefresh)
{
var popup = document.getElementById("directoriesListPopup");
if (popup)
while (popup.hasChildNodes())
popup.removeChild(popup.lastChild);
}
this.mDirectories = null;
this.loadDirectories(popup);
gRefresh = false;
},
initLanguageMenu: function ()
{
var languageMenuList = document.getElementById("languageMenuList");
this.mSpellChecker = Components.classes['@mozilla.org/spellchecker/myspell;1'].getService(Components.interfaces.mozISpellCheckingEngine);
var o1 = {};
var o2 = {};
// Get the list of dictionaries from
// the spellchecker.
this.mSpellChecker.getDictionaryList(o1, o2);
var dictList = o1.value;
var count = o2.value;
// if we don't have any dictionaries installed, disable the menu list
languageMenuList.disabled = !count;
// If dictionary count hasn't changed then no need to update the menu.
if (this.mDictCount == count)
return;
// Store current dictionary count.
this.mDictCount = count;
// Load the string bundles that will help us map
// RFC 1766 strings to UI strings.
// Load the language string bundle.
var languageBundle = document.getElementById("languageBundle");
var regionBundle = null;
// If we have a language string bundle, load the region string bundle.
if (languageBundle)
regionBundle = document.getElementById("regionBundle");
var menuStr2;
var isoStrArray;
var langId;
var langLabel;
var i;
for (i = 0; i < count; i++)
{
try {
langId = dictList[i];
isoStrArray = dictList[i].split("-");
if (languageBundle && isoStrArray[0])
langLabel = languageBundle.getString(isoStrArray[0].toLowerCase());
if (regionBundle && langLabel && isoStrArray.length > 1 && isoStrArray[1])
{
menuStr2 = regionBundle.getString(isoStrArray[1].toLowerCase());
if (menuStr2)
langLabel += "/" + menuStr2;
}
if (langLabel && isoStrArray.length > 2 && isoStrArray[2])
langLabel += " (" + isoStrArray[2] + ")";
if (!langLabel)
langLabel = langId;
} catch (ex) {
// getString throws an exception when a key is not found in the
// bundle. In that case, just use the original dictList string.
langLabel = langId;
}
dictList[i] = [langLabel, langId];
}
// sort by locale-aware collation
dictList.sort(
function compareFn(a, b)
{
return a[0].localeCompare(b[0]);
}
);
// Remove any languages from the list.
var languageMenuPopup = languageMenuList.firstChild;
while (languageMenuPopup.hasChildNodes())
languageMenuPopup.removeChild(languageMenuPopup.firstChild);
// append the dictionaries to the menu list...
for (i = 0; i < count; i++)
languageMenuList.appendItem(dictList[i][0], dictList[i][1]);
languageMenuList.setInitialSelection();
},
populateFonts: function()
{
var fontsList = document.getElementById("FontSelect");
try
{
var enumerator = Components.classes["@mozilla.org/gfx/fontenumerator;1"]
.getService(Components.interfaces.nsIFontEnumerator);
var localFontCount = { value: 0 }
var localFonts = enumerator.EnumerateAllFonts(localFontCount);
for (var i = 0; i < localFonts.length; ++i)
{
if (localFonts[i] != "")
fontsList.appendItem(localFonts[i], localFonts[i]);
}
}
catch(e) { }
},
restoreHTMLDefaults: function()
{
// reset throws an exception if the pref value is already the default so
// work around that with some try/catch exception handling
try {
document.getElementById('msgcompose.font_face').reset();
} catch (ex) {}
try {
document.getElementById('msgcompose.font_size').reset();
} catch (ex) {}
try {
document.getElementById('msgcompose.text_color').reset();
} catch (ex) {}
try {
document.getElementById('msgcompose.background_color').reset();
} catch (ex) {}
}
};