autoscroll.js 3.2 KB

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