diff options
Diffstat (limited to 'lib/dojo/dnd/Moveable.js')
-rw-r--r-- | lib/dojo/dnd/Moveable.js | 235 |
1 files changed, 168 insertions, 67 deletions
diff --git a/lib/dojo/dnd/Moveable.js b/lib/dojo/dnd/Moveable.js index 17d8d9200..324196582 100644 --- a/lib/dojo/dnd/Moveable.js +++ b/lib/dojo/dnd/Moveable.js @@ -5,73 +5,174 @@ */ -if(!dojo._hasResource["dojo.dnd.Moveable"]){ -dojo._hasResource["dojo.dnd.Moveable"]=true; +if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo.dnd.Moveable"] = true; dojo.provide("dojo.dnd.Moveable"); + dojo.require("dojo.dnd.Mover"); -dojo.declare("dojo.dnd.Moveable",null,{handle:"",delay:0,skip:false,constructor:function(_1,_2){ -this.node=dojo.byId(_1); -if(!_2){ -_2={}; -} -this.handle=_2.handle?dojo.byId(_2.handle):null; -if(!this.handle){ -this.handle=this.node; -} -this.delay=_2.delay>0?_2.delay:0; -this.skip=_2.skip; -this.mover=_2.mover?_2.mover:dojo.dnd.Mover; -this.events=[dojo.connect(this.handle,"onmousedown",this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")]; -},markupFactory:function(_3,_4){ -return new dojo.dnd.Moveable(_4,_3); -},destroy:function(){ -dojo.forEach(this.events,dojo.disconnect); -this.events=this.node=this.handle=null; -},onMouseDown:function(e){ -if(this.skip&&dojo.dnd.isFormElement(e)){ -return; -} -if(this.delay){ -this.events.push(dojo.connect(this.handle,"onmousemove",this,"onMouseMove"),dojo.connect(this.handle,"onmouseup",this,"onMouseUp")); -this._lastX=e.pageX; -this._lastY=e.pageY; -}else{ -this.onDragDetected(e); -} -dojo.stopEvent(e); -},onMouseMove:function(e){ -if(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay){ -this.onMouseUp(e); -this.onDragDetected(e); -} -dojo.stopEvent(e); -},onMouseUp:function(e){ -for(var i=0;i<2;++i){ -dojo.disconnect(this.events.pop()); -} -dojo.stopEvent(e); -},onSelectStart:function(e){ -if(!this.skip||!dojo.dnd.isFormElement(e)){ -dojo.stopEvent(e); -} -},onDragDetected:function(e){ -new this.mover(this.node,e,this); -},onMoveStart:function(_5){ -dojo.publish("/dnd/move/start",[_5]); -dojo.addClass(dojo.body(),"dojoMove"); -dojo.addClass(this.node,"dojoMoveItem"); -},onMoveStop:function(_6){ -dojo.publish("/dnd/move/stop",[_6]); -dojo.removeClass(dojo.body(),"dojoMove"); -dojo.removeClass(this.node,"dojoMoveItem"); -},onFirstMove:function(_7,e){ -},onMove:function(_8,_9,e){ -this.onMoving(_8,_9); -var s=_8.node.style; -s.left=_9.l+"px"; -s.top=_9.t+"px"; -this.onMoved(_8,_9); -},onMoving:function(_a,_b){ -},onMoved:function(_c,_d){ -}}); + +/*===== +dojo.declare("dojo.dnd.__MoveableArgs", [], { + // handle: Node||String + // A node (or node's id), which is used as a mouse handle. + // If omitted, the node itself is used as a handle. + handle: null, + + // delay: Number + // delay move by this number of pixels + delay: 0, + + // skip: Boolean + // skip move of form elements + skip: false, + + // mover: Object + // a constructor of custom Mover + mover: dojo.dnd.Mover +}); +=====*/ + +dojo.declare("dojo.dnd.Moveable", null, { + // object attributes (for markup) + handle: "", + delay: 0, + skip: false, + + constructor: function(node, params){ + // summary: + // an object, which makes a node moveable + // node: Node + // a node (or node's id) to be moved + // params: dojo.dnd.__MoveableArgs? + // optional parameters + this.node = dojo.byId(node); + if(!params){ params = {}; } + this.handle = params.handle ? dojo.byId(params.handle) : null; + if(!this.handle){ this.handle = this.node; } + this.delay = params.delay > 0 ? params.delay : 0; + this.skip = params.skip; + this.mover = params.mover ? params.mover : dojo.dnd.Mover; + this.events = [ + dojo.connect(this.handle, "onmousedown", this, "onMouseDown"), + // cancel text selection and text dragging + dojo.connect(this.handle, "ondragstart", this, "onSelectStart"), + dojo.connect(this.handle, "onselectstart", this, "onSelectStart") + ]; + }, + + // markup methods + markupFactory: function(params, node){ + return new dojo.dnd.Moveable(node, params); + }, + + // methods + destroy: function(){ + // summary: + // stops watching for possible move, deletes all references, so the object can be garbage-collected + dojo.forEach(this.events, dojo.disconnect); + this.events = this.node = this.handle = null; + }, + + // mouse event processors + onMouseDown: function(e){ + // summary: + // event processor for onmousedown, creates a Mover for the node + // e: Event + // mouse event + if(this.skip && dojo.dnd.isFormElement(e)){ return; } + if(this.delay){ + this.events.push( + dojo.connect(this.handle, "onmousemove", this, "onMouseMove"), + dojo.connect(this.handle, "onmouseup", this, "onMouseUp") + ); + this._lastX = e.pageX; + this._lastY = e.pageY; + }else{ + this.onDragDetected(e); + } + dojo.stopEvent(e); + }, + onMouseMove: function(e){ + // summary: + // event processor for onmousemove, used only for delayed drags + // e: Event + // mouse event + if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){ + this.onMouseUp(e); + this.onDragDetected(e); + } + dojo.stopEvent(e); + }, + onMouseUp: function(e){ + // summary: + // event processor for onmouseup, used only for delayed drags + // e: Event + // mouse event + for(var i = 0; i < 2; ++i){ + dojo.disconnect(this.events.pop()); + } + dojo.stopEvent(e); + }, + onSelectStart: function(e){ + // summary: + // event processor for onselectevent and ondragevent + // e: Event + // mouse event + if(!this.skip || !dojo.dnd.isFormElement(e)){ + dojo.stopEvent(e); + } + }, + + // local events + onDragDetected: function(/* Event */ e){ + // summary: + // called when the drag is detected; + // responsible for creation of the mover + new this.mover(this.node, e, this); + }, + onMoveStart: function(/* dojo.dnd.Mover */ mover){ + // summary: + // called before every move operation + dojo.publish("/dnd/move/start", [mover]); + dojo.addClass(dojo.body(), "dojoMove"); + dojo.addClass(this.node, "dojoMoveItem"); + }, + onMoveStop: function(/* dojo.dnd.Mover */ mover){ + // summary: + // called after every move operation + dojo.publish("/dnd/move/stop", [mover]); + dojo.removeClass(dojo.body(), "dojoMove"); + dojo.removeClass(this.node, "dojoMoveItem"); + }, + onFirstMove: function(/* dojo.dnd.Mover */ mover, /* Event */ e){ + // summary: + // called during the very first move notification; + // can be used to initialize coordinates, can be overwritten. + + // default implementation does nothing + }, + onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop, /* Event */ e){ + // summary: + // called during every move notification; + // should actually move the node; can be overwritten. + this.onMoving(mover, leftTop); + var s = mover.node.style; + s.left = leftTop.l + "px"; + s.top = leftTop.t + "px"; + this.onMoved(mover, leftTop); + }, + onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ + // summary: + // called before every incremental move; can be overwritten. + + // default implementation does nothing + }, + onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ + // summary: + // called after every incremental move; can be overwritten. + + // default implementation does nothing + } +}); + } |