3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4 <title>The source code</title>
5 <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
6 <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
8 <body onload="prettyPrint();">
9 <pre class="prettyprint lang-js">/*!
10 * Ext JS Library 3.3.0
11 * Copyright(c) 2006-2010 Ext JS, Inc.
13 * http://www.extjs.com/license
15 <div id="cls-Ext.ux.Spinner"></div>/**
16 * @class Ext.ux.Spinner
17 * @extends Ext.util.Observable
18 * Creates a Spinner control utilized by Ext.ux.form.SpinnerField
20 Ext.ux.Spinner = Ext.extend(Ext.util.Observable, {
22 alternateIncrementValue: 5,
23 triggerClass: 'x-form-spinner-trigger',
24 splitterClass: 'x-form-spinner-splitter',
25 alternateKey: Ext.EventObject.shiftKey,
29 constructor: function(config){
30 Ext.ux.Spinner.superclass.constructor.call(this, config);
31 Ext.apply(this, config);
32 this.mimicing = false;
35 init: function(field){
38 field.afterMethod('onRender', this.doRender, this);
39 field.afterMethod('onEnable', this.doEnable, this);
40 field.afterMethod('onDisable', this.doDisable, this);
41 field.afterMethod('afterRender', this.doAfterRender, this);
42 field.afterMethod('onResize', this.doResize, this);
43 field.afterMethod('onFocus', this.doFocus, this);
44 field.beforeMethod('onDestroy', this.doDestroy, this);
47 doRender: function(ct, position){
48 var el = this.el = this.field.getEl();
52 f.wrap = this.wrap = el.wrap({
53 cls: "x-form-field-wrap"
57 this.wrap = f.wrap.addClass('x-form-field-wrap');
60 this.trigger = this.wrap.createChild({
62 src: Ext.BLANK_IMAGE_URL,
63 cls: "x-form-trigger " + this.triggerClass
67 this.wrap.setWidth(el.getWidth() + this.trigger.getWidth());
70 this.splitter = this.wrap.createChild({
72 cls: this.splitterClass,
73 style: 'width:13px; height:2px;'
75 this.splitter.setRight((Ext.isIE) ? 1 : 2).setTop(10).show();
77 this.proxy = this.trigger.createProxy('', this.splitter, true);
78 this.proxy.addClass("x-form-spinner-proxy");
79 this.proxy.setStyle('left', '0px');
80 this.proxy.setSize(14, 1);
82 this.dd = new Ext.dd.DDProxy(this.splitter.dom.id, "SpinnerDrag", {
83 dragElId: this.proxy.id
90 doAfterRender: function(){
92 if (Ext.isIE && this.el.getY() != (y = this.trigger.getY())) {
100 this.wrap.removeClass(this.field.disabledClass);
104 doDisable: function(){
106 this.wrap.addClass(this.field.disabledClass);
107 this.el.removeClass(this.field.disabledClass);
111 doResize: function(w, h){
112 if (typeof w == 'number') {
113 this.el.setWidth(w - this.trigger.getWidth());
115 this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth());
119 if (!this.mimicing) {
120 this.wrap.addClass('x-trigger-wrap-focus');
121 this.mimicing = true;
122 Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this, {
125 this.el.on('keydown', this.checkTab, this);
130 checkTab: function(e){
131 if (e.getKey() == e.TAB) {
137 mimicBlur: function(e){
138 if (!this.wrap.contains(e.target) && this.field.validateBlur(e)) {
144 triggerBlur: function(){
145 this.mimicing = false;
146 Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur, this);
147 this.el.un("keydown", this.checkTab, this);
148 this.field.beforeBlur();
149 this.wrap.removeClass('x-trigger-wrap-focus');
150 this.field.onBlur.call(this.field);
153 initTrigger: function(){
154 this.trigger.addClassOnOver('x-form-trigger-over');
155 this.trigger.addClassOnClick('x-form-trigger-click');
158 initSpinner: function(){
159 this.field.addEvents({
165 this.keyNav = new Ext.KeyNav(this.el, {
176 "pageUp": function(e){
178 this.onSpinUpAlternate();
181 "pageDown": function(e){
183 this.onSpinDownAlternate();
189 this.repeater = new Ext.util.ClickRepeater(this.trigger, {
190 accelerate: this.accelerate
192 this.field.mon(this.repeater, "click", this.onTriggerClick, this, {
196 this.field.mon(this.trigger, {
197 mouseover: this.onMouseOver,
198 mouseout: this.onMouseOut,
199 mousemove: this.onMouseMove,
200 mousedown: this.onMouseDown,
201 mouseup: this.onMouseUp,
206 this.field.mon(this.wrap, "mousewheel", this.handleMouseWheel, this);
208 this.dd.setXConstraint(0, 0, 10)
209 this.dd.setYConstraint(1500, 1500, 10);
210 this.dd.endDrag = this.endDrag.createDelegate(this);
211 this.dd.startDrag = this.startDrag.createDelegate(this);
212 this.dd.onDrag = this.onDrag.createDelegate(this);
215 onMouseOver: function(){
219 var middle = this.getMiddle();
220 this.tmpHoverClass = (Ext.EventObject.getPageY() < middle) ? 'x-form-spinner-overup' : 'x-form-spinner-overdown';
221 this.trigger.addClass(this.tmpHoverClass);
225 onMouseOut: function(){
226 this.trigger.removeClass(this.tmpHoverClass);
230 onMouseMove: function(){
234 var middle = this.getMiddle();
235 if (((Ext.EventObject.getPageY() > middle) && this.tmpHoverClass == "x-form-spinner-overup") ||
236 ((Ext.EventObject.getPageY() < middle) && this.tmpHoverClass == "x-form-spinner-overdown")) {
241 onMouseDown: function(){
245 var middle = this.getMiddle();
246 this.tmpClickClass = (Ext.EventObject.getPageY() < middle) ? 'x-form-spinner-clickup' : 'x-form-spinner-clickdown';
247 this.trigger.addClass(this.tmpClickClass);
251 onMouseUp: function(){
252 this.trigger.removeClass(this.tmpClickClass);
256 onTriggerClick: function(){
257 if (this.disabled || this.el.dom.readOnly) {
260 var middle = this.getMiddle();
261 var ud = (Ext.EventObject.getPageY() < middle) ? 'Up' : 'Down';
262 this['onSpin' + ud]();
266 getMiddle: function(){
267 var t = this.trigger.getTop();
268 var h = this.trigger.getHeight();
269 var middle = t + (h / 2);
274 //checks if control is allowed to spin
275 isSpinnable: function(){
276 if (this.disabled || this.el.dom.readOnly) {
277 Ext.EventObject.preventDefault(); //prevent scrolling when disabled/readonly
283 handleMouseWheel: function(e){
284 //disable scrolling when not focused
285 if (this.wrap.hasClass('x-trigger-wrap-focus') == false) {
289 var delta = e.getWheelDelta();
302 startDrag: function(){
304 this._previousY = Ext.fly(this.dd.getDragEl()).getTop();
317 var y = Ext.fly(this.dd.getDragEl()).getTop();
320 if (this._previousY > y) {
323 if (this._previousY < y) {
327 this['onSpin' + ud]();
334 onSpinUp: function(){
335 if (this.isSpinnable() == false) {
338 if (Ext.EventObject.shiftKey == true) {
339 this.onSpinUpAlternate();
343 this.spin(false, false);
345 this.field.fireEvent("spin", this);
346 this.field.fireEvent("spinup", this);
350 onSpinDown: function(){
351 if (this.isSpinnable() == false) {
354 if (Ext.EventObject.shiftKey == true) {
355 this.onSpinDownAlternate();
359 this.spin(true, false);
361 this.field.fireEvent("spin", this);
362 this.field.fireEvent("spindown", this);
366 onSpinUpAlternate: function(){
367 if (this.isSpinnable() == false) {
370 this.spin(false, true);
371 this.field.fireEvent("spin", this);
372 this.field.fireEvent("spinup", this);
376 onSpinDownAlternate: function(){
377 if (this.isSpinnable() == false) {
380 this.spin(true, true);
381 this.field.fireEvent("spin", this);
382 this.field.fireEvent("spindown", this);
385 spin: function(down, alternate){
386 var v = parseFloat(this.field.getValue());
387 var incr = (alternate == true) ? this.alternateIncrementValue : this.incrementValue;
388 (down == true) ? v -= incr : v += incr;
390 v = (isNaN(v)) ? this.defaultValue : v;
391 v = this.fixBoundries(v);
392 this.field.setRawValue(v);
395 fixBoundries: function(value){
398 if (this.field.minValue != undefined && v < this.field.minValue) {
399 v = this.field.minValue;
401 if (this.field.maxValue != undefined && v > this.field.maxValue) {
402 v = this.field.maxValue;
405 return this.fixPrecision(v);
409 fixPrecision: function(value){
410 var nan = isNaN(value);
411 if (!this.field.allowDecimals || this.field.decimalPrecision == -1 || nan || !value) {
412 return nan ? '' : value;
414 return parseFloat(parseFloat(value).toFixed(this.field.decimalPrecision));
417 doDestroy: function(){
419 this.trigger.remove();
423 delete this.field.wrap;
427 this.splitter.remove();
440 this.repeater.purgeListeners();
443 Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur, this);
449 Ext.form.Spinner = Ext.ux.Spinner;</pre>