gecko/toolkit/content/widgets/progressmeter.xml

115 lines
3.8 KiB
XML

<?xml version="1.0"?>
<bindings id="progressmeterBindings"
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="progressmeter">
<resources>
<stylesheet src="chrome://global/skin/progressmeter.css"/>
</resources>
<content>
<xul:spacer class="progress-bar" xbl:inherits="mode"/>
<xul:spacer class="progress-remainder" xbl:inherits="mode"/>
</content>
<implementation implements="nsIAccessibleProvider">
<property name="mode" onset="if (this.mode != val) this.setAttribute('mode', val); return val;"
onget="return this.getAttribute('mode');"/>
<property name="value" onget="return this.getAttribute('value') || '0';">
<setter><![CDATA[
var p = Math.round(val);
if (p < 0)
p = 0;
else if (p > 100)
p = 100;
var c = this.value;
if (p != c) {
var delta = p - c;
if (delta < 0)
delta = -delta;
if (delta > 3 || p == 0 || p == 100) {
this.setAttribute("value", p);
// Fire DOM event so that accessible value change events occur
var event = document.createEvent('Events');
event.initEvent('ValueChange', true, true);
this.dispatchEvent(event);
}
}
return val;
]]></setter>
</property>
<property name="accessibleType" readonly="true">
<getter>
<![CDATA[
return Components.interfaces.nsIAccessibleProvider.XULProgressMeter;
]]>
</getter>
</property>
</implementation>
</binding>
<binding id="progressmeter-undetermined"
extends="chrome://global/content/bindings/progressmeter.xml#progressmeter">
<content>
<xul:stack class="progress-remainder" flex="1" anonid="stack" style="overflow: -moz-hidden-unscrollable;">
<xul:spacer class="progress-bar" anonid="spacer" top="0" style="margin-right: -1000px;"/>
</xul:stack>
</content>
<implementation>
<method name="_init">
<body><![CDATA[
var stack = document.getAnonymousElementByAttribute(this, "anonid", "stack");
var spacer = document.getAnonymousElementByAttribute(this, "anonid", "spacer");
var isLTR =
document.defaultView.getComputedStyle(this, null).direction == "ltr";
var position = isLTR ? 4 : -1;
var interval = setInterval(function nextStep() {
try {
var width = stack.boxObject.width;
if (!width) {
// Maybe we've been removed from the document.
var currentNode = stack;
while (currentNode && currentNode != stack.ownerDocument) {
currentNode = currentNode.parentNode;
}
if (!currentNode) {
clearInterval(interval);
return;
}
}
width = width >> 2;
spacer.height = stack.boxObject.height;
spacer.width = width;
spacer.left = width * position;
if (isLTR) {
position += 15 / (width + 150);
if (position >= 4)
position = -1;
}
else {
position -= 15 / (width + 150);
if (position < 0)
position = 4;
}
} catch (e) {
clearInterval(interval);
}
}, 20);
]]></body>
</method>
<constructor>this._init();</constructor>
</implementation>
</binding>
</bindings>