1 | define(["../main", "../window"], function(dojo) { |
---|
2 | // module: |
---|
3 | // dojo/dnd/autoscroll |
---|
4 | // summary: |
---|
5 | // TODOC |
---|
6 | |
---|
7 | dojo.getObject("dnd", true, dojo); |
---|
8 | |
---|
9 | dojo.dnd.getViewport = dojo.window.getBox; |
---|
10 | |
---|
11 | dojo.dnd.V_TRIGGER_AUTOSCROLL = 32; |
---|
12 | dojo.dnd.H_TRIGGER_AUTOSCROLL = 32; |
---|
13 | |
---|
14 | dojo.dnd.V_AUTOSCROLL_VALUE = 16; |
---|
15 | dojo.dnd.H_AUTOSCROLL_VALUE = 16; |
---|
16 | |
---|
17 | dojo.dnd.autoScroll = function(e){ |
---|
18 | // summary: |
---|
19 | // a handler for onmousemove event, which scrolls the window, if |
---|
20 | // necesary |
---|
21 | // e: Event |
---|
22 | // onmousemove event |
---|
23 | |
---|
24 | // FIXME: needs more docs! |
---|
25 | var v = dojo.window.getBox(), dx = 0, dy = 0; |
---|
26 | if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){ |
---|
27 | dx = -dojo.dnd.H_AUTOSCROLL_VALUE; |
---|
28 | }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){ |
---|
29 | dx = dojo.dnd.H_AUTOSCROLL_VALUE; |
---|
30 | } |
---|
31 | if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){ |
---|
32 | dy = -dojo.dnd.V_AUTOSCROLL_VALUE; |
---|
33 | }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){ |
---|
34 | dy = dojo.dnd.V_AUTOSCROLL_VALUE; |
---|
35 | } |
---|
36 | window.scrollBy(dx, dy); |
---|
37 | }; |
---|
38 | |
---|
39 | dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1}; |
---|
40 | dojo.dnd._validOverflow = {"auto": 1, "scroll": 1}; |
---|
41 | |
---|
42 | dojo.dnd.autoScrollNodes = function(e){ |
---|
43 | // summary: |
---|
44 | // a handler for onmousemove event, which scrolls the first avaialble |
---|
45 | // Dom element, it falls back to dojo.dnd.autoScroll() |
---|
46 | // e: Event |
---|
47 | // onmousemove event |
---|
48 | |
---|
49 | // FIXME: needs more docs! |
---|
50 | |
---|
51 | var b, t, w, h, rx, ry, dx = 0, dy = 0, oldLeft, oldTop; |
---|
52 | |
---|
53 | for(var n = e.target; n;){ |
---|
54 | if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){ |
---|
55 | var s = dojo.getComputedStyle(n), |
---|
56 | overflow = (s.overflow.toLowerCase() in dojo.dnd._validOverflow), |
---|
57 | overflowX = (s.overflowX.toLowerCase() in dojo.dnd._validOverflow), |
---|
58 | overflowY = (s.overflowY.toLowerCase() in dojo.dnd._validOverflow); |
---|
59 | if(overflow || overflowX || overflowY){ |
---|
60 | b = dojo._getContentBox(n, s); |
---|
61 | t = dojo.position(n, true); |
---|
62 | } |
---|
63 | // overflow-x |
---|
64 | if(overflow || overflowX){ |
---|
65 | w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2); |
---|
66 | rx = e.pageX - t.x; |
---|
67 | if(dojo.isWebKit || dojo.isOpera){ |
---|
68 | // FIXME: this code should not be here, it should be taken into account |
---|
69 | // either by the event fixing code, or the dojo.position() |
---|
70 | // FIXME: this code doesn't work on Opera 9.5 Beta |
---|
71 | rx += dojo.body().scrollLeft; |
---|
72 | } |
---|
73 | dx = 0; |
---|
74 | if(rx > 0 && rx < b.w){ |
---|
75 | if(rx < w){ |
---|
76 | dx = -w; |
---|
77 | }else if(rx > b.w - w){ |
---|
78 | dx = w; |
---|
79 | } |
---|
80 | oldLeft = n.scrollLeft; |
---|
81 | n.scrollLeft = n.scrollLeft + dx; |
---|
82 | } |
---|
83 | } |
---|
84 | // overflow-y |
---|
85 | if(overflow || overflowY){ |
---|
86 | //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop); |
---|
87 | h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2); |
---|
88 | ry = e.pageY - t.y; |
---|
89 | if(dojo.isWebKit || dojo.isOpera){ |
---|
90 | // FIXME: this code should not be here, it should be taken into account |
---|
91 | // either by the event fixing code, or the dojo.position() |
---|
92 | // FIXME: this code doesn't work on Opera 9.5 Beta |
---|
93 | ry += dojo.body().scrollTop; |
---|
94 | } |
---|
95 | dy = 0; |
---|
96 | if(ry > 0 && ry < b.h){ |
---|
97 | if(ry < h){ |
---|
98 | dy = -h; |
---|
99 | }else if(ry > b.h - h){ |
---|
100 | dy = h; |
---|
101 | } |
---|
102 | oldTop = n.scrollTop; |
---|
103 | n.scrollTop = n.scrollTop + dy; |
---|
104 | } |
---|
105 | } |
---|
106 | if(dx || dy){ return; } |
---|
107 | } |
---|
108 | try{ |
---|
109 | n = n.parentNode; |
---|
110 | }catch(x){ |
---|
111 | n = null; |
---|
112 | } |
---|
113 | } |
---|
114 | dojo.dnd.autoScroll(e); |
---|
115 | }; |
---|
116 | |
---|
117 | return dojo.dnd; |
---|
118 | }); |
---|