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