9aa4be01205f5f644006352144ca35a209de5ff7
[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          Roo.log('scroll startproc');
62         clearProc();
63         proc.el = el;
64         proc.dir = dir;
65         proc.id = setInterval(doScroll, Roo.dd.ScrollManager.frequency);
66     };
67     
68     var onFire = function(e, isDrop){
69        
70         if(isDrop || !ddm.dragCurrent){ return; }
71         var dds = Roo.dd.ScrollManager;
72         if(!dragEl || dragEl != ddm.dragCurrent){
73             dragEl = ddm.dragCurrent;
74             // refresh regions on drag start
75             dds.refreshCache();
76         }
77         
78         var xy = Roo.lib.Event.getXY(e);
79         var pt = new Roo.lib.Point(xy[0], xy[1]);
80         for(var id in els){
81             var el = els[id], r = el._region;
82             if(r && r.contains(pt) && el.isScrollable()){
83                 if(r.bottom - pt.y <= dds.thresh){
84                     if(proc.el != el){
85                         startProc(el, "down");
86                     }
87                     return;
88                 }else if(r.right - pt.x <= dds.thresh){
89                     if(proc.el != el){
90                         startProc(el, "left");
91                     }
92                     return;
93                 }else if(pt.y - r.top <= dds.thresh){
94                     if(proc.el != el){
95                         startProc(el, "up");
96                     }
97                     return;
98                 }else if(pt.x - r.left <= dds.thresh){
99                     if(proc.el != el){
100                         startProc(el, "right");
101                     }
102                     return;
103                 }
104             }
105         }
106         clearProc();
107     };
108     
109     ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
110     ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
111     
112     return {
113         /**
114          * Registers new overflow element(s) to auto scroll
115          * @param {String/HTMLElement/Element/Array} el The id of or the element to be scrolled or an array of either
116          */
117         register : function(el){
118             if(el instanceof Array){
119                 for(var i = 0, len = el.length; i < len; i++) {
120                         this.register(el[i]);
121                 }
122             }else{
123                 el = Roo.get(el);
124                 els[el.id] = el;
125             }
126             Roo.dd.ScrollManager.els = els;
127         },
128         
129         /**
130          * Unregisters overflow element(s) so they are no longer scrolled
131          * @param {String/HTMLElement/Element/Array} el The id of or the element to be removed or an array of either
132          */
133         unregister : function(el){
134             if(el instanceof Array){
135                 for(var i = 0, len = el.length; i < len; i++) {
136                         this.unregister(el[i]);
137                 }
138             }else{
139                 el = Roo.get(el);
140                 delete els[el.id];
141             }
142         },
143         
144         /**
145          * The number of pixels from the edge of a container the pointer needs to be to 
146          * trigger scrolling (defaults to 25)
147          * @type Number
148          */
149         thresh : 25,
150         
151         /**
152          * The number of pixels to scroll in each scroll increment (defaults to 50)
153          * @type Number
154          */
155         increment : 100,
156         
157         /**
158          * The frequency of scrolls in milliseconds (defaults to 500)
159          * @type Number
160          */
161         frequency : 500,
162         
163         /**
164          * True to animate the scroll (defaults to true)
165          * @type Boolean
166          */
167         animate: true,
168         
169         /**
170          * The animation duration in seconds - 
171          * MUST BE less than Roo.dd.ScrollManager.frequency! (defaults to .4)
172          * @type Number
173          */
174         animDuration: .4,
175         
176         /**
177          * Manually trigger a cache refresh.
178          */
179         refreshCache : function(){
180             for(var id in els){
181                 if(typeof els[id] == 'object'){ // for people extending the object prototype
182                     els[id]._region = els[id].getRegion();
183                 }
184             }
185         }
186     };
187 }();