autoscroll.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  7. dojo._hasResource["dojo.dnd.autoscroll"] = true;
  8. dojo.provide("dojo.dnd.autoscroll");
  9. dojo.require("dojo.window");
  10. dojo.getObject("dnd", true, dojo);
  11. dojo.dnd.getViewport = dojo.window.getBox;
  12. dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
  13. dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
  14. dojo.dnd.V_AUTOSCROLL_VALUE = 16;
  15. dojo.dnd.H_AUTOSCROLL_VALUE = 16;
  16. dojo.dnd.autoScroll = function(e){
  17. // summary:
  18. // a handler for onmousemove event, which scrolls the window, if
  19. // necesary
  20. // e: Event
  21. // onmousemove event
  22. // FIXME: needs more docs!
  23. var v = dojo.window.getBox(), dx = 0, dy = 0;
  24. if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
  25. dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
  26. }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
  27. dx = dojo.dnd.H_AUTOSCROLL_VALUE;
  28. }
  29. if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
  30. dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
  31. }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
  32. dy = dojo.dnd.V_AUTOSCROLL_VALUE;
  33. }
  34. window.scrollBy(dx, dy);
  35. };
  36. dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
  37. dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
  38. dojo.dnd.autoScrollNodes = function(e){
  39. // summary:
  40. // a handler for onmousemove event, which scrolls the first avaialble
  41. // Dom element, it falls back to dojo.dnd.autoScroll()
  42. // e: Event
  43. // onmousemove event
  44. // FIXME: needs more docs!
  45. for(var n = e.target; n;){
  46. if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
  47. var s = dojo.getComputedStyle(n);
  48. if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){
  49. var b = dojo._getContentBox(n, s), t = dojo.position(n, true);
  50. //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
  51. var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2),
  52. h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
  53. rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0;
  54. if(dojo.isWebKit || dojo.isOpera){
  55. // FIXME: this code should not be here, it should be taken into account
  56. // either by the event fixing code, or the dojo.position()
  57. // FIXME: this code doesn't work on Opera 9.5 Beta
  58. rx += dojo.body().scrollLeft;
  59. ry += dojo.body().scrollTop;
  60. }
  61. if(rx > 0 && rx < b.w){
  62. if(rx < w){
  63. dx = -w;
  64. }else if(rx > b.w - w){
  65. dx = w;
  66. }
  67. }
  68. //console.log("ry =", ry, "b.h =", b.h, "h =", h);
  69. if(ry > 0 && ry < b.h){
  70. if(ry < h){
  71. dy = -h;
  72. }else if(ry > b.h - h){
  73. dy = h;
  74. }
  75. }
  76. var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
  77. n.scrollLeft = n.scrollLeft + dx;
  78. n.scrollTop = n.scrollTop + dy;
  79. if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; }
  80. }
  81. }
  82. try{
  83. n = n.parentNode;
  84. }catch(x){
  85. n = null;
  86. }
  87. }
  88. dojo.dnd.autoScroll(e);
  89. };
  90. }