source: Dev/trunk/src/client/dojox/grid/enhanced/plugins/AutoScroll.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 5.1 KB
Line 
1define([
2        "dojo/_base/declare",
3        "dojo/_base/array",
4        "dojo/_base/lang",
5        "dojo/_base/html",
6        "dojo/_base/window",
7        "../_Plugin",
8        "../../_RowSelector",
9        "../../EnhancedGrid"
10], function(declare, array, lang, html, win, _Plugin, _RowSelector, EnhancedGrid){
11
12var AutoScroll = declare("dojox.grid.enhanced.plugins.AutoScroll", _Plugin, {
13        // summary:
14        //              Provides horizontal and vertical auto-scroll for grid.
15       
16        // name: String
17        //              Plugin name
18        name: "autoScroll",
19       
20        // autoScrollInterval: Integer
21        //              The time interval (in miliseconds) between 2 scrolling.
22        autoScrollInterval: 1000,
23       
24        // autoScrollMargin: Integer
25        //              The width (in pixel) of the margin area where autoscroll can be triggered.
26        autoScrollMargin: 30,
27       
28        constructor: function(grid, args){
29                this.grid = grid;
30                this.readyForAutoScroll = false;
31                this._scrolling = false;
32                args = lang.isObject(args) ? args : {};
33                if("interval" in args){
34                        this.autoScrollInterval = args.interval;
35                }
36                if("margin" in args){
37                        this.autoScrollMargin = args.margin;
38                }
39                this._initEvents();
40                this._mixinGrid();
41        },
42        _initEvents: function(){
43                var g = this.grid;
44                this.connect(g, "onCellMouseDown", function(){
45                        this.readyForAutoScroll = true;
46                });
47                this.connect(g, "onHeaderCellMouseDown", function(){
48                        this.readyForAutoScroll = true;
49                });
50                this.connect(g, "onRowSelectorMouseDown", function(){
51                        this.readyForAutoScroll = true;
52                });
53                this.connect(win.doc, "onmouseup", function(evt){
54                        this._manageAutoScroll(true);
55                        this.readyForAutoScroll = false;
56                });
57                this.connect(win.doc, "onmousemove", function(evt){
58                        if(this.readyForAutoScroll){
59                                this._event = evt;
60                                var gridPos = html.position(g.domNode),
61                                        hh = g._getHeaderHeight(),
62                                        margin = this.autoScrollMargin,
63                                        ey = evt.clientY, ex = evt.clientX,
64                                        gy = gridPos.y, gx = gridPos.x,
65                                        gh = gridPos.h, gw = gridPos.w;
66                                if(ex >= gx && ex <= gx + gw){
67                                        if(ey >= gy + hh && ey < gy + hh + margin){
68                                                this._manageAutoScroll(false, true, false);
69                                                return;
70                                        }else if(ey > gy + gh - margin && ey <= gy + gh){
71                                                this._manageAutoScroll(false, true, true);
72                                                return;
73                                        }else if(ey >= gy && ey <= gy + gh){
74                                                var withinSomeview = array.some(g.views.views, function(view, i){
75                                                        if(view instanceof _RowSelector){
76                                                                return false;
77                                                        }
78                                                        var viewPos = html.position(view.domNode);
79                                                        if(ex < viewPos.x + margin && ex >= viewPos.x){
80                                                                this._manageAutoScroll(false, false, false, view);
81                                                                return true;
82                                                        }else if(ex > viewPos.x + viewPos.w - margin && ex < viewPos.x + viewPos.w){
83                                                                this._manageAutoScroll(false, false, true, view);
84                                                                return true;
85                                                        }
86                                                        return false;
87                                                }, this);
88                                                if(withinSomeview){
89                                                        return;
90                                                }
91                                        }
92                                }
93                                //stop autoscroll.
94                                this._manageAutoScroll(true);
95                        }
96                });
97        },
98        _mixinGrid: function(){
99                var g = this.grid;
100                g.onStartAutoScroll = function(/*isVertical, isForward*/){};
101                g.onEndAutoScroll = function(/*isVertical, isForward, view, scrollToRowIndex, event*/){};
102        },
103        _fireEvent: function(eventName, args){
104                var g = this.grid;
105                switch(eventName){
106                        case "start":
107                                g.onStartAutoScroll.apply(g, args);
108                                break;
109                        case "end":
110                                g.onEndAutoScroll.apply(g, args);
111                                break;
112                }
113        },
114        _manageAutoScroll: function(toStop, isVertical, isForward, view){
115                if(toStop){
116                        this._scrolling = false;
117                        clearInterval(this._handler);
118                }else if(!this._scrolling){
119                        this._scrolling = true;
120                        this._fireEvent("start", [isVertical, isForward, view]);
121                        this._autoScroll(isVertical, isForward, view);
122                        this._handler = setInterval(lang.hitch(this, "_autoScroll", isVertical, isForward, view), this.autoScrollInterval);
123                }
124        },
125        _autoScroll: function(isVertical, isForward, view){
126                var g = this.grid,
127                        target = null;
128                if(isVertical){
129                        var targetRow = g.scroller.firstVisibleRow + (isForward ? 1 : -1);
130                        if(targetRow >= 0 && targetRow < g.rowCount){
131                                g.scrollToRow(targetRow);
132                                target = targetRow;
133                        }
134                }else{
135                        target = this._scrollColumn(isForward, view);
136                }
137                if(target !== null){
138                        this._fireEvent("end", [isVertical, isForward, view, target, this._event]);
139                }
140        },
141        _scrollColumn: function(isForward, view){
142                var node = view.scrollboxNode,
143                        target = null;
144                if(node.clientWidth < node.scrollWidth){
145                        var cells = array.filter(this.grid.layout.cells, function(cell){
146                                return !cell.hidden;
147                        });
148                        var viewPos = html.position(view.domNode);
149                        var limit, edge, headerPos, i;
150                        if(isForward){
151                                limit = node.clientWidth;
152                                for(i = 0; i < cells.length; ++i){
153                                        headerPos = html.position(cells[i].getHeaderNode());
154                                        edge = headerPos.x - viewPos.x + headerPos.w;
155                                        if(edge > limit){
156                                                target = cells[i].index;
157                                                node.scrollLeft += edge - limit + 10;
158                                                break;
159                                        }
160                                }
161                        }else{
162                                limit = 0;
163                                for(i = cells.length - 1; i >= 0; --i){
164                                        headerPos = html.position(cells[i].getHeaderNode());
165                                        edge = headerPos.x - viewPos.x;
166                                        if(edge < limit){
167                                                target = cells[i].index;
168                                                node.scrollLeft += edge - limit - 10;
169                                                break;
170                                        }
171                                }
172                        }
173                }
174                return target;
175        }
176});
177
178EnhancedGrid.registerPlugin(AutoScroll);
179
180return AutoScroll;
181});
Note: See TracBrowser for help on using the repository browser.