]> git.wh0rd.org - tt-rss.git/blob - lib/dojo/dnd/Mover.js.uncompressed.js
update dojo to 1.7.3
[tt-rss.git] / lib / dojo / dnd / Mover.js.uncompressed.js
1 define("dojo/dnd/Mover", ["../main", "../Evented", "../touch", "./common", "./autoscroll"], function(dojo, Evented, touch) {
2 // module:
3 // dojo/dnd/Mover
4 // summary:
5 // TODOC
6
7
8 dojo.declare("dojo.dnd.Mover", [Evented], {
9 constructor: function(node, e, host){
10 // summary:
11 // an object which makes a node follow the mouse, or touch-drag on touch devices.
12 // Used as a default mover, and as a base class for custom movers.
13 // node: Node
14 // a node (or node's id) to be moved
15 // e: Event
16 // a mouse event, which started the move;
17 // only pageX and pageY properties are used
18 // host: Object?
19 // object which implements the functionality of the move,
20 // and defines proper events (onMoveStart and onMoveStop)
21 this.node = dojo.byId(node);
22 this.marginBox = {l: e.pageX, t: e.pageY};
23 this.mouseButton = e.button;
24 var h = (this.host = host), d = node.ownerDocument;
25 this.events = [
26 // At the start of a drag, onFirstMove is called, and then the following two
27 // connects are disconnected
28 dojo.connect(d, touch.move, this, "onFirstMove"),
29
30 // These are called continually during the drag
31 dojo.connect(d, touch.move, this, "onMouseMove"),
32
33 // And these are called at the end of the drag
34 dojo.connect(d, touch.release, this, "onMouseUp"),
35
36 // cancel text selection and text dragging
37 dojo.connect(d, "ondragstart", dojo.stopEvent),
38 dojo.connect(d.body, "onselectstart", dojo.stopEvent)
39 ];
40 // notify that the move has started
41 if(h && h.onMoveStart){
42 h.onMoveStart(this);
43 }
44 },
45 // mouse event processors
46 onMouseMove: function(e){
47 // summary:
48 // event processor for onmousemove/ontouchmove
49 // e: Event
50 // mouse/touch event
51 dojo.dnd.autoScroll(e);
52 var m = this.marginBox;
53 this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY}, e);
54 dojo.stopEvent(e);
55 },
56 onMouseUp: function(e){
57 if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ?
58 e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too?
59 this.destroy();
60 }
61 dojo.stopEvent(e);
62 },
63 // utilities
64 onFirstMove: function(e){
65 // summary:
66 // makes the node absolute; it is meant to be called only once.
67 // relative and absolutely positioned nodes are assumed to use pixel units
68 var s = this.node.style, l, t, h = this.host;
69 switch(s.position){
70 case "relative":
71 case "absolute":
72 // assume that left and top values are in pixels already
73 l = Math.round(parseFloat(s.left)) || 0;
74 t = Math.round(parseFloat(s.top)) || 0;
75 break;
76 default:
77 s.position = "absolute"; // enforcing the absolute mode
78 var m = dojo.marginBox(this.node);
79 // event.pageX/pageY (which we used to generate the initial
80 // margin box) includes padding and margin set on the body.
81 // However, setting the node's position to absolute and then
82 // doing dojo.marginBox on it *doesn't* take that additional
83 // space into account - so we need to subtract the combined
84 // padding and margin. We use getComputedStyle and
85 // _getMarginBox/_getContentBox to avoid the extra lookup of
86 // the computed style.
87 var b = dojo.doc.body;
88 var bs = dojo.getComputedStyle(b);
89 var bm = dojo._getMarginBox(b, bs);
90 var bc = dojo._getContentBox(b, bs);
91 l = m.l - (bc.l - bm.l);
92 t = m.t - (bc.t - bm.t);
93 break;
94 }
95 this.marginBox.l = l - this.marginBox.l;
96 this.marginBox.t = t - this.marginBox.t;
97 if(h && h.onFirstMove){
98 h.onFirstMove(this, e);
99 }
100
101 // Disconnect onmousemove and ontouchmove events that call this function
102 dojo.disconnect(this.events.shift());
103 },
104 destroy: function(){
105 // summary:
106 // stops the move, deletes all references, so the object can be garbage-collected
107 dojo.forEach(this.events, dojo.disconnect);
108 // undo global settings
109 var h = this.host;
110 if(h && h.onMoveStop){
111 h.onMoveStop(this);
112 }
113 // destroy objects
114 this.events = this.node = this.host = null;
115 }
116 });
117
118 return dojo.dnd.Mover;
119 });