ScrollManager.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.ScrollManager
  3.  * <p>Provides automatic scrolling of overflow regions in the page during drag operations.</p>
  4.  * <p>The ScrollManager configs will be used as the defaults for any scroll container registered with it,
  5.  * but you can also override most of the configs per scroll container by adding a 
  6.  * <tt>ddScrollConfig</tt> object to the target element that contains these properties: {@link #hthresh},
  7.  * {@link #vthresh}, {@link #increment} and {@link #frequency}.  Example usage:
  8.  * <pre><code>
  9. var el = Ext.get('scroll-ct');
  10. el.ddScrollConfig = {
  11.     vthresh: 50,
  12.     hthresh: -1,
  13.     frequency: 100,
  14.     increment: 200
  15. };
  16. Ext.dd.ScrollManager.register(el);
  17. </code></pre>
  18.  * <b>Note: This class uses "Point Mode" and is untested in "Intersect Mode".</b>
  19.  * @singleton
  20.  */
  21. Ext.dd.ScrollManager = function(){
  22.     var ddm = Ext.dd.DragDropMgr;
  23.     var els = {};
  24.     var dragEl = null;
  25.     var proc = {};
  26.     
  27.     var onStop = function(e){
  28.         dragEl = null;
  29.         clearProc();
  30.     };
  31.     
  32.     var triggerRefresh = function(){
  33.         if(ddm.dragCurrent){
  34.              ddm.refreshCache(ddm.dragCurrent.groups);
  35.         }
  36.     };
  37.     
  38.     var doScroll = function(){
  39.         if(ddm.dragCurrent){
  40.             var dds = Ext.dd.ScrollManager;
  41.             var inc = proc.el.ddScrollConfig ?
  42.                       proc.el.ddScrollConfig.increment : dds.increment;
  43.             if(!dds.animate){
  44.                 if(proc.el.scroll(proc.dir, inc)){
  45.                     triggerRefresh();
  46.                 }
  47.             }else{
  48.                 proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);
  49.             }
  50.         }
  51.     };
  52.     
  53.     var clearProc = function(){
  54.         if(proc.id){
  55.             clearInterval(proc.id);
  56.         }
  57.         proc.id = 0;
  58.         proc.el = null;
  59.         proc.dir = "";
  60.     };
  61.     
  62.     var startProc = function(el, dir){
  63.         clearProc();
  64.         proc.el = el;
  65.         proc.dir = dir;
  66.         var freq = (el.ddScrollConfig && el.ddScrollConfig.frequency) ? 
  67.                 el.ddScrollConfig.frequency : Ext.dd.ScrollManager.frequency;
  68.         proc.id = setInterval(doScroll, freq);
  69.     };
  70.     
  71.     var onFire = function(e, isDrop){
  72.         if(isDrop || !ddm.dragCurrent){ return; }
  73.         var dds = Ext.dd.ScrollManager;
  74.         if(!dragEl || dragEl != ddm.dragCurrent){
  75.             dragEl = ddm.dragCurrent;
  76.             // refresh regions on drag start
  77.             dds.refreshCache();
  78.         }
  79.         
  80.         var xy = Ext.lib.Event.getXY(e);
  81.         var pt = new Ext.lib.Point(xy[0], xy[1]);
  82.         for(var id in els){
  83.             var el = els[id], r = el._region;
  84.             var c = el.ddScrollConfig ? el.ddScrollConfig : dds;
  85.             if(r && r.contains(pt) && el.isScrollable()){
  86.                 if(r.bottom - pt.y <= c.vthresh){
  87.                     if(proc.el != el){
  88.                         startProc(el, "down");
  89.                     }
  90.                     return;
  91.                 }else if(r.right - pt.x <= c.hthresh){
  92.                     if(proc.el != el){
  93.                         startProc(el, "left");
  94.                     }
  95.                     return;
  96.                 }else if(pt.y - r.top <= c.vthresh){
  97.                     if(proc.el != el){
  98.                         startProc(el, "up");
  99.                     }
  100.                     return;
  101.                 }else if(pt.x - r.left <= c.hthresh){
  102.                     if(proc.el != el){
  103.                         startProc(el, "right");
  104.                     }
  105.                     return;
  106.                 }
  107.             }
  108.         }
  109.         clearProc();
  110.     };
  111.     
  112.     ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
  113.     ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
  114.     
  115.     return {
  116.         /**
  117.          * Registers new overflow element(s) to auto scroll
  118.          * @param {Mixed/Array} el The id of or the element to be scrolled or an array of either
  119.          */
  120.         register : function(el){
  121.             if(Ext.isArray(el)){
  122.                 for(var i = 0, len = el.length; i < len; i++) {
  123.                  this.register(el[i]);
  124.                 }
  125.             }else{
  126.                 el = Ext.get(el);
  127.                 els[el.id] = el;
  128.             }
  129.         },
  130.         
  131.         /**
  132.          * Unregisters overflow element(s) so they are no longer scrolled
  133.          * @param {Mixed/Array} el The id of or the element to be removed or an array of either
  134.          */
  135.         unregister : function(el){
  136.             if(Ext.isArray(el)){
  137.                 for(var i = 0, len = el.length; i < len; i++) {
  138.                  this.unregister(el[i]);
  139.                 }
  140.             }else{
  141.                 el = Ext.get(el);
  142.                 delete els[el.id];
  143.             }
  144.         },
  145.         
  146.         /**
  147.          * The number of pixels from the top or bottom edge of a container the pointer needs to be to
  148.          * trigger scrolling (defaults to 25)
  149.          * @type Number
  150.          */
  151.         vthresh : 25,
  152.         /**
  153.          * The number of pixels from the right or left edge of a container the pointer needs to be to
  154.          * trigger scrolling (defaults to 25)
  155.          * @type Number
  156.          */
  157.         hthresh : 25,
  158.         /**
  159.          * The number of pixels to scroll in each scroll increment (defaults to 50)
  160.          * @type Number
  161.          */
  162.         increment : 100,
  163.         
  164.         /**
  165.          * The frequency of scrolls in milliseconds (defaults to 500)
  166.          * @type Number
  167.          */
  168.         frequency : 500,
  169.         
  170.         /**
  171.          * True to animate the scroll (defaults to true)
  172.          * @type Boolean
  173.          */
  174.         animate: true,
  175.         
  176.         /**
  177.          * The animation duration in seconds - 
  178.          * MUST BE less than Ext.dd.ScrollManager.frequency! (defaults to .4)
  179.          * @type Number
  180.          */
  181.         animDuration: .4,
  182.         
  183.         /**
  184.          * Manually trigger a cache refresh.
  185.          */
  186.         refreshCache : function(){
  187.             for(var id in els){
  188.                 if(typeof els[id] == 'object'){ // for people extending the object prototype
  189.                     els[id]._region = els[id].getRegion();
  190.                 }
  191.             }
  192.         }
  193.     };
  194. }();