/* * Based on: * Ext JS Library 1.1.1 * Copyright(c) 2006-2007, Ext JS, LLC. * * Originally Released Under LGPL - original licence link has changed is not relivant. * * Fork - LGPL * <script type="text/javascript"> */ /** * @class Roo.dd.ScrollManager * Provides automatic scrolling of overflow regions in the page during drag operations.<br><br> * <b>Note: This class uses "Point Mode" and is untested in "Intersect Mode".</b> * @singleton */ Roo.dd.ScrollManager = function(){ var ddm = Roo.dd.DragDropMgr; var els = {}; var dragEl = null; var proc = {}; var onStop = function(e){ dragEl = null; clearProc(); }; var triggerRefresh = function(){ if(ddm.dragCurrent){ ddm.refreshCache(ddm.dragCurrent.groups); } }; var doScroll = function(){ if(ddm.dragCurrent){ var dds = Roo.dd.ScrollManager; if(!dds.animate){ if(proc.el.scroll(proc.dir, dds.increment)){ triggerRefresh(); } }else{ proc.el.scroll(proc.dir, dds.increment, true, dds.animDuration, triggerRefresh); } } }; var clearProc = function(){ if(proc.id){ clearInterval(proc.id); } proc.id = 0; proc.el = null; proc.dir = ""; }; var startProc = function(el, dir){ Roo.log('scroll startproc'); clearProc(); proc.el = el; proc.dir = dir; proc.id = setInterval(doScroll, Roo.dd.ScrollManager.frequency); }; var onFire = function(e, isDrop){ if(isDrop || !ddm.dragCurrent){ return; } var dds = Roo.dd.ScrollManager; if(!dragEl || dragEl != ddm.dragCurrent){ dragEl = ddm.dragCurrent; // refresh regions on drag start dds.refreshCache(); } var xy = Roo.lib.Event.getXY(e); var pt = new Roo.lib.Point(xy[0], xy[1]); for(var id in els){ var el = els[id], r = el._region; if(r && r.contains(pt) && el.isScrollable()){ if(r.bottom - pt.y <= dds.thresh){ if(proc.el != el){ startProc(el, "down"); } return; }else if(r.right - pt.x <= dds.thresh){ if(proc.el != el){ startProc(el, "left"); } return; }else if(pt.y - r.top <= dds.thresh){ if(proc.el != el){ startProc(el, "up"); } return; }else if(pt.x - r.left <= dds.thresh){ if(proc.el != el){ startProc(el, "right"); } return; } } } clearProc(); }; ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm); ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm); return { /** * Registers new overflow element(s) to auto scroll * @param {String/HTMLElement/Element/Array} el The id of or the element to be scrolled or an array of either */ register : function(el){ if(el instanceof Array){ for(var i = 0, len = el.length; i < len; i++) { this.register(el[i]); } }else{ el = Roo.get(el); els[el.id] = el; } Roo.dd.ScrollManager.els = els; }, /** * Unregisters overflow element(s) so they are no longer scrolled * @param {String/HTMLElement/Element/Array} el The id of or the element to be removed or an array of either */ unregister : function(el){ if(el instanceof Array){ for(var i = 0, len = el.length; i < len; i++) { this.unregister(el[i]); } }else{ el = Roo.get(el); delete els[el.id]; } }, /** * The number of pixels from the edge of a container the pointer needs to be to * trigger scrolling (defaults to 25) * @type Number */ thresh : 25, /** * The number of pixels to scroll in each scroll increment (defaults to 50) * @type Number */ increment : 100, /** * The frequency of scrolls in milliseconds (defaults to 500) * @type Number */ frequency : 500, /** * True to animate the scroll (defaults to true) * @type Boolean */ animate: true, /** * The animation duration in seconds - * MUST BE less than Roo.dd.ScrollManager.frequency! (defaults to .4) * @type Number */ animDuration: .4, /** * Manually trigger a cache refresh. */ refreshCache : function(){ for(var id in els){ if(typeof els[id] == 'object'){ // for people extending the object prototype els[id]._region = els[id].getRegion(); } } } }; }();