|
1 <?xml version="1.0"?> |
|
2 <!-- This Source Code Form is subject to the terms of the Mozilla Public |
|
3 - License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> |
|
5 |
|
6 |
|
7 <bindings id="scaleBindings" |
|
8 xmlns="http://www.mozilla.org/xbl" |
|
9 xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" |
|
10 xmlns:xbl="http://www.mozilla.org/xbl"> |
|
11 |
|
12 <binding id="scalethumb" extends="xul:button" role="xul:thumb"> |
|
13 <resources> |
|
14 <stylesheet src="chrome://global/skin/scale.css"/> |
|
15 </resources> |
|
16 </binding> |
|
17 |
|
18 <binding id="scaleslider" display="xul:slider" |
|
19 extends="chrome://global/content/bindings/general.xml#basecontrol"> |
|
20 <resources> |
|
21 <stylesheet src="chrome://global/skin/scale.css"/> |
|
22 </resources> |
|
23 </binding> |
|
24 |
|
25 <binding id="scale" role="xul:scale" |
|
26 extends="chrome://global/content/bindings/general.xml#basecontrol"> |
|
27 <resources> |
|
28 <stylesheet src="chrome://global/skin/scale.css"/> |
|
29 </resources> |
|
30 |
|
31 <content align="center" pack="center"> |
|
32 <xul:slider anonid="slider" class="scale-slider" snap="true" flex="1" |
|
33 xbl:inherits="disabled,orient,dir,curpos=value,minpos=min,maxpos=max,increment,pageincrement,movetoclick"> |
|
34 <xul:thumb class="scale-thumb" xbl:inherits="disabled,orient"/> |
|
35 </xul:slider> |
|
36 </content> |
|
37 |
|
38 <implementation implements="nsISliderListener"> |
|
39 <property name="value" onget="return this._getIntegerAttribute('curpos', 0);" |
|
40 onset="return this._setIntegerAttribute('curpos', val);"/> |
|
41 <property name="min" onget="return this._getIntegerAttribute('minpos', 0);" |
|
42 onset="return this._setIntegerAttribute('minpos', val);"/> |
|
43 <property name="max" onget="return this._getIntegerAttribute('maxpos', 100);" |
|
44 onset="return this._setIntegerAttribute('maxpos', val);"/> |
|
45 <property name="increment" onget="return this._getIntegerAttribute('increment', 1);" |
|
46 onset="return this._setIntegerAttribute('increment', val);"/> |
|
47 <property name="pageIncrement" onget="return this._getIntegerAttribute('pageincrement', 10);" |
|
48 onset="return this._setIntegerAttribute('pageincrement', val);"/> |
|
49 |
|
50 <property name="_slider" readonly="true"> |
|
51 <getter> |
|
52 if (!this._sliderElement) |
|
53 this._sliderElement = document.getAnonymousElementByAttribute(this, "anonid", "slider"); |
|
54 return this._sliderElement; |
|
55 </getter> |
|
56 </property> |
|
57 |
|
58 <constructor> |
|
59 <![CDATA[ |
|
60 this._userChanged = false; |
|
61 var value = parseInt(this.getAttribute("value"), 10); |
|
62 if (!isNaN(value)) |
|
63 this.value = value; |
|
64 else if (this.min > 0) |
|
65 this.value = this.min; |
|
66 else if (this.max < 0) |
|
67 this.value = this.max; |
|
68 ]]> |
|
69 </constructor> |
|
70 |
|
71 <method name="_getIntegerAttribute"> |
|
72 <parameter name="aAttr"/> |
|
73 <parameter name="aDefaultValue"/> |
|
74 <body> |
|
75 var value = this._slider.getAttribute(aAttr); |
|
76 var intvalue = parseInt(value, 10); |
|
77 if (!isNaN(intvalue)) |
|
78 return intvalue; |
|
79 return aDefaultValue; |
|
80 </body> |
|
81 </method> |
|
82 |
|
83 <method name="_setIntegerAttribute"> |
|
84 <parameter name="aAttr"/> |
|
85 <parameter name="aValue"/> |
|
86 <body> |
|
87 <![CDATA[ |
|
88 var intvalue = parseInt(aValue, 10); |
|
89 if (!isNaN(intvalue)) { |
|
90 if (aAttr == "curpos") { |
|
91 if (intvalue < this.min) |
|
92 intvalue = this.min; |
|
93 else if (intvalue > this.max) |
|
94 intvalue = this.max; |
|
95 } |
|
96 this._slider.setAttribute(aAttr, intvalue); |
|
97 } |
|
98 return aValue; |
|
99 ]]> |
|
100 </body> |
|
101 </method> |
|
102 |
|
103 <method name="decrease"> |
|
104 <body> |
|
105 <![CDATA[ |
|
106 var newpos = this.value - this.increment; |
|
107 var startpos = this.min; |
|
108 this.value = (newpos > startpos) ? newpos : startpos; |
|
109 ]]> |
|
110 </body> |
|
111 </method> |
|
112 <method name="increase"> |
|
113 <body> |
|
114 <![CDATA[ |
|
115 var newpos = this.value + this.increment; |
|
116 var endpos = this.max; |
|
117 this.value = (newpos < endpos) ? newpos : endpos; |
|
118 ]]> |
|
119 </body> |
|
120 </method> |
|
121 |
|
122 <method name="decreasePage"> |
|
123 <body> |
|
124 <![CDATA[ |
|
125 var newpos = this.value - this.pageIncrement; |
|
126 var startpos = this.min; |
|
127 this.value = (newpos > startpos) ? newpos : startpos; |
|
128 ]]> |
|
129 </body> |
|
130 </method> |
|
131 <method name="increasePage"> |
|
132 <body> |
|
133 <![CDATA[ |
|
134 var newpos = this.value + this.pageIncrement; |
|
135 var endpos = this.max; |
|
136 this.value = (newpos < endpos) ? newpos : endpos; |
|
137 ]]> |
|
138 </body> |
|
139 </method> |
|
140 |
|
141 <method name="valueChanged"> |
|
142 <parameter name="which"/> |
|
143 <parameter name="newValue"/> |
|
144 <parameter name="userChanged"/> |
|
145 <body> |
|
146 <![CDATA[ |
|
147 switch (which) { |
|
148 case "curpos": |
|
149 this.setAttribute("value", newValue); |
|
150 |
|
151 // in the future, only fire the change event when userChanged |
|
152 // or _userChanged is true |
|
153 var changeEvent = document.createEvent("Events"); |
|
154 changeEvent.initEvent("change", true, true); |
|
155 this.dispatchEvent(changeEvent); |
|
156 break; |
|
157 |
|
158 case "minpos": |
|
159 this.setAttribute("min", newValue); |
|
160 break; |
|
161 |
|
162 case "maxpos": |
|
163 this.setAttribute("max", newValue); |
|
164 break; |
|
165 } |
|
166 ]]> |
|
167 </body> |
|
168 </method> |
|
169 |
|
170 <method name="dragStateChanged"> |
|
171 <parameter name="isDragging"/> |
|
172 <body/> |
|
173 </method> |
|
174 </implementation> |
|
175 |
|
176 <handlers> |
|
177 <handler event="keypress" keycode="VK_LEFT" preventdefault="true"> |
|
178 <![CDATA[ |
|
179 this._userChanged = true; |
|
180 (this.orient != "vertical" && this.dir == "reverse") ? this.increase() : this.decrease(); |
|
181 this._userChanged = false; |
|
182 ]]> |
|
183 </handler> |
|
184 <handler event="keypress" keycode="VK_RIGHT" preventdefault="true"> |
|
185 <![CDATA[ |
|
186 this._userChanged = true; |
|
187 (this.orient != "vertical" && this.dir == "reverse") ? this.decrease() : this.increase(); |
|
188 this._userChanged = false; |
|
189 ]]> |
|
190 </handler> |
|
191 <handler event="keypress" keycode="VK_UP" preventdefault="true"> |
|
192 <![CDATA[ |
|
193 this._userChanged = true; |
|
194 (this.orient == "vertical" && this.dir != "reverse") ? this.decrease() : this.increase(); |
|
195 this._userChanged = false; |
|
196 ]]> |
|
197 </handler> |
|
198 <handler event="keypress" keycode="VK_DOWN" preventdefault="true"> |
|
199 <![CDATA[ |
|
200 this._userChanged = true; |
|
201 (this.orient == "vertical" && this.dir != "reverse") ? this.increase() : this.decrease(); |
|
202 this._userChanged = false; |
|
203 ]]> |
|
204 </handler> |
|
205 <handler event="keypress" keycode="VK_PAGE_UP" preventdefault="true"> |
|
206 <![CDATA[ |
|
207 this._userChanged = true; |
|
208 (this.orient == "vertical" && this.dir != "reverse") ? this.decreasePage() : this.increasePage(); |
|
209 this._userChanged = false; |
|
210 ]]> |
|
211 </handler> |
|
212 <handler event="keypress" keycode="VK_PAGE_DOWN" preventdefault="true"> |
|
213 <![CDATA[ |
|
214 this._userChanged = true; |
|
215 (this.orient == "vertical" && this.dir != "reverse") ? this.increasePage() : this.decreasePage(); |
|
216 this._userChanged = false; |
|
217 ]]> |
|
218 </handler> |
|
219 <handler event="keypress" keycode="VK_HOME" preventdefault="true"> |
|
220 this._userChanged = true; |
|
221 this.value = (this.dir == "reverse") ? this.max : this.min; |
|
222 this._userChanged = false; |
|
223 </handler> |
|
224 <handler event="keypress" keycode="VK_END" preventdefault="true"> |
|
225 this._userChanged = true; |
|
226 this.value = (this.dir == "reverse") ? this.min : this.max; |
|
227 this._userChanged = false; |
|
228 </handler> |
|
229 </handlers> |
|
230 |
|
231 </binding> |
|
232 </bindings> |