mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-16 12:30:13 +01:00
386 lines
15 KiB
XML
386 lines
15 KiB
XML
<?xml version="1.0"?>
|
|
|
|
<bindings id="generalBindings"
|
|
xmlns="http://www.mozilla.org/xbl"
|
|
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
|
xmlns:xbl="http://www.mozilla.org/xbl">
|
|
|
|
<binding id="basecontrol">
|
|
<implementation implements="nsIDOMXULControlElement">
|
|
<!-- public implementation -->
|
|
<property name="disabled" onset="if (val) this.setAttribute('disabled', 'true');
|
|
else this.removeAttribute('disabled');
|
|
return val;"
|
|
onget="return this.getAttribute('disabled') == 'true';"/>
|
|
<property name="tabIndex" onget="return parseInt(this.getAttribute('tabindex'));"
|
|
onset="if (val) this.setAttribute('tabindex', val);
|
|
else this.removeAttribute('tabindex'); return val;"/>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="basetext" extends="chrome://global/content/bindings/general.xml#basecontrol">
|
|
<implementation>
|
|
<!-- public implementation -->
|
|
<property name="label" onset="return this.setAttribute('label',val);"
|
|
onget="return this.getAttribute('label');"/>
|
|
<property name="crop" onset="return this.setAttribute('crop',val);"
|
|
onget="return this.getAttribute('crop');"/>
|
|
<property name="image" onset="return this.setAttribute('image',val);"
|
|
onget="return this.getAttribute('image');"/>
|
|
<property name="accessKey">
|
|
<getter>
|
|
<![CDATA[
|
|
return this.labelElement ? this.labelElement.accessKey : this.getAttribute('accesskey');
|
|
]]>
|
|
</getter>
|
|
<setter>
|
|
<![CDATA[
|
|
// Always store on the control
|
|
this.setAttribute('accesskey', val);
|
|
// If there is a label, change the accesskey on the labelElement
|
|
// if it's also set there
|
|
if (this.labelElement) {
|
|
this.labelElement.accessKey = val;
|
|
}
|
|
return val;
|
|
]]>
|
|
</setter>
|
|
</property>
|
|
|
|
<field name="labelElement"/>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="control-item" extends="chrome://global/content/bindings/general.xml#basetext">
|
|
<implementation>
|
|
<property name="value" onset="return this.setAttribute('value', val);"
|
|
onget="return this.getAttribute('value');"/>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<!--
|
|
Inline Editable UI Element
|
|
- This binding forms the basis of the inline edit treecell and the inline edit
|
|
- buttons.
|
|
- TODO: investigate creating extensions to the wrapper widgets (tree, toolbar)
|
|
- to make them provide some object implementing an interface similar to
|
|
- tree's so we can build in some of the ILE behavior (such as going
|
|
- in and out of the mode, asking isEditable etc) so as to remove some of
|
|
- the burden from the implementor.
|
|
-
|
|
- Note that this widget will be no longer used in the bookmarks window once
|
|
- tree is extended to have this functionality built in.
|
|
-->
|
|
<binding id="inline-edit-base" extends="chrome://global/content/bindings/general.xml#basetext">
|
|
<implementation>
|
|
<field name="_mode">0</field>
|
|
<method name="setMode">
|
|
<parameter name="val"/>
|
|
<body>
|
|
<![CDATA[
|
|
var ctr = document.getAnonymousElementByAttribute(this, "ileattr", "text-container");
|
|
var txt = document.getAnonymousElementByAttribute(this, "ileattr", "text");
|
|
this.setAttribute("mode", val);
|
|
if (val == "edit") {
|
|
var nodes = document.getAnonymousNodes(this);
|
|
|
|
if (txt.getAttribute("hidden") != "true") {
|
|
ctr.setAttribute("mode", "edit");
|
|
var width = ctr.boxObject.width;
|
|
txt.setAttribute("hidden", "true");
|
|
const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
|
var field = document.createElementNS(kXULNS, "textbox");
|
|
field.className = "textbox-inline-edit";
|
|
field.setAttribute("flex", "1");
|
|
field.setAttribute("value", txt.getAttribute("value"));
|
|
field.setAttribute("ileattr", "field");
|
|
field.setAttribute("rootcontent", txt.getAttribute("rootcontent"));
|
|
field.setAttribute("style", "width: " + width + "px");
|
|
ctr.appendChild(field);
|
|
field.addEventListener("keydown", this.fieldKeyDown, false);
|
|
field.addEventListener("change", this.fieldChange, false);
|
|
field.select();
|
|
}
|
|
}
|
|
else {
|
|
nodes = document.getAnonymousNodes(this);
|
|
var fld = document.getAnonymousElementByAttribute(this, "ileattr", "field");
|
|
if (fld && txt.getAttribute("hidden") == "true") {
|
|
ctr.removeAttribute("mode");
|
|
fld.blur();
|
|
ctr.removeChild(fld);
|
|
txt.removeAttribute("hidden");
|
|
}
|
|
}
|
|
]]>
|
|
</body>
|
|
</method>
|
|
<field name="_observers">
|
|
<![CDATA[
|
|
({
|
|
reject: [],
|
|
accept: []
|
|
})
|
|
]]>
|
|
</field>
|
|
<field name="valueIsRejected">false</field>
|
|
<method name="addObserver">
|
|
<parameter name="aObserver"/>
|
|
<parameter name="aTopic"/>
|
|
<parameter name="aParams"/>
|
|
<body>
|
|
this._observers[aTopic].push({ callback: aObserver, params: aParams });
|
|
</body>
|
|
</method>
|
|
<method name="fieldKeyDown">
|
|
<parameter name="aEvent"/>
|
|
<body>
|
|
<![CDATA[
|
|
var rootLocalName = aEvent.target.getAttribute("rootcontent");
|
|
if (rootLocalName) {
|
|
// Root content is the bound element.
|
|
var rootContent = aEvent.target;
|
|
while (rootContent && rootContent.localName != rootLocalName)
|
|
rootContent = rootContent.parentNode;
|
|
|
|
if (rootContent) {
|
|
var ctr = document.getAnonymousElementByAttribute(rootContent, "ileattr", "text-container");
|
|
if (aEvent.keyCode == 13) {
|
|
rootContent.valueIsRejected = false;
|
|
rootContent.fieldChange(aEvent);
|
|
}
|
|
if (aEvent.keyCode == 27) {
|
|
rootContent.valueIsRejected = true;
|
|
var fld = document.getAnonymousElementByAttribute(rootContent, "ileattr", "field");
|
|
for (i = 0; i < rootContent._observers["reject"].length; ++i)
|
|
rootContent._observers["reject"][i].callback(rootContent._observers["reject"][i].params.concat(fld.value), "reject");
|
|
if ("setMode" in rootContent)
|
|
rootContent.setMode("normal");
|
|
}
|
|
}
|
|
}
|
|
aEvent.stopPropagation();
|
|
]]>
|
|
</body>
|
|
</method>
|
|
<field name="valueIsAccepted">false</field>
|
|
<method name="fieldChange">
|
|
<parameter name="aEvent"/>
|
|
<body>
|
|
<![CDATA[
|
|
var rootLocalName = this.getAttribute("rootcontent");
|
|
if (rootLocalName) {
|
|
// Root content is the bound element.
|
|
var rootContent = this;
|
|
while (rootContent && rootContent.localName != rootLocalName)
|
|
rootContent = rootContent.parentNode;
|
|
|
|
if (rootContent) {
|
|
var ctr = document.getAnonymousElementByAttribute(rootContent, "ileattr", "text-container");
|
|
if (!rootContent.valueIsRejected) {
|
|
var fld = document.getAnonymousElementByAttribute(rootContent, "ileattr", "field");
|
|
for (var i = 0; i < rootContent._observers["accept"].length; ++i)
|
|
rootContent._observers["accept"][i].callback(rootContent._observers["accept"][i].params.concat(fld.value), "accept");
|
|
if ("setMode" in rootContent)
|
|
rootContent.setMode("normal");
|
|
}
|
|
}
|
|
}
|
|
]]>
|
|
</body>
|
|
</method>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<!-- inline editable buttons -->
|
|
<binding id="buttonleft-ile" extends="chrome://global/content/bindings/general.xml#inline-edit-base">
|
|
<content>
|
|
<xul:hbox class="button-internal-box" align="center" flex="1">
|
|
<xul:image class="button-icon" xbl:inherits="src"/>
|
|
<xul:hbox class="button-text-container" flex="1" ileattr="text-container">
|
|
<xul:label class="button-text" xbl:inherits="value=label,accesskey,crop,dragover-top" ileattr="text" rootcontent="button" flex="1"/>
|
|
</xul:hbox>
|
|
</xul:hbox>
|
|
<children includes="menupopup"/>
|
|
</content>
|
|
</binding>
|
|
|
|
<binding id="iframe">
|
|
<implementation implements="nsIAccessibleProvider">
|
|
<property name="accessible">
|
|
<getter>
|
|
<![CDATA[
|
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
|
return accService.createOuterDocAccessible(this);
|
|
]]>
|
|
</getter>
|
|
</property>
|
|
<property name="docShell"
|
|
readonly="true"
|
|
onget="return this.boxObject.QueryInterface(Components.interfaces.nsIIFrameBoxObject).docShell"/>
|
|
<property name="contentWindow"
|
|
readonly="true"
|
|
onget="return this.docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow);"/>
|
|
<property name="webNavigation"
|
|
onget="return this.docShell.QueryInterface(Components.interfaces.nsIWebNavigation);"
|
|
readonly="true"/>
|
|
<property name="contentDocument" readonly="true"
|
|
onget="return this.webNavigation.document;"/>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="statusbarpanel" display="xul:button">
|
|
<content>
|
|
<children>
|
|
<xul:label class="statusbarpanel-text" xbl:inherits="value=label,crop" crop="right" flex="1"/>
|
|
</children>
|
|
</content>
|
|
|
|
<implementation>
|
|
<property name="label"
|
|
onget="return this.getAttribute('label');"
|
|
onset="this.setAttribute('label',val); return val;"/>
|
|
<property name="src"
|
|
onget="return this.getAttribute('src');"
|
|
onset="this.setAttribute('src',val); return val;"/>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="statusbarpanel-menu-iconic" display="xul:menu"
|
|
extends="chrome://global/content/bindings/general.xml#statusbarpanel">
|
|
<content>
|
|
<xul:image class="statusbarpanel-icon" xbl:inherits="src"/>
|
|
<children/>
|
|
</content>
|
|
</binding>
|
|
|
|
<binding id="statusbar">
|
|
<content>
|
|
<children/>
|
|
<xul:statusbarpanel class="statusbar-resizerpanel">
|
|
<xul:resizer dir="bottomright"/>
|
|
</xul:statusbarpanel>
|
|
</content>
|
|
|
|
<implementation implements="nsIAccessibleProvider">
|
|
<property name="accessible">
|
|
<getter>
|
|
<![CDATA[
|
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
|
return accService.createXULStatusBarAccessible(this);
|
|
]]>
|
|
</getter>
|
|
</property>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="statusbarpanel-iconic" display="xul:button"
|
|
extends="chrome://global/content/bindings/general.xml#statusbarpanel">
|
|
<content>
|
|
<xul:image class="statusbarpanel-icon" xbl:inherits="src"/>
|
|
</content>
|
|
|
|
<implementation implements="nsIAccessibleProvider">
|
|
<property name="accessible">
|
|
<getter>
|
|
<![CDATA[
|
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
|
return accService.createXULButtonAccessible(this);
|
|
]]>
|
|
</getter>
|
|
</property>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="statusbarpanel-iconic-text" display="xul:button"
|
|
extends="chrome://global/content/bindings/general.xml#statusbarpanel">
|
|
<content>
|
|
<xul:image class="statusbarpanel-icon" xbl:inherits="src"/>
|
|
<xul:label class="statusbarpanel-text" xbl:inherits="value=label,crop"/>
|
|
</content>
|
|
</binding>
|
|
|
|
<binding id="image">
|
|
<implementation implements="nsIDOMXULImageElement, nsIAccessibleProvider">
|
|
<property name="src"
|
|
onget="return this.getAttribute('src');"
|
|
onset="this.setAttribute('src',val); return val;"/>
|
|
<property name="accessible">
|
|
<getter>
|
|
<![CDATA[
|
|
try {
|
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"]
|
|
.getService(Components.interfaces.nsIAccessibilityService);
|
|
return accService.createXULImageAccessible(this);
|
|
}
|
|
catch(ex) { /* no chrome privileges */ }
|
|
|
|
return null;
|
|
]]>
|
|
</getter>
|
|
</property>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="deck">
|
|
<implementation>
|
|
<property name="selectedIndex"
|
|
onget="return this.getAttribute('selectedIndex');">
|
|
<setter>
|
|
<![CDATA[
|
|
if (this.selectedIndex == val)
|
|
return val;
|
|
this.setAttribute("selectedIndex", val);
|
|
var event = document.createEvent('Events');
|
|
event.initEvent('select', true, true);
|
|
this.dispatchEvent(event);
|
|
return val;
|
|
]]>
|
|
</setter>
|
|
</property>
|
|
|
|
<property name="selectedPanel">
|
|
<getter>
|
|
<![CDATA[
|
|
return this.childNodes[this.selectedIndex];
|
|
]]>
|
|
</getter>
|
|
|
|
<setter>
|
|
<![CDATA[
|
|
var selectedIndex = -1;
|
|
for (var panel = val; panel != null; panel = panel.previousSibling)
|
|
++selectedIndex;
|
|
this.selectedIndex = selectedIndex;
|
|
return val;
|
|
]]>
|
|
</setter>
|
|
</property>
|
|
</implementation>
|
|
</binding>
|
|
|
|
<binding id="dropmarker">
|
|
<content>
|
|
<xul:image class="dropmarker-icon"/>
|
|
</content>
|
|
|
|
<implementation implements="nsIAccessibleProvider">
|
|
<property name="accessible">
|
|
<getter>
|
|
<![CDATA[
|
|
try {
|
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"]
|
|
.getService(Components.interfaces.nsIAccessibilityService);
|
|
return accService.createXULDropmarkerAccessible(this);
|
|
}
|
|
catch(ex) { /* no chrome privileges */ }
|
|
|
|
return null;
|
|
]]>
|
|
</getter>
|
|
</property>
|
|
</implementation>
|
|
</binding>
|
|
|
|
</bindings>
|