Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
27 jpm 1
/*
2
 * Ext JS Library 2.0.2
3
 * Copyright(c) 2006-2008, Ext JS, LLC.
4
 * licensing@extjs.com
5
 *
6
 * http://extjs.com/license
7
 */
8
 
9
/**
10
 * @class Ext.dd.ScrollManager
11
 * Provides automatic scrolling of overflow regions in the page during drag operations.<br><br>
12
 * <b>Note: This class uses "Point Mode" and is untested in "Intersect Mode".</b>
13
 * @singleton
14
 */
15
Ext.dd.ScrollManager = function(){
16
    var ddm = Ext.dd.DragDropMgr;
17
    var els = {};
18
    var dragEl = null;
19
    var proc = {};
20
 
21
    var onStop = function(e){
22
        dragEl = null;
23
        clearProc();
24
    };
25
 
26
    var triggerRefresh = function(){
27
        if(ddm.dragCurrent){
28
             ddm.refreshCache(ddm.dragCurrent.groups);
29
        }
30
    };
31
 
32
    var doScroll = function(){
33
        if(ddm.dragCurrent){
34
            var dds = Ext.dd.ScrollManager;
35
            var inc = proc.el.ddScrollConfig ?
36
                      proc.el.ddScrollConfig.increment : dds.increment;
37
            if(!dds.animate){
38
                if(proc.el.scroll(proc.dir, inc)){
39
                    triggerRefresh();
40
                }
41
            }else{
42
                proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);
43
            }
44
        }
45
    };
46
 
47
    var clearProc = function(){
48
        if(proc.id){
49
            clearInterval(proc.id);
50
        }
51
        proc.id = 0;
52
        proc.el = null;
53
        proc.dir = "";
54
    };
55
 
56
    var startProc = function(el, dir){
57
        clearProc();
58
        proc.el = el;
59
        proc.dir = dir;
60
        proc.id = setInterval(doScroll, Ext.dd.ScrollManager.frequency);
61
    };
62
 
63
    var onFire = function(e, isDrop){
64
        if(isDrop || !ddm.dragCurrent){ return; }
65
        var dds = Ext.dd.ScrollManager;
66
        if(!dragEl || dragEl != ddm.dragCurrent){
67
            dragEl = ddm.dragCurrent;
68
            // refresh regions on drag start
69
            dds.refreshCache();
70
        }
71
 
72
        var xy = Ext.lib.Event.getXY(e);
73
        var pt = new Ext.lib.Point(xy[0], xy[1]);
74
        for(var id in els){
75
            var el = els[id], r = el._region;
76
            var c = el.ddScrollConfig ? el.ddScrollConfig : dds;
77
            if(r && r.contains(pt) && el.isScrollable()){
78
                if(r.bottom - pt.y <= c.vthresh){
79
                    if(proc.el != el){
80
                        startProc(el, "down");
81
                    }
82
                    return;
83
                }else if(r.right - pt.x <= c.hthresh){
84
                    if(proc.el != el){
85
                        startProc(el, "left");
86
                    }
87
                    return;
88
                }else if(pt.y - r.top <= c.vthresh){
89
                    if(proc.el != el){
90
                        startProc(el, "up");
91
                    }
92
                    return;
93
                }else if(pt.x - r.left <= c.hthresh){
94
                    if(proc.el != el){
95
                        startProc(el, "right");
96
                    }
97
                    return;
98
                }
99
            }
100
        }
101
        clearProc();
102
    };
103
 
104
    ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
105
    ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
106
 
107
    return {
108
        /**
109
         * Registers new overflow element(s) to auto scroll
110
         * @param {Mixed/Array} el The id of or the element to be scrolled or an array of either
111
         */
112
        register : function(el){
113
            if(Ext.isArray(el)){
114
                for(var i = 0, len = el.length; i < len; i++) {
115
                	this.register(el[i]);
116
                }
117
            }else{
118
                el = Ext.get(el);
119
                els[el.id] = el;
120
            }
121
        },
122
 
123
        /**
124
         * Unregisters overflow element(s) so they are no longer scrolled
125
         * @param {Mixed/Array} el The id of or the element to be removed or an array of either
126
         */
127
        unregister : function(el){
128
            if(Ext.isArray(el)){
129
                for(var i = 0, len = el.length; i < len; i++) {
130
                	this.unregister(el[i]);
131
                }
132
            }else{
133
                el = Ext.get(el);
134
                delete els[el.id];
135
            }
136
        },
137
 
138
        /**
139
         * The number of pixels from the top or bottom edge of a container the pointer needs to be to
140
         * trigger scrolling (defaults to 25)
141
         * @type Number
142
         */
143
        vthresh : 25,
144
        /**
145
         * The number of pixels from the right or left edge of a container the pointer needs to be to
146
         * trigger scrolling (defaults to 25)
147
         * @type Number
148
         */
149
        hthresh : 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 Ext.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
}();