119 lines
3.2 KiB
JavaScript
119 lines
3.2 KiB
JavaScript
|
define("dojo/dnd/autoscroll", ["../main", "../window"], function(dojo) {
|
||
|
// module:
|
||
|
// dojo/dnd/autoscroll
|
||
|
// summary:
|
||
|
// TODOC
|
||
|
|
||
|
dojo.getObject("dnd", true, dojo);
|
||
|
|
||
|
dojo.dnd.getViewport = dojo.window.getBox;
|
||
|
|
||
|
dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
|
||
|
dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
|
||
|
|
||
|
dojo.dnd.V_AUTOSCROLL_VALUE = 16;
|
||
|
dojo.dnd.H_AUTOSCROLL_VALUE = 16;
|
||
|
|
||
|
dojo.dnd.autoScroll = function(e){
|
||
|
// summary:
|
||
|
// a handler for onmousemove event, which scrolls the window, if
|
||
|
// necesary
|
||
|
// e: Event
|
||
|
// onmousemove event
|
||
|
|
||
|
// FIXME: needs more docs!
|
||
|
var v = dojo.window.getBox(), dx = 0, dy = 0;
|
||
|
if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
|
||
|
dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
|
||
|
}else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
|
||
|
dx = dojo.dnd.H_AUTOSCROLL_VALUE;
|
||
|
}
|
||
|
if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
|
||
|
dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
|
||
|
}else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
|
||
|
dy = dojo.dnd.V_AUTOSCROLL_VALUE;
|
||
|
}
|
||
|
window.scrollBy(dx, dy);
|
||
|
};
|
||
|
|
||
|
dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
|
||
|
dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
|
||
|
|
||
|
dojo.dnd.autoScrollNodes = function(e){
|
||
|
// summary:
|
||
|
// a handler for onmousemove event, which scrolls the first avaialble
|
||
|
// Dom element, it falls back to dojo.dnd.autoScroll()
|
||
|
// e: Event
|
||
|
// onmousemove event
|
||
|
|
||
|
// FIXME: needs more docs!
|
||
|
|
||
|
var b, t, w, h, rx, ry, dx = 0, dy = 0, oldLeft, oldTop;
|
||
|
|
||
|
for(var n = e.target; n;){
|
||
|
if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
|
||
|
var s = dojo.getComputedStyle(n),
|
||
|
overflow = (s.overflow.toLowerCase() in dojo.dnd._validOverflow),
|
||
|
overflowX = (s.overflowX.toLowerCase() in dojo.dnd._validOverflow),
|
||
|
overflowY = (s.overflowY.toLowerCase() in dojo.dnd._validOverflow);
|
||
|
if(overflow || overflowX || overflowY){
|
||
|
b = dojo._getContentBox(n, s);
|
||
|
t = dojo.position(n, true);
|
||
|
}
|
||
|
// overflow-x
|
||
|
if(overflow || overflowX){
|
||
|
w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2);
|
||
|
rx = e.pageX - t.x;
|
||
|
if(dojo.isWebKit || dojo.isOpera){
|
||
|
// FIXME: this code should not be here, it should be taken into account
|
||
|
// either by the event fixing code, or the dojo.position()
|
||
|
// FIXME: this code doesn't work on Opera 9.5 Beta
|
||
|
rx += dojo.body().scrollLeft;
|
||
|
}
|
||
|
dx = 0;
|
||
|
if(rx > 0 && rx < b.w){
|
||
|
if(rx < w){
|
||
|
dx = -w;
|
||
|
}else if(rx > b.w - w){
|
||
|
dx = w;
|
||
|
}
|
||
|
oldLeft = n.scrollLeft;
|
||
|
n.scrollLeft = n.scrollLeft + dx;
|
||
|
}
|
||
|
}
|
||
|
// overflow-y
|
||
|
if(overflow || overflowY){
|
||
|
//console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
|
||
|
h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2);
|
||
|
ry = e.pageY - t.y;
|
||
|
if(dojo.isWebKit || dojo.isOpera){
|
||
|
// FIXME: this code should not be here, it should be taken into account
|
||
|
// either by the event fixing code, or the dojo.position()
|
||
|
// FIXME: this code doesn't work on Opera 9.5 Beta
|
||
|
ry += dojo.body().scrollTop;
|
||
|
}
|
||
|
dy = 0;
|
||
|
if(ry > 0 && ry < b.h){
|
||
|
if(ry < h){
|
||
|
dy = -h;
|
||
|
}else if(ry > b.h - h){
|
||
|
dy = h;
|
||
|
}
|
||
|
oldTop = n.scrollTop;
|
||
|
n.scrollTop = n.scrollTop + dy;
|
||
|
}
|
||
|
}
|
||
|
if(dx || dy){ return; }
|
||
|
}
|
||
|
try{
|
||
|
n = n.parentNode;
|
||
|
}catch(x){
|
||
|
n = null;
|
||
|
}
|
||
|
}
|
||
|
dojo.dnd.autoScroll(e);
|
||
|
};
|
||
|
|
||
|
return dojo.dnd;
|
||
|
});
|