[483] | 1 | define(["dojo/_base/lang","dojo/_base/array", "dojo/_base/declare", "dojo/on", "dojo/touch", "dojo/_base/event"], |
---|
| 2 | function(lang, arr, declare, on, touch, event){ |
---|
| 3 | return declare("dojox.gfx.Mover", null, { |
---|
| 4 | constructor: function(shape, e, host){ |
---|
| 5 | // summary: |
---|
| 6 | // an object, which makes a shape follow the mouse, |
---|
| 7 | // used as a default mover, and as a base class for custom movers |
---|
| 8 | // shape: dojox/gfx.Shape |
---|
| 9 | // a shape object to be moved |
---|
| 10 | // e: Event |
---|
| 11 | // a mouse event, which started the move; |
---|
| 12 | // only clientX and clientY properties are used |
---|
| 13 | // host: Object? |
---|
| 14 | // object which implements the functionality of the move, |
---|
| 15 | // and defines proper events (onMoveStart and onMoveStop) |
---|
| 16 | this.shape = shape; |
---|
| 17 | this.lastX = e.clientX; |
---|
| 18 | this.lastY = e.clientY; |
---|
| 19 | var h = this.host = host, d = document, |
---|
| 20 | firstEvent = on(d, touch.move, lang.hitch(this, "onFirstMove")); |
---|
| 21 | this.events = [ |
---|
| 22 | on(d, touch.move, lang.hitch(this, "onMouseMove")), |
---|
| 23 | on(d, touch.release, lang.hitch(this, "destroy")), |
---|
| 24 | // cancel text selection and text dragging |
---|
| 25 | on(d, "dragstart", lang.hitch(event, "stop")), |
---|
| 26 | on(d, "selectstart", lang.hitch(event, "stop")), |
---|
| 27 | firstEvent |
---|
| 28 | ]; |
---|
| 29 | // notify that the move has started |
---|
| 30 | if(h && h.onMoveStart){ |
---|
| 31 | h.onMoveStart(this); |
---|
| 32 | } |
---|
| 33 | }, |
---|
| 34 | // mouse event processors |
---|
| 35 | onMouseMove: function(e){ |
---|
| 36 | // summary: |
---|
| 37 | // event processor for onmousemove |
---|
| 38 | // e: Event |
---|
| 39 | // mouse event |
---|
| 40 | var x = e.clientX; |
---|
| 41 | var y = e.clientY; |
---|
| 42 | this.host.onMove(this, {dx: x - this.lastX, dy: y - this.lastY}); |
---|
| 43 | this.lastX = x; |
---|
| 44 | this.lastY = y; |
---|
| 45 | event.stop(e); |
---|
| 46 | }, |
---|
| 47 | // utilities |
---|
| 48 | onFirstMove: function(){ |
---|
| 49 | // summary: |
---|
| 50 | // it is meant to be called only once |
---|
| 51 | this.host.onFirstMove(this); |
---|
| 52 | this.events.pop().remove(); |
---|
| 53 | }, |
---|
| 54 | destroy: function(){ |
---|
| 55 | // summary: |
---|
| 56 | // stops the move, deletes all references, so the object can be garbage-collected |
---|
| 57 | arr.forEach(this.events, function(handle){ |
---|
| 58 | handle.remove(); |
---|
| 59 | }); |
---|
| 60 | // undo global settings |
---|
| 61 | var h = this.host; |
---|
| 62 | if(h && h.onMoveStop){ |
---|
| 63 | h.onMoveStop(this); |
---|
| 64 | } |
---|
| 65 | // destroy objects |
---|
| 66 | this.events = this.shape = null; |
---|
| 67 | } |
---|
| 68 | }); |
---|
| 69 | }); |
---|