DragTracker.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:6k
源码类别:

中间件编程

开发平台:

JavaScript

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