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