From a089699c8915636ba4f158d77dba9b012bc93208 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 4 Mar 2011 19:02:28 +0300 Subject: build custom layer of Dojo to speed up loading of tt-rss (refs #293) --- lib/dojo/dnd/autoscroll.js | 191 ++++++++++++++++++++++++--------------------- 1 file changed, 104 insertions(+), 87 deletions(-) (limited to 'lib/dojo/dnd/autoscroll.js') diff --git a/lib/dojo/dnd/autoscroll.js b/lib/dojo/dnd/autoscroll.js index 27496c6cd..40daf66a1 100644 --- a/lib/dojo/dnd/autoscroll.js +++ b/lib/dojo/dnd/autoscroll.js @@ -5,95 +5,112 @@ */ -if(!dojo._hasResource["dojo.dnd.autoscroll"]){ -dojo._hasResource["dojo.dnd.autoscroll"]=true; +if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo.dnd.autoscroll"] = true; dojo.provide("dojo.dnd.autoscroll"); -dojo.dnd.getViewport=function(){ -var d=dojo.doc,dd=d.documentElement,w=window,b=dojo.body(); -if(dojo.isMozilla){ -return {w:dd.clientWidth,h:w.innerHeight}; -}else{ -if(!dojo.isOpera&&w.innerWidth){ -return {w:w.innerWidth,h:w.innerHeight}; -}else{ -if(!dojo.isOpera&&dd&&dd.clientWidth){ -return {w:dd.clientWidth,h:dd.clientHeight}; -}else{ -if(b.clientWidth){ -return {w:b.clientWidth,h:b.clientHeight}; -} -} -} -} -return null; + +dojo.dnd.getViewport = function(){ + // summary: + // Returns a viewport size (visible part of the window) + + // TODO: remove this when getViewport() moved to dojo core, see #7028 + + // FIXME: need more docs!! + var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body(); + if(dojo.isMozilla){ + return {w: dd.clientWidth, h: w.innerHeight}; // Object + }else if(!dojo.isOpera && w.innerWidth){ + return {w: w.innerWidth, h: w.innerHeight}; // Object + }else if (!dojo.isOpera && dd && dd.clientWidth){ + return {w: dd.clientWidth, h: dd.clientHeight}; // Object + }else if (b.clientWidth){ + return {w: b.clientWidth, h: b.clientHeight}; // Object + } + return null; // Object }; -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){ -var v=dojo.dnd.getViewport(),dx=0,dy=0; -if(e.clientXv.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){ -dx=dojo.dnd.H_AUTOSCROLL_VALUE; -} -} -if(e.clientYv.h-dojo.dnd.V_TRIGGER_AUTOSCROLL){ -dy=dojo.dnd.V_AUTOSCROLL_VALUE; -} -} -window.scrollBy(dx,dy); + +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.dnd.getViewport(), 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){ -for(var n=e.target;n;){ -if(n.nodeType==1&&(n.tagName.toLowerCase() in dojo.dnd._validNodes)){ -var s=dojo.getComputedStyle(n); -if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){ -var b=dojo._getContentBox(n,s),t=dojo.position(n,true); -var w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2),h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2),rx=e.pageX-t.x,ry=e.pageY-t.y,dx=0,dy=0; -if(dojo.isWebKit||dojo.isOpera){ -rx+=dojo.body().scrollLeft,ry+=dojo.body().scrollTop; -} -if(rx>0&&rxb.w-w){ -dx=w; -} -} -} -if(ry>0&&ryb.h-h){ -dy=h; -} -} -} -var _1=n.scrollLeft,_2=n.scrollTop; -n.scrollLeft=n.scrollLeft+dx; -n.scrollTop=n.scrollTop+dy; -if(_1!=n.scrollLeft||_2!=n.scrollTop){ -return; -} -} -} -try{ -n=n.parentNode; -} -catch(x){ -n=null; -} -} -dojo.dnd.autoScroll(e); + +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! + for(var n = e.target; n;){ + if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){ + var s = dojo.getComputedStyle(n); + if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){ + var b = dojo._getContentBox(n, s), t = dojo.position(n, true); + //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop); + var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2), + h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2), + rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0; + 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, ry += dojo.body().scrollTop; + } + if(rx > 0 && rx < b.w){ + if(rx < w){ + dx = -w; + }else if(rx > b.w - w){ + dx = w; + } + } + //console.log("ry =", ry, "b.h =", b.h, "h =", h); + if(ry > 0 && ry < b.h){ + if(ry < h){ + dy = -h; + }else if(ry > b.h - h){ + dy = h; + } + } + var oldLeft = n.scrollLeft, oldTop = n.scrollTop; + n.scrollLeft = n.scrollLeft + dx; + n.scrollTop = n.scrollTop + dy; + if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; } + } + } + try{ + n = n.parentNode; + }catch(x){ + n = null; + } + } + dojo.dnd.autoScroll(e); }; + } -- cgit v1.2.3