diff options
Diffstat (limited to 'toolkit/mozapps/extensions/content/setting.xml')
-rw-r--r-- | toolkit/mozapps/extensions/content/setting.xml | 508 |
1 files changed, 508 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/content/setting.xml b/toolkit/mozapps/extensions/content/setting.xml new file mode 100644 index 000000000..c4eae1fd3 --- /dev/null +++ b/toolkit/mozapps/extensions/content/setting.xml @@ -0,0 +1,508 @@ +<?xml version="1.0"?> +<!-- 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/. --> + +<!DOCTYPE page [ +<!ENTITY % extensionsDTD SYSTEM "chrome://mozapps/locale/extensions/extensions.dtd"> +%extensionsDTD; +]> + +<bindings xmlns="http://www.mozilla.org/xbl" + xmlns:xbl="http://www.mozilla.org/xbl" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <binding id="settings"> + <content orient="vertical"> + <xul:label class="settings-title" xbl:inherits="xbl:text=label" flex="1"/> + <children/> + </content> + </binding> + + <binding id="setting-base"> + <implementation> + <constructor><![CDATA[ + this.preferenceChanged(); + + this.addEventListener("keypress", function(event) { + event.stopPropagation(); + }, false); + + if (this.usePref) + Services.prefs.addObserver(this.pref, this._observer, true); + ]]></constructor> + + <field name="_observer"><![CDATA[({ + _self: this, + + QueryInterface: function(aIID) { + const Ci = Components.interfaces; + if (aIID.equals(Ci.nsIObserver) || + aIID.equals(Ci.nsISupportsWeakReference) || + aIID.equals(Ci.nsISupports)) + return this; + + throw Components.Exception("No interface", Components.results.NS_ERROR_NO_INTERFACE); + }, + + observe: function(aSubject, aTopic, aPrefName) { + if (aTopic != "nsPref:changed") + return; + + if (this._self.pref == aPrefName) + this._self.preferenceChanged(); + } + })]]> + </field> + + <method name="fireEvent"> + <parameter name="eventName"/> + <parameter name="funcStr"/> + <body> + <![CDATA[ + let body = funcStr || this.getAttribute(eventName); + if (!body) + return; + + try { + let event = document.createEvent("Events"); + event.initEvent(eventName, true, true); + let f = new Function("event", body); + f.call(this, event); + } + catch (e) { + Cu.reportError(e); + } + ]]> + </body> + </method> + + <method name="valueFromPreference"> + <body> + <![CDATA[ + // Should be code to set the from the preference input.value + throw Components.Exception("No valueFromPreference implementation", + Components.results.NS_ERROR_NOT_IMPLEMENTED); + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + // Should be code to set the input.value from the preference + throw Components.Exception("No valueToPreference implementation", + Components.results.NS_ERROR_NOT_IMPLEMENTED); + ]]> + </body> + </method> + + <method name="inputChanged"> + <body> + <![CDATA[ + if (this.usePref && !this._updatingInput) { + this.valueToPreference(); + this.fireEvent("oninputchanged"); + } + ]]> + </body> + </method> + + <method name="preferenceChanged"> + <body> + <![CDATA[ + if (this.usePref) { + this._updatingInput = true; + try { + this.valueFromPreference(); + this.fireEvent("onpreferencechanged"); + } catch (e) {} + this._updatingInput = false; + } + ]]> + </body> + </method> + + <property name="usePref" readonly="true" onget="return this.hasAttribute('pref');"/> + <property name="pref" readonly="true" onget="return this.getAttribute('pref');"/> + <property name="type" readonly="true" onget="return this.getAttribute('type');"/> + <property name="value" onget="return this.input.value;" onset="return this.input.value = val;"/> + + <field name="_updatingInput">false</field> + <field name="input">document.getAnonymousElementByAttribute(this, "anonid", "input");</field> + <field name="settings"> + this.parentNode.localName == "settings" ? this.parentNode : null; + </field> + </implementation> + </binding> + + <binding id="setting-bool" extends="chrome://mozapps/content/extensions/setting.xml#setting-base"> + <content> + <xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:label class="preferences-title" flex="1" xbl:inherits="xbl:text=title"/> + </xul:hbox> + <xul:description class="preferences-description" flex="1" xbl:inherits="xbl:text=desc"/> + <xul:label class="preferences-learnmore text-link" + onclick="document.getBindingParent(this).openLearnMore()">&setting.learnmore;</xul:label> + </xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:checkbox anonid="input" xbl:inherits="disabled,onlabel,offlabel,label=checkboxlabel" oncommand="inputChanged();"/> + </xul:hbox> + </content> + + <implementation> + <method name="valueFromPreference"> + <body> + <![CDATA[ + let val = Services.prefs.getBoolPref(this.pref); + this.value = this.inverted ? !val : val; + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + let val = this.value; + Services.prefs.setBoolPref(this.pref, this.inverted ? !val : val); + ]]> + </body> + </method> + + <property name="value" onget="return this.input.checked;" onset="return this.input.setChecked(val);"/> + <property name="inverted" readonly="true" onget="return this.getAttribute('inverted');"/> + + <method name="openLearnMore"> + <body> + <![CDATA[ + window.open(this.getAttribute("learnmore"), "_blank"); + ]]> + </body> + </method> + </implementation> + </binding> + + <binding id="setting-boolint" extends="chrome://mozapps/content/extensions/setting.xml#setting-bool"> + <implementation> + <method name="valueFromPreference"> + <body> + <![CDATA[ + let val = Services.prefs.getIntPref(this.pref); + this.value = (val == this.getAttribute("on")); + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + Services.prefs.setIntPref(this.pref, this.getAttribute(this.value ? "on" : "off")); + ]]> + </body> + </method> + </implementation> + </binding> + + <binding id="setting-localized-bool" extends="chrome://mozapps/content/extensions/setting.xml#setting-bool"> + <implementation> + <method name="valueFromPreference"> + <body> + <![CDATA[ + let val = Services.prefs.getComplexValue(this.pref, Components.interfaces.nsIPrefLocalizedString).data; + if(this.inverted) val = !val; + this.value = (val == "true"); + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + let val = this.value; + if(this.inverted) val = !val; + let pref = Components.classes["@mozilla.org/pref-localizedstring;1"].createInstance(Components.interfaces.nsIPrefLocalizedString); + pref.data = this.inverted ? (!val).toString() : val.toString(); + Services.prefs.setComplexValue(this.pref, Components.interfaces.nsIPrefLocalizedString, pref); + ]]> + </body> + </method> + </implementation> + </binding> + + <binding id="setting-integer" extends="chrome://mozapps/content/extensions/setting.xml#setting-base"> + <content> + <xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:label class="preferences-title" flex="1" xbl:inherits="xbl:text=title"/> + </xul:hbox> + <xul:description class="preferences-description" flex="1" xbl:inherits="xbl:text=desc"/> + </xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:textbox type="number" anonid="input" oninput="inputChanged();" onchange="inputChanged();" + xbl:inherits="disabled,emptytext,min,max,increment,hidespinbuttons,wraparound,size"/> + </xul:hbox> + </content> + + <implementation> + <method name="valueFromPreference"> + <body> + <![CDATA[ + let val = Services.prefs.getIntPref(this.pref); + this.value = val; + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + Services.prefs.setIntPref(this.pref, this.value); + ]]> + </body> + </method> + </implementation> + </binding> + + <binding id="setting-control" extends="chrome://mozapps/content/extensions/setting.xml#setting-base"> + <content> + <xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:label class="preferences-title" flex="1" xbl:inherits="xbl:text=title"/> + </xul:hbox> + <xul:description class="preferences-description" flex="1" xbl:inherits="xbl:text=desc"/> + </xul:vbox> + <xul:hbox class="preferences-alignment"> + <children/> + </xul:hbox> + </content> + </binding> + + <binding id="setting-string" extends="chrome://mozapps/content/extensions/setting.xml#setting-base"> + <content> + <xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:label class="preferences-title" flex="1" xbl:inherits="xbl:text=title"/> + </xul:hbox> + <xul:description class="preferences-description" flex="1" xbl:inherits="xbl:text=desc"/> + </xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:textbox anonid="input" flex="1" oninput="inputChanged();" + xbl:inherits="disabled,emptytext,type=inputtype,min,max,increment,hidespinbuttons,decimalplaces,wraparound"/> + </xul:hbox> + </content> + + <implementation> + <method name="valueFromPreference"> + <body> + <![CDATA[ + const nsISupportsString = Components.interfaces.nsISupportsString; + this.value = Services.prefs.getComplexValue(this.pref, nsISupportsString).data; + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + const nsISupportsString = Components.interfaces.nsISupportsString; + let iss = Components.classes["@mozilla.org/supports-string;1"].createInstance(nsISupportsString); + iss.data = this.value; + Services.prefs.setComplexValue(this.pref, nsISupportsString, iss); + ]]> + </body> + </method> + </implementation> + </binding> + + <binding id="setting-color" extends="chrome://mozapps/content/extensions/setting.xml#setting-base"> + <content> + <xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:label class="preferences-title" flex="1" xbl:inherits="xbl:text=title"/> + </xul:hbox> + <xul:description class="preferences-description" flex="1" xbl:inherits="xbl:text=desc"/> + </xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:colorpicker type="button" anonid="input" xbl:inherits="disabled" onchange="document.getBindingParent(this).inputChanged();"/> + </xul:hbox> + </content> + + <implementation> + <method name="valueFromPreference"> + <body> + <![CDATA[ + // We must wait for the colorpicker's binding to be applied before setting the value + if (!this.input.color) + this.input.initialize(); + this.value = Services.prefs.getCharPref(this.pref); + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + Services.prefs.setCharPref(this.pref, this.value); + ]]> + </body> + </method> + + <property name="value" onget="return this.input.color;" onset="return this.input.color = val;"/> + </implementation> + </binding> + + <binding id="setting-path" extends="chrome://mozapps/content/extensions/setting.xml#setting-base"> + <content> + <xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:label class="preferences-title" flex="1" xbl:inherits="xbl:text=title"/> + </xul:hbox> + <xul:description class="preferences-description" flex="1" xbl:inherits="xbl:text=desc"/> + </xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:button type="button" anonid="button" label="&settings.path.button.label;" xbl:inherits="disabled" oncommand="showPicker();"/> + <xul:label anonid="input" flex="1" crop="center" xbl:inherits="disabled"/> + </xul:hbox> + </content> + + <implementation> + <method name="showPicker"> + <body> + <![CDATA[ + var filePicker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + filePicker.init(window, this.getAttribute("title"), + this.type == "file" ? Ci.nsIFilePicker.modeOpen : Ci.nsIFilePicker.modeGetFolder); + if (this.value) { + try { + let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); + file.initWithPath(this.value); + filePicker.displayDirectory = this.type == "file" ? file.parent : file; + if (this.type == "file") { + filePicker.defaultString = file.leafName; + } + } catch (e) {} + } + if (filePicker.show() != Ci.nsIFilePicker.returnCancel) { + this.value = filePicker.file.path; + this.inputChanged(); + } + ]]> + </body> + </method> + + <method name="valueFromPreference"> + <body> + <![CDATA[ + this.value = Services.prefs.getCharPref(this.pref); + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + Services.prefs.setCharPref(this.pref, this.value); + ]]> + </body> + </method> + + <field name="_value"></field> + + <property name="value"> + <getter> + <![CDATA[ + return this._value; + ]]> + </getter> + <setter> + <![CDATA[ + this._value = val; + let label = ""; + if (val) { + try { + let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); + file.initWithPath(val); + label = this.hasAttribute("fullpath") ? file.path : file.leafName; + } catch (e) {} + } + this.input.tooltipText = val; + return this.input.value = label; + ]]> + </setter> + </property> + </implementation> + </binding> + + <binding id="setting-multi" extends="chrome://mozapps/content/extensions/setting.xml#setting-base"> + <content> + <xul:vbox> + <xul:hbox class="preferences-alignment"> + <xul:label class="preferences-title" flex="1" xbl:inherits="xbl:text=title"/> + </xul:hbox> + <xul:description class="preferences-description" flex="1" xbl:inherits="xbl:text=desc"/> + </xul:vbox> + <xul:hbox class="preferences-alignment"> + <children includes="radiogroup|menulist"/> + </xul:hbox> + </content> + + <implementation> + <constructor> + <![CDATA[ + this.control.addEventListener("command", this.inputChanged.bind(this), false); + ]]> + </constructor> + + <method name="valueFromPreference"> + <body> + <![CDATA[ + let val; + switch (Services.prefs.getPrefType(this.pref)) { + case Ci.nsIPrefBranch.PREF_STRING: + val = Services.prefs.getCharPref(this.pref); + break; + case Ci.nsIPrefBranch.PREF_INT: + val = Services.prefs.getIntPref(this.pref); + break; + case Ci.nsIPrefBranch.PREF_BOOL: + val = Services.prefs.getBoolPref(this.pref).toString(); + break; + default: + return; + } + + if ("itemCount" in this.control) { + for (let i = 0; i < this.control.itemCount; i++) { + if (this.control.getItemAtIndex(i).value == val) { + this.control.selectedIndex = i; + break; + } + } + } else { + this.control.setAttribute("value", val); + } + ]]> + </body> + </method> + + <method name="valueToPreference"> + <body> + <![CDATA[ + // We might not have a pref already set, so we guess the type from the value attribute + let val = this.control.selectedItem.value; + if (val == "true" || val == "false") + Services.prefs.setBoolPref(this.pref, val == "true"); + else if (/^-?\d+$/.test(val)) + Services.prefs.setIntPref(this.pref, val); + else + Services.prefs.setCharPref(this.pref, val); + ]]> + </body> + </method> + + <field name="control">this.getElementsByTagName(this.getAttribute("type") == "radio" ? "radiogroup" : "menulist")[0];</field> + </implementation> + </binding> +</bindings> |