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

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.dd.DragTracker
  3.  * @extends Ext.util.Observable
  4.  */
  5. Ext.dd.DragTracker = Ext.extend(Ext.util.Observable,  {
  6.     /**
  7.      * @cfg {Boolean} active
  8.  * Defaults to <tt>false</tt>.
  9.  */
  10.     active: false,
  11.     /**
  12.      * @cfg {Number} tolerance
  13.  * Defaults to <tt>5</tt>.
  14.  */
  15.     tolerance: 5,
  16.     /**
  17.      * @cfg {Boolean/Number} autoStart
  18.  * Defaults to <tt>false</tt>. Specify <tt>true</tt> to defer trigger start by 1000 ms.
  19.  * Specify a Number for the number of milliseconds to defer trigger start.
  20.  */
  21.     autoStart: false,
  22.     
  23.     constructor : function(config){
  24.         Ext.apply(this, config);
  25.     this.addEvents(
  26.         /**
  27.          * @event mousedown
  28.          * @param {Object} this
  29.          * @param {Object} e event object
  30.          */
  31.         'mousedown',
  32.         /**
  33.          * @event mouseup
  34.          * @param {Object} this
  35.          * @param {Object} e event object
  36.          */
  37.         'mouseup',
  38.         /**
  39.          * @event mousemove
  40.          * @param {Object} this
  41.          * @param {Object} e event object
  42.          */
  43.         'mousemove',
  44.         /**
  45.          * @event dragstart
  46.          * @param {Object} this
  47.          * @param {Object} startXY the page coordinates of the event
  48.          */
  49.         'dragstart',
  50.         /**
  51.          * @event dragend
  52.          * @param {Object} this
  53.          * @param {Object} e event object
  54.          */
  55.         'dragend',
  56.         /**
  57.          * @event drag
  58.          * @param {Object} this
  59.          * @param {Object} e event object
  60.          */
  61.         'drag'
  62.     );
  63.     this.dragRegion = new Ext.lib.Region(0,0,0,0);
  64.     if(this.el){
  65.         this.initEl(this.el);
  66.     }
  67.         Ext.dd.DragTracker.superclass.constructor.call(this, config);
  68.     },
  69.     initEl: function(el){
  70.         this.el = Ext.get(el);
  71.         el.on('mousedown', this.onMouseDown, this,
  72.                 this.delegate ? {delegate: this.delegate} : undefined);
  73.     },
  74.     destroy : function(){
  75.         this.el.un('mousedown', this.onMouseDown, this);
  76.     },
  77.     onMouseDown: function(e, target){
  78.         if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){
  79.             this.startXY = this.lastXY = e.getXY();
  80.             this.dragTarget = this.delegate ? target : this.el.dom;
  81.             if(this.preventDefault !== false){
  82.                 e.preventDefault();
  83.             }
  84.             var doc = Ext.getDoc();
  85.             doc.on('mouseup', this.onMouseUp, this);
  86.             doc.on('mousemove', this.onMouseMove, this);
  87.             doc.on('selectstart', this.stopSelect, this);
  88.             if(this.autoStart){
  89.                 this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this);
  90.             }
  91.         }
  92.     },
  93.     onMouseMove: function(e, target){
  94.         // HACK: IE hack to see if button was released outside of window. */
  95.         if(this.active && Ext.isIE && !e.browserEvent.button){
  96.             e.preventDefault();
  97.             this.onMouseUp(e);
  98.             return;
  99.         }
  100.         e.preventDefault();
  101.         var xy = e.getXY(), s = this.startXY;
  102.         this.lastXY = xy;
  103.         if(!this.active){
  104.             if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){
  105.                 this.triggerStart();
  106.             }else{
  107.                 return;
  108.             }
  109.         }
  110.         this.fireEvent('mousemove', this, e);
  111.         this.onDrag(e);
  112.         this.fireEvent('drag', this, e);
  113.     },
  114.     onMouseUp: function(e){
  115.         var doc = Ext.getDoc();
  116.         doc.un('mousemove', this.onMouseMove, this);
  117.         doc.un('mouseup', this.onMouseUp, this);
  118.         doc.un('selectstart', this.stopSelect, this);
  119.         e.preventDefault();
  120.         this.clearStart();
  121.         var wasActive = this.active;
  122.         this.active = false;
  123.         delete this.elRegion;
  124.         this.fireEvent('mouseup', this, e);
  125.         if(wasActive){
  126.             this.onEnd(e);
  127.             this.fireEvent('dragend', this, e);
  128.         }
  129.     },
  130.     triggerStart: function(isTimer){
  131.         this.clearStart();
  132.         this.active = true;
  133.         this.onStart(this.startXY);
  134.         this.fireEvent('dragstart', this, this.startXY);
  135.     },
  136.     clearStart : function(){
  137.         if(this.timer){
  138.             clearTimeout(this.timer);
  139.             delete this.timer;
  140.         }
  141.     },
  142.     stopSelect : function(e){
  143.         e.stopEvent();
  144.         return false;
  145.     },
  146.     onBeforeStart : function(e){
  147.     },
  148.     onStart : function(xy){
  149.     },
  150.     onDrag : function(e){
  151.     },
  152.     onEnd : function(e){
  153.     },
  154.     getDragTarget : function(){
  155.         return this.dragTarget;
  156.     },
  157.     getDragCt : function(){
  158.         return this.el;
  159.     },
  160.     getXY : function(constrain){
  161.         return constrain ?
  162.                this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;
  163.     },
  164.     getOffset : function(constrain){
  165.         var xy = this.getXY(constrain);
  166.         var s = this.startXY;
  167.         return [s[0]-xy[0], s[1]-xy[1]];
  168.     },
  169.     constrainModes: {
  170.         'point' : function(xy){
  171.             if(!this.elRegion){
  172.                 this.elRegion = this.getDragCt().getRegion();
  173.             }
  174.             var dr = this.dragRegion;
  175.             dr.left = xy[0];
  176.             dr.top = xy[1];
  177.             dr.right = xy[0];
  178.             dr.bottom = xy[1];
  179.             dr.constrainTo(this.elRegion);
  180.             return [dr.left, dr.top];
  181.         }
  182.     }
  183. });