Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 4011

Show
Ignore:
Timestamp:
03/22/06 14:54:51 (2 years ago)
Author:
madrobby
Message:

script.aculo.us: Make it possible to scroll window on dragging, #3921 [thx rdmiller]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • spinoffs/scriptaculous/CHANGELOG

    r3823 r4011  
    11*SVN* 
     2 
     3* Make it possible to scroll window on dragging, #3921 [thx rdmiller] 
    24 
    35* Make Element.forceRerendering give up on any exception (this fixes various problems with IE) 
  • spinoffs/scriptaculous/src/dragdrop.js

    r3789 r4011  
    213213    if(!this.handle) this.handle = this.element; 
    214214     
    215     if(options.scroll) options.scroll = $(options.scroll); 
     215    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) 
     216      options.scroll = $(options.scroll); 
    216217 
    217218    Element.makePositioned(this.element); // fix IE     
     
    278279     
    279280    if(this.options.scroll) { 
    280       this.originalScrollLeft = this.options.scroll.scrollLeft; 
    281       this.originalScrollTop = this.options.scroll.scrollTop; 
     281      if (this.options.scroll.scrollTo) { 
     282        var where= this._getWindowScroll(this.options.scroll); 
     283        this.originalScrollLeft = where.left; 
     284        this.originalScrollTop = where.top; 
     285      } else { 
     286        this.originalScrollLeft = this.options.scroll.scrollLeft; 
     287        this.originalScrollTop = this.options.scroll.scrollTop; 
     288      } 
    282289    } 
    283290     
     
    295302     
    296303    if(this.options.scroll) { 
    297       //if(this.scrollInterval) this.scroll(); 
    298304      this.stopScrolling(); 
    299       var p = Position.page(this.options.scroll); 
    300       p[0] += this.options.scroll.scrollLeft; 
    301       p[1] += this.options.scroll.scrollTop; 
    302       p.push(p[0]+this.options.scroll.offsetWidth); 
    303       p.push(p[1]+this.options.scroll.offsetHeight); 
     305       
     306      var p; 
     307      if (this.options.scroll.scrollTo) { 
     308        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } 
     309      } else { 
     310        p = Position.page(this.options.scroll); 
     311        p[0] += this.options.scroll.scrollLeft; 
     312        p[1] += this.options.scroll.scrollTop; 
     313        p.push(p[0]+this.options.scroll.offsetWidth); 
     314        p.push(p[1]+this.options.scroll.offsetHeight); 
     315      } 
    304316      var speed = [0,0]; 
    305317      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); 
     
    367379    pos[0] -= d[0]; pos[1] -= d[1]; 
    368380     
    369     if(this.options.scroll) { 
     381    if(this.options.scroll && !this.options.scroll.scrollTo) { 
    370382      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 
    371383      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; 
     
    414426    var delta = current - this.lastScrolled; 
    415427    this.lastScrolled = current; 
    416     this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; 
    417     this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000; 
     428    if(this.options.scroll.scrollTo) { 
     429      with (this._getWindowScroll(this.options.scroll)) { 
     430        if (this.scrollSpeed[0] || this.scrollSpeed[1]) { 
     431          var d = delta / 1000; 
     432          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); 
     433        } 
     434      } 
     435    } else { 
     436      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; 
     437      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000; 
     438    } 
    418439     
    419440    Position.prepare(); 
     
    423444     
    424445    if(this.options.change) this.options.change(this); 
     446  }, 
     447   
     448  _getWindowScroll: function(w) { 
     449    var T, L, W, H; 
     450    with (w.document) { 
     451      if (w.document.documentElement && documentElement.scrollTop) { 
     452        T = documentElement.scrollTop; 
     453        L = documentElement.scrollLeft; 
     454      } else if (w.document.body) { 
     455        T = body.scrollTop; 
     456        L = body.scrollLeft; 
     457      } 
     458      if (w.innerWidth) { 
     459        W = w.innerWidth; 
     460        H = w.innerHeight; 
     461      } else if (w.document.documentElement && documentElement.clientWidth) { 
     462        W = documentElement.clientWidth; 
     463        H = documentElement.clientHeight; 
     464      } else { 
     465        W = body.offsetWidth; 
     466        H = body.offsetHeight 
     467      } 
     468    } 
     469    return { top: T, left: L, width: W, height: H }; 
    425470  } 
    426471} 
  • spinoffs/scriptaculous/test/functional/dragdrop2_test.html

    r2948 r4011  
    3333<script type="text/javascript" language="javascript" charset="utf-8"> 
    3434// <![CDATA[ 
    35   new Draggable('revertbox1',{handle:'handle1',revert:function(element){return ($('shouldrevert1').checked)}}); 
     35  new Draggable('revertbox1',{scroll:window,handle:'handle1',revert:function(element){return ($('shouldrevert1').checked)}}); 
    3636  new Draggable('revertbox2',{handle:'handle2',revert:function(element){return ($('shouldrevert2').checked)}}); 
    3737  Droppables.add('droptarget1',{accept:['box1','otherstuff'],onDrop:function(){alert('drop!')}});