Spinner.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:12k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.ux.Spinner
  3.  * @extends Ext.util.Observable
  4.  * Creates a Spinner control utilized by Ext.ux.form.SpinnerField
  5.  */
  6. Ext.ux.Spinner = Ext.extend(Ext.util.Observable, {
  7.     incrementValue: 1,
  8.     alternateIncrementValue: 5,
  9.     triggerClass: 'x-form-spinner-trigger',
  10.     splitterClass: 'x-form-spinner-splitter',
  11.     alternateKey: Ext.EventObject.shiftKey,
  12.     defaultValue: 0,
  13.     accelerate: false,
  14.     constructor: function(config){
  15.         Ext.ux.Spinner.superclass.constructor.call(this, config);
  16.         Ext.apply(this, config);
  17.         this.mimicing = false;
  18.     },
  19.     init: function(field){
  20.         this.field = field;
  21.         field.afterMethod('onRender', this.doRender, this);
  22.         field.afterMethod('onEnable', this.doEnable, this);
  23.         field.afterMethod('onDisable', this.doDisable, this);
  24.         field.afterMethod('afterRender', this.doAfterRender, this);
  25.         field.afterMethod('onResize', this.doResize, this);
  26.         field.afterMethod('onFocus', this.doFocus, this);
  27.         field.beforeMethod('onDestroy', this.doDestroy, this);
  28.     },
  29.     doRender: function(ct, position){
  30.         var el = this.el = this.field.getEl();
  31.         var f = this.field;
  32.         if (!f.wrap) {
  33.             f.wrap = this.wrap = el.wrap({
  34.                 cls: "x-form-field-wrap"
  35.             });
  36.         }
  37.         else {
  38.             this.wrap = f.wrap.addClass('x-form-field-wrap');
  39.         }
  40.         this.trigger = this.wrap.createChild({
  41.             tag: "img",
  42.             src: Ext.BLANK_IMAGE_URL,
  43.             cls: "x-form-trigger " + this.triggerClass
  44.         });
  45.         if (!f.width) {
  46.             this.wrap.setWidth(el.getWidth() + this.trigger.getWidth());
  47.         }
  48.         this.splitter = this.wrap.createChild({
  49.             tag: 'div',
  50.             cls: this.splitterClass,
  51.             style: 'width:13px; height:2px;'
  52.         });
  53.         this.splitter.setRight((Ext.isIE) ? 1 : 2).setTop(10).show();
  54.         this.proxy = this.trigger.createProxy('', this.splitter, true);
  55.         this.proxy.addClass("x-form-spinner-proxy");
  56.         this.proxy.setStyle('left', '0px');
  57.         this.proxy.setSize(14, 1);
  58.         this.proxy.hide();
  59.         this.dd = new Ext.dd.DDProxy(this.splitter.dom.id, "SpinnerDrag", {
  60.             dragElId: this.proxy.id
  61.         });
  62.         this.initTrigger();
  63.         this.initSpinner();
  64.     },
  65.     doAfterRender: function(){
  66.         var y;
  67.         if (Ext.isIE && this.el.getY() != (y = this.trigger.getY())) {
  68.             this.el.position();
  69.             this.el.setY(y);
  70.         }
  71.     },
  72.     doEnable: function(){
  73.         if (this.wrap) {
  74.             this.wrap.removeClass(this.field.disabledClass);
  75.         }
  76.     },
  77.     doDisable: function(){
  78.         if (this.wrap) {
  79.             this.wrap.addClass(this.field.disabledClass);
  80.             this.el.removeClass(this.field.disabledClass);
  81.         }
  82.     },
  83.     doResize: function(w, h){
  84.         if (typeof w == 'number') {
  85.             this.el.setWidth(w - this.trigger.getWidth());
  86.         }
  87.         this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth());
  88.     },
  89.     doFocus: function(){
  90.         if (!this.mimicing) {
  91.             this.wrap.addClass('x-trigger-wrap-focus');
  92.             this.mimicing = true;
  93.             Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this, {
  94.                 delay: 10
  95.             });
  96.             this.el.on('keydown', this.checkTab, this);
  97.         }
  98.     },
  99.     // private
  100.     checkTab: function(e){
  101.         if (e.getKey() == e.TAB) {
  102.             this.triggerBlur();
  103.         }
  104.     },
  105.     // private
  106.     mimicBlur: function(e){
  107.         if (!this.wrap.contains(e.target) && this.field.validateBlur(e)) {
  108.             this.triggerBlur();
  109.         }
  110.     },
  111.     // private
  112.     triggerBlur: function(){
  113.         this.mimicing = false;
  114.         Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur, this);
  115.         this.el.un("keydown", this.checkTab, this);
  116.         this.field.beforeBlur();
  117.         this.wrap.removeClass('x-trigger-wrap-focus');
  118.         this.field.onBlur.call(this.field);
  119.     },
  120.     initTrigger: function(){
  121.         this.trigger.addClassOnOver('x-form-trigger-over');
  122.         this.trigger.addClassOnClick('x-form-trigger-click');
  123.     },
  124.     initSpinner: function(){
  125.         this.field.addEvents({
  126.             'spin': true,
  127.             'spinup': true,
  128.             'spindown': true
  129.         });
  130.         this.keyNav = new Ext.KeyNav(this.el, {
  131.             "up": function(e){
  132.                 e.preventDefault();
  133.                 this.onSpinUp();
  134.             },
  135.             "down": function(e){
  136.                 e.preventDefault();
  137.                 this.onSpinDown();
  138.             },
  139.             "pageUp": function(e){
  140.                 e.preventDefault();
  141.                 this.onSpinUpAlternate();
  142.             },
  143.             "pageDown": function(e){
  144.                 e.preventDefault();
  145.                 this.onSpinDownAlternate();
  146.             },
  147.             scope: this
  148.         });
  149.         this.repeater = new Ext.util.ClickRepeater(this.trigger, {
  150.             accelerate: this.accelerate
  151.         });
  152.         this.field.mon(this.repeater, "click", this.onTriggerClick, this, {
  153.             preventDefault: true
  154.         });
  155.         this.field.mon(this.trigger, {
  156.             mouseover: this.onMouseOver,
  157.             mouseout: this.onMouseOut,
  158.             mousemove: this.onMouseMove,
  159.             mousedown: this.onMouseDown,
  160.             mouseup: this.onMouseUp,
  161.             scope: this,
  162.             preventDefault: true
  163.         });
  164.         this.field.mon(this.wrap, "mousewheel", this.handleMouseWheel, this);
  165.         this.dd.setXConstraint(0, 0, 10)
  166.         this.dd.setYConstraint(1500, 1500, 10);
  167.         this.dd.endDrag = this.endDrag.createDelegate(this);
  168.         this.dd.startDrag = this.startDrag.createDelegate(this);
  169.         this.dd.onDrag = this.onDrag.createDelegate(this);
  170.     },
  171.     onMouseOver: function(){
  172.         if (this.disabled) {
  173.             return;
  174.         }
  175.         var middle = this.getMiddle();
  176.         this.tmpHoverClass = (Ext.EventObject.getPageY() < middle) ? 'x-form-spinner-overup' : 'x-form-spinner-overdown';
  177.         this.trigger.addClass(this.tmpHoverClass);
  178.     },
  179.     //private
  180.     onMouseOut: function(){
  181.         this.trigger.removeClass(this.tmpHoverClass);
  182.     },
  183.     //private
  184.     onMouseMove: function(){
  185.         if (this.disabled) {
  186.             return;
  187.         }
  188.         var middle = this.getMiddle();
  189.         if (((Ext.EventObject.getPageY() > middle) && this.tmpHoverClass == "x-form-spinner-overup") ||
  190.         ((Ext.EventObject.getPageY() < middle) && this.tmpHoverClass == "x-form-spinner-overdown")) {
  191.         }
  192.     },
  193.     //private
  194.     onMouseDown: function(){
  195.         if (this.disabled) {
  196.             return;
  197.         }
  198.         var middle = this.getMiddle();
  199.         this.tmpClickClass = (Ext.EventObject.getPageY() < middle) ? 'x-form-spinner-clickup' : 'x-form-spinner-clickdown';
  200.         this.trigger.addClass(this.tmpClickClass);
  201.     },
  202.     //private
  203.     onMouseUp: function(){
  204.         this.trigger.removeClass(this.tmpClickClass);
  205.     },
  206.     //private
  207.     onTriggerClick: function(){
  208.         if (this.disabled || this.el.dom.readOnly) {
  209.             return;
  210.         }
  211.         var middle = this.getMiddle();
  212.         var ud = (Ext.EventObject.getPageY() < middle) ? 'Up' : 'Down';
  213.         this['onSpin' + ud]();
  214.     },
  215.     //private
  216.     getMiddle: function(){
  217.         var t = this.trigger.getTop();
  218.         var h = this.trigger.getHeight();
  219.         var middle = t + (h / 2);
  220.         return middle;
  221.     },
  222.     //private
  223.     //checks if control is allowed to spin
  224.     isSpinnable: function(){
  225.         if (this.disabled || this.el.dom.readOnly) {
  226.             Ext.EventObject.preventDefault(); //prevent scrolling when disabled/readonly
  227.             return false;
  228.         }
  229.         return true;
  230.     },
  231.     handleMouseWheel: function(e){
  232.         //disable scrolling when not focused
  233.         if (this.wrap.hasClass('x-trigger-wrap-focus') == false) {
  234.             return;
  235.         }
  236.         var delta = e.getWheelDelta();
  237.         if (delta > 0) {
  238.             this.onSpinUp();
  239.             e.stopEvent();
  240.         }
  241.         else
  242.             if (delta < 0) {
  243.                 this.onSpinDown();
  244.                 e.stopEvent();
  245.             }
  246.     },
  247.     //private
  248.     startDrag: function(){
  249.         this.proxy.show();
  250.         this._previousY = Ext.fly(this.dd.getDragEl()).getTop();
  251.     },
  252.     //private
  253.     endDrag: function(){
  254.         this.proxy.hide();
  255.     },
  256.     //private
  257.     onDrag: function(){
  258.         if (this.disabled) {
  259.             return;
  260.         }
  261.         var y = Ext.fly(this.dd.getDragEl()).getTop();
  262.         var ud = '';
  263.         if (this._previousY > y) {
  264.             ud = 'Up';
  265.         } //up
  266.         if (this._previousY < y) {
  267.             ud = 'Down';
  268.         } //down
  269.         if (ud != '') {
  270.             this['onSpin' + ud]();
  271.         }
  272.         this._previousY = y;
  273.     },
  274.     //private
  275.     onSpinUp: function(){
  276.         if (this.isSpinnable() == false) {
  277.             return;
  278.         }
  279.         if (Ext.EventObject.shiftKey == true) {
  280.             this.onSpinUpAlternate();
  281.             return;
  282.         }
  283.         else {
  284.             this.spin(false, false);
  285.         }
  286.         this.field.fireEvent("spin", this);
  287.         this.field.fireEvent("spinup", this);
  288.     },
  289.     //private
  290.     onSpinDown: function(){
  291.         if (this.isSpinnable() == false) {
  292.             return;
  293.         }
  294.         if (Ext.EventObject.shiftKey == true) {
  295.             this.onSpinDownAlternate();
  296.             return;
  297.         }
  298.         else {
  299.             this.spin(true, false);
  300.         }
  301.         this.field.fireEvent("spin", this);
  302.         this.field.fireEvent("spindown", this);
  303.     },
  304.     //private
  305.     onSpinUpAlternate: function(){
  306.         if (this.isSpinnable() == false) {
  307.             return;
  308.         }
  309.         this.spin(false, true);
  310.         this.field.fireEvent("spin", this);
  311.         this.field.fireEvent("spinup", this);
  312.     },
  313.     //private
  314.     onSpinDownAlternate: function(){
  315.         if (this.isSpinnable() == false) {
  316.             return;
  317.         }
  318.         this.spin(true, true);
  319.         this.field.fireEvent("spin", this);
  320.         this.field.fireEvent("spindown", this);
  321.     },
  322.     spin: function(down, alternate){
  323.         var v = parseFloat(this.field.getValue());
  324.         var incr = (alternate == true) ? this.alternateIncrementValue : this.incrementValue;
  325.         (down == true) ? v -= incr : v += incr;
  326.         v = (isNaN(v)) ? this.defaultValue : v;
  327.         v = this.fixBoundries(v);
  328.         this.field.setRawValue(v);
  329.     },
  330.     fixBoundries: function(value){
  331.         var v = value;
  332.         if (this.field.minValue != undefined && v < this.field.minValue) {
  333.             v = this.field.minValue;
  334.         }
  335.         if (this.field.maxValue != undefined && v > this.field.maxValue) {
  336.             v = this.field.maxValue;
  337.         }
  338.         return this.fixPrecision(v);
  339.     },
  340.     // private
  341.     fixPrecision: function(value){
  342.         var nan = isNaN(value);
  343.         if (!this.field.allowDecimals || this.field.decimalPrecision == -1 || nan || !value) {
  344.             return nan ? '' : value;
  345.         }
  346.         return parseFloat(parseFloat(value).toFixed(this.field.decimalPrecision));
  347.     },
  348.     doDestroy: function(){
  349.         if (this.trigger) {
  350.             this.trigger.remove();
  351.         }
  352.         if (this.wrap) {
  353.             this.wrap.remove();
  354.             delete this.field.wrap;
  355.         }
  356.         if (this.splitter) {
  357.             this.splitter.remove();
  358.         }
  359.         if (this.dd) {
  360.             this.dd.unreg();
  361.             this.dd = null;
  362.         }
  363.         if (this.proxy) {
  364.             this.proxy.remove();
  365.         }
  366.         if (this.repeater) {
  367.             this.repeater.purgeListeners();
  368.         }
  369.     }
  370. });
  371. //backwards compat
  372. Ext.form.Spinner = Ext.ux.Spinner;