gecko-dev/browser/components/preferences/languages.js
Jim Blandy 7e20285e70 Bug 914753: Make Emacs file variable header lines correct, or at least consistent. DONTBUILD r=ehsan
The -*- file variable lines -*- establish per-file settings that Emacs will
pick up. This patch makes the following changes to those lines (and touches
nothing else):

 - Never set the buffer's mode.

   Years ago, Emacs did not have a good JavaScript mode, so it made sense
   to use Java or C++ mode in .js files. However, Emacs has had js-mode for
   years now; it's perfectly serviceable, and is available and enabled by
   default in all major Emacs packagings.

   Selecting a mode in the -*- file variable line -*- is almost always the
   wrong thing to do anyway. It overrides Emacs's default choice, which is
   (now) reasonable; and even worse, it overrides settings the user might
   have made in their '.emacs' file for that file extension. It's only
   useful when there's something specific about that particular file that
   makes a particular mode appropriate.

 - Correctly propagate settings that establish the correct indentation
   level for this file: c-basic-offset and js2-basic-offset should be
   js-indent-level. Whatever value they're given should be preserved;
   different parts of our tree use different indentation styles.

 - We don't use tabs in Mozilla JS code. Always set indent-tabs-mode: nil.
   Remove tab-width: settings, at least in files that don't contain tab
   characters.

 - Remove js2-mode settings that belong in the user's .emacs file, like
   js2-skip-preprocessor-directives.
2014-06-24 22:12:07 -07:00

305 lines
9.9 KiB
JavaScript

