1 define("dojo/dnd/Moveable", ["../main", "../Evented", "../touch", "./Mover"], function(dojo, Evented, touch) {
9 dojo.declare("dojo.dnd.__MoveableArgs", [], {
10 // handle: Node||String
11 // A node (or node's id), which is used as a mouse handle.
12 // If omitted, the node itself is used as a handle.
16 // delay move by this number of pixels
20 // skip move of form elements
24 // a constructor of custom Mover
29 dojo.declare("dojo.dnd.Moveable", [Evented], {
30 // object attributes (for markup)
35 constructor: function(node, params){
37 // an object, which makes a node moveable
39 // a node (or node's id) to be moved
40 // params: dojo.dnd.__MoveableArgs?
41 // optional parameters
42 this.node = dojo.byId(node);
43 if(!params){ params = {}; }
44 this.handle = params.handle ? dojo.byId(params.handle) : null;
45 if(!this.handle){ this.handle = this.node; }
46 this.delay = params.delay > 0 ? params.delay : 0;
47 this.skip = params.skip;
48 this.mover = params.mover ? params.mover : dojo.dnd.Mover;
50 dojo.connect(this.handle, touch.press, this, "onMouseDown"),
51 // cancel text selection and text dragging
52 dojo.connect(this.handle, "ondragstart", this, "onSelectStart"),
53 dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
58 markupFactory: function(params, node, ctor){
59 return new ctor(node, params);
65 // stops watching for possible move, deletes all references, so the object can be garbage-collected
66 dojo.forEach(this.events, dojo.disconnect);
67 this.events = this.node = this.handle = null;
70 // mouse event processors
71 onMouseDown: function(e){
73 // event processor for onmousedown/ontouchstart, creates a Mover for the node
76 if(this.skip && dojo.dnd.isFormElement(e)){ return; }
79 dojo.connect(this.handle, touch.move, this, "onMouseMove"),
80 dojo.connect(this.handle, touch.release, this, "onMouseUp")
82 this._lastX = e.pageX;
83 this._lastY = e.pageY;
85 this.onDragDetected(e);
89 onMouseMove: function(e){
91 // event processor for onmousemove/ontouchmove, used only for delayed drags
94 if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
96 this.onDragDetected(e);
100 onMouseUp: function(e){
102 // event processor for onmouseup, used only for delayed drags
105 for(var i = 0; i < 2; ++i){
106 dojo.disconnect(this.events.pop());
110 onSelectStart: function(e){
112 // event processor for onselectevent and ondragevent
115 if(!this.skip || !dojo.dnd.isFormElement(e)){
121 onDragDetected: function(/* Event */ e){
123 // called when the drag is detected;
124 // responsible for creation of the mover
125 new this.mover(this.node, e, this);
127 onMoveStart: function(/* dojo.dnd.Mover */ mover){
129 // called before every move operation
130 dojo.publish("/dnd/move/start", [mover]);
131 dojo.addClass(dojo.body(), "dojoMove");
132 dojo.addClass(this.node, "dojoMoveItem");
134 onMoveStop: function(/* dojo.dnd.Mover */ mover){
136 // called after every move operation
137 dojo.publish("/dnd/move/stop", [mover]);
138 dojo.removeClass(dojo.body(), "dojoMove");
139 dojo.removeClass(this.node, "dojoMoveItem");
141 onFirstMove: function(/* dojo.dnd.Mover */ mover, /* Event */ e){
143 // called during the very first move notification;
144 // can be used to initialize coordinates, can be overwritten.
146 // default implementation does nothing
148 onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop, /* Event */ e){
150 // called during every move notification;
151 // should actually move the node; can be overwritten.
152 this.onMoving(mover, leftTop);
153 var s = mover.node.style;
154 s.left = leftTop.l + "px";
155 s.top = leftTop.t + "px";
156 this.onMoved(mover, leftTop);
158 onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
160 // called before every incremental move; can be overwritten.
162 // default implementation does nothing
164 onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
166 // called after every incremental move; can be overwritten.
168 // default implementation does nothing
172 return dojo.dnd.Moveable;