Roo/dd/ScrollManager.js
[roojs1] / Roo / dd / ScrollManager.js
1 /*
2  * Based on:
3  * Ext JS Library 1.1.1
4  * Copyright(c) 2006-2007, Ext JS, LLC.
5  *
6  * Originally Released Under LGPL - original licence link has changed is not relivant.
7  *
8  * Fork - LGPL
9  * <script type="text/javascript">
10  */
11  
12
13 /**
14  * @class Roo.dd.ScrollManager
15  * Provides automatic scrolling of overflow regions in the page during drag operations.<br><br>
16  * <b>Note: This class uses "Point Mode" and is untested in "Intersect Mode".</b>
17  * @singleton
18  */
19 Roo.dd.ScrollManager = function(){
20     var ddm = Roo.dd.DragDropMgr;
21     var els = {};
22     var dragEl = null;
23     var proc = {};
24     
25     
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 = Roo.dd.ScrollManager;
41             if(!dds.animate){
42                 if(proc.el.scroll(proc.dir, dds.increment)){
43                     triggerRefresh();
44                 }
45             }else{
46                 proc.el.scroll(proc.dir, dds.increment, true, dds.animDuration, triggerRefresh);
47             }
48         }
49     };
50     
51     var clearProc = function(){
52         if(proc.id){
53             clearInterval(proc.id);
54         }
55         proc.id = 0;
56         proc.el = null;
57         proc.dir = "";
58     };
59     
60     var startProc = function(el, dir){
61         clearProc();
62         proc.el = el;
63         proc.dir = dir;
64         proc.id = setInterval(doScroll, Roo.dd.ScrollManager.frequency);
65     };
66     
67     var onFire = function(e, isDrop){
68         Roo.log('scroll onfire');
69         if(isDrop || !ddm.dragCurrent){ return; }
70         var dds = Roo.dd.ScrollManager;
71         if(!dragEl || dragEl != ddm.dragCurrent){
72             dragEl = ddm.dragCurrent;
73             // refresh regions on drag start
74             dds.refreshCache();
75         }
76         
77         var xy = Roo.lib.Event.getXY(e);
78         var pt = new Roo.lib.Point(xy[0], xy[1]);
79         for(var id in els){
80             var el = els[id], r = el._region;
81             if(r && r.contains(pt) && el.isScrollable()){
82                 if(r.bottom - pt.y <= dds.thresh){
83                     if(proc.el != el){
84                         startProc(el, "down");
85                     }
86                     return;
87                 }else if(r.right - pt.x <= dds.thresh){
88                     if(proc.el != el){
89                         startProc(el, "left");
90                     }
91                     return;
92                 }else if(pt.y - r.top <= dds.thresh){
93                     if(proc.el != el){
94                         startProc(el, "up");
95                     }
96                     return;
97                 }else if(pt.x - r.left <= dds.thresh){
98                     if(proc.el != el){
99                         startProc(el, "right");
100                     }
101                     return;
102                 }
103             }
104         }
105         clearProc();
106     };
107     
108     ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
109     ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
110     
111     return {
112         /**
113          * Registers new overflow element(s) to auto scroll
114          * @param {String/HTMLElement/Element/Array} el The id of or the element to be scrolled or an array of either
115          */
116         register : function(el){
117             if(el instanceof Array){
118                 for(var i = 0, len = el.length; i < len; i++) {
119                         this.register(el[i]);
120                 }
121             }else{
122                 el = Roo.get(el);
123                 els[el.id] = el;
124             }
125             Roo.dd.ScrollManager.els = els;
126         },
127         
128         /**
129          * Unregisters overflow element(s) so they are no longer scrolled
130          * @param {String/HTMLElement/Element/Array} el The id of or the element to be removed or an array of either
131          */
132         unregister : function(el){
133             if(el instanceof Array){
134                 for(var i = 0, len = el.length; i < len; i++) {
135                         this.unregister(el[i]);
136                 }
137             }else{
138                 el = Roo.get(el);
139                 delete els[el.id];
140             }
141         },
142         
143         /**
144          * The number of pixels from the edge of a container the pointer needs to be to 
145          * trigger scrolling (defaults to 25)
146          * @type Number
147          */
148         thresh : 25,
149         
150         /**
151          * The number of pixels to scroll in each scroll increment (defaults to 50)
152          * @type Number
153          */
154         increment : 100,
155         
156         /**
157          * The frequency of scrolls in milliseconds (defaults to 500)
158          * @type Number
159          */
160         frequency : 500,
161         
162         /**
163          * True to animate the scroll (defaults to true)
164          * @type Boolean
165          */
166         animate: true,
167         
168         /**
169          * The animation duration in seconds - 
170          * MUST BE less than Roo.dd.ScrollManager.frequency! (defaults to .4)
171          * @type Number
172          */
173         animDuration: .4,
174         
175         /**
176          * Manually trigger a cache refresh.
177          */
178         refreshCache : function(){
179             for(var id in els){
180                 if(typeof els[id] == 'object'){ // for people extending the object prototype
181                     els[id]._region = els[id].getRegion();
182                 }
183             }
184         }
185     };
186 }();