/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
var gLanguagesDialog = {
_availableLanguagesList : [],
_acceptLanguages : { },
_selectedItemID : null,
init: function ()
{
if (!this._availableLanguagesList.length)
this._loadAvailableLanguages();
},
get _activeLanguages()
{
return document.getElementById("activeLanguages");
},
get _availableLanguages()
{
return document.getElementById("availableLanguages");
},
_loadAvailableLanguages: function ()
{
// This is a parser for: resource://gre/res/language.properties
// The file is formatted like so:
// ab[-cd].accept=true|false
// ab = language
// cd = region
var bundleAccepted = document.getElementById("bundleAccepted");
var bundleRegions = document.getElementById("bundleRegions");
var bundleLanguages = document.getElementById("bundleLanguages");
var bundlePreferences = document.getElementById("bundlePreferences");
function LanguageInfo(aName, aABCD, aIsVisible)
{
this.name = aName;
this.abcd = aABCD;
this.isVisible = aIsVisible;
}
// 1) Read the available languages out of language.properties
var strings = bundleAccepted.strings;
while (strings.hasMoreElements()) {
var currString = strings.getNext();
if (!(currString instanceof Components.interfaces.nsIPropertyElement))
break;
var property = currString.key.split("."); // ab[-cd].accept
if (property[1] == "accept") {
var abCD = property[0];
var abCDPairs = abCD.split("-"); // ab[-cd]
var useABCDFormat = abCDPairs.length > 1;
var ab = useABCDFormat ? abCDPairs[0] : abCD;
var cd = useABCDFormat ? abCDPairs[1] : "";
if (ab) {
var language = "";
try {
language = bundleLanguages.getString(ab);
}
catch (e) { continue; };
var region = "";
if (useABCDFormat) {
try {
region = bundleRegions.getString(cd);
}
catch (e) { continue; }
}
var name = "";
if (useABCDFormat)
name = bundlePreferences.getFormattedString("languageRegionCodeFormat",
[language, region, abCD]);
else
name = bundlePreferences.getFormattedString("languageCodeFormat",
[language, abCD]);
if (name && abCD) {
var isVisible = currString.value == "true" &&
(!(abCD in this._acceptLanguages) || !this._acceptLanguages[abCD]);
var li = new LanguageInfo(name, abCD, isVisible);
this._availableLanguagesList.push(li);
}
}
}
}
this._buildAvailableLanguageList();
},
_buildAvailableLanguageList: function ()
{
var availableLanguagesPopup = document.getElementById("availableLanguagesPopup");
while (availableLanguagesPopup.hasChildNodes())
availableLanguagesPopup.removeChild(availableLanguagesPopup.firstChild);
// Sort the list of languages by name
this._availableLanguagesList.sort(function (a, b) {
return a.name.localeCompare(b.name);
});
// Load the UI with the data
for (var i = 0; i < this._availableLanguagesList.length; ++i) {
var abCD = this._availableLanguagesList[i].abcd;
if (this._availableLanguagesList[i].isVisible &&
(!(abCD in this._acceptLanguages) || !this._acceptLanguages[abCD])) {
var menuitem = document.createElement("menuitem");
menuitem.id = this._availableLanguagesList[i].abcd;
availableLanguagesPopup.appendChild(menuitem);
menuitem.setAttribute("label", this._availableLanguagesList[i].name);
}
}
},
readAcceptLanguages: function ()
{
while (this._activeLanguages.hasChildNodes())
this._activeLanguages.removeChild(this._activeLanguages.firstChild);
var selectedIndex = 0;
var preference = document.getElementById("intl.accept_languages");
if (preference.value == "")
return undefined;
var languages = preference.value.toLowerCase().split(/\s*,\s*/);
for (var i = 0; i < languages.length; ++i) {
var name = this._getLanguageName(languages[i]);
if (!name)
name = "[" + languages[i] + "]";
var listitem = document.createElement("listitem");
listitem.id = languages[i];
if (languages[i] == this._selectedItemID)
selectedIndex = i;
this._activeLanguages.appendChild(listitem);
listitem.setAttribute("label", name);
// Hash this language as an "Active" language so we don't
// show it in the list that can be added.
this._acceptLanguages[languages[i]] = true;
}
if (this._activeLanguages.childNodes.length > 0) {
this._activeLanguages.ensureIndexIsVisible(selectedIndex);
this._activeLanguages.selectedIndex = selectedIndex;
}
return undefined;
},
writeAcceptLanguages: function ()
{
return undefined;
},
onAvailableLanguageSelect: function ()
{
var addButton = document.getElementById("addButton");
addButton.disabled = false;
this._availableLanguages.removeAttribute("accesskey");
},
addLanguage: function ()
{
var selectedID = this._availableLanguages.selectedItem.id;
var preference = document.getElementById("intl.accept_languages");
var arrayOfPrefs = preference.value.toLowerCase().split(/\s*,\s*/);
for (var i = 0; i < arrayOfPrefs.length; ++i ){
if (arrayOfPrefs[i] == selectedID)
return;
}
this._selectedItemID = selectedID;
if (preference.value == "")
preference.value = selectedID;
else {
arrayOfPrefs.unshift(selectedID);
preference.value = arrayOfPrefs.join(",");
}
this._acceptLanguages[selectedID] = true;
this._availableLanguages.selectedItem = null;
// Rebuild the available list with the added item removed...
this._buildAvailableLanguageList();
this._availableLanguages.setAttribute("label", this._availableLanguages.getAttribute("label2"));
},
removeLanguage: function ()
{
// Build the new preference value string.
var languagesArray = [];
for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) {
var item = this._activeLanguages.childNodes[i];
if (!item.selected)
languagesArray.push(item.id);
else
this._acceptLanguages[item.id] = false;
}
var string = languagesArray.join(",");
// Get the item to select after the remove operation completes.
var selection = this._activeLanguages.selectedItems;
var lastSelected = selection[selection.length-1];
var selectItem = lastSelected.nextSibling || lastSelected.previousSibling;
selectItem = selectItem ? selectItem.id : null;
this._selectedItemID = selectItem;
// Update the preference and force a UI rebuild
var preference = document.getElementById("intl.accept_languages");
preference.value = string;
this._buildAvailableLanguageList();
},
_getLanguageName: function (aABCD)
{
if (!this._availableLanguagesList.length)
this._loadAvailableLanguages();
for (var i = 0; i < this._availableLanguagesList.length; ++i) {
if (aABCD == this._availableLanguagesList[i].abcd)
return this._availableLanguagesList[i].name;
}
return "";
},
moveUp: function ()
{
var selectedItem = this._activeLanguages.selectedItems[0];
var previousItem = selectedItem.previousSibling;
var string = "";
for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) {
var item = this._activeLanguages.childNodes[i];
string += (i == 0 ? "" : ",");
if (item.id == previousItem.id)
string += selectedItem.id;
else if (item.id == selectedItem.id)
string += previousItem.id;
else
string += item.id;
}
this._selectedItemID = selectedItem.id;
// Update the preference and force a UI rebuild
var preference = document.getElementById("intl.accept_languages");
preference.value = string;
},
moveDown: function ()
{
var selectedItem = this._activeLanguages.selectedItems[0];
var nextItem = selectedItem.nextSibling;
var string = "";
for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) {
var item = this._activeLanguages.childNodes[i];
string += (i == 0 ? "" : ",");
if (item.id == nextItem.id)
string += selectedItem.id;
else if (item.id == selectedItem.id)
string += nextItem.id;
else
string += item.id;
}
this._selectedItemID = selectedItem.id;
// Update the preference and force a UI rebuild
var preference = document.getElementById("intl.accept_languages");
preference.value = string;
},
onLanguageSelect: function ()
{
var upButton = document.getElementById("up");
var downButton = document.getElementById("down");
var removeButton = document.getElementById("remove");
switch (this._activeLanguages.selectedCount) {
case 0:
upButton.disabled = downButton.disabled = removeButton.disabled = true;
break;
case 1:
upButton.disabled = this._activeLanguages.selectedIndex == 0;
downButton.disabled = this._activeLanguages.selectedIndex == this._activeLanguages.childNodes.length - 1;
removeButton.disabled = false;
break;
default:
upButton.disabled = true;
downButton.disabled = true;
removeButton.disabled = false;
}
}
};