]> git.wh0rd.org - tt-rss.git/blobdiff - lib/dojo/dnd/Mover.js.uncompressed.js
update dojo to 1.7.3
[tt-rss.git] / lib / dojo / dnd / Mover.js.uncompressed.js
diff --git a/lib/dojo/dnd/Mover.js.uncompressed.js b/lib/dojo/dnd/Mover.js.uncompressed.js
new file mode 100644 (file)
index 0000000..2b504c2
--- /dev/null
@@ -0,0 +1,119 @@
+define("dojo/dnd/Mover", ["../main", "../Evented", "../touch", "./common", "./autoscroll"], function(dojo, Evented, touch) {
+       // module:
+       //              dojo/dnd/Mover
+       // summary:
+       //              TODOC
+
+
+dojo.declare("dojo.dnd.Mover", [Evented], {
+       constructor: function(node, e, host){
+               // summary:
+               //              an object which makes a node follow the mouse, or touch-drag on touch devices.
+               //              Used as a default mover, and as a base class for custom movers.
+               // node: Node
+               //              a node (or node's id) to be moved
+               // e: Event
+               //              a mouse event, which started the move;
+               //              only pageX and pageY properties are used
+               // host: Object?
+               //              object which implements the functionality of the move,
+               //              and defines proper events (onMoveStart and onMoveStop)
+               this.node = dojo.byId(node);
+               this.marginBox = {l: e.pageX, t: e.pageY};
+               this.mouseButton = e.button;
+               var h = (this.host = host), d = node.ownerDocument;
+               this.events = [
+                       // At the start of a drag, onFirstMove is called, and then the following two
+                       // connects are disconnected
+                       dojo.connect(d, touch.move, this, "onFirstMove"),
+
+                       // These are called continually during the drag
+                       dojo.connect(d, touch.move, this, "onMouseMove"),
+
+                       // And these are called at the end of the drag
+                       dojo.connect(d, touch.release,   this, "onMouseUp"),
+
+                       // cancel text selection and text dragging
+                       dojo.connect(d, "ondragstart",   dojo.stopEvent),
+                       dojo.connect(d.body, "onselectstart", dojo.stopEvent)
+               ];
+               // notify that the move has started
+               if(h && h.onMoveStart){
+                       h.onMoveStart(this);
+               }
+       },
+       // mouse event processors
+       onMouseMove: function(e){
+               // summary:
+               //              event processor for onmousemove/ontouchmove
+               // e: Event
+               //              mouse/touch event
+               dojo.dnd.autoScroll(e);
+               var m = this.marginBox;
+               this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY}, e);
+               dojo.stopEvent(e);
+       },
+       onMouseUp: function(e){
+               if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ?
+                               e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too?
+                       this.destroy();
+               }
+               dojo.stopEvent(e);
+       },
+       // utilities
+       onFirstMove: function(e){
+               // summary:
+               //              makes the node absolute; it is meant to be called only once.
+               //              relative and absolutely positioned nodes are assumed to use pixel units
+               var s = this.node.style, l, t, h = this.host;
+               switch(s.position){
+                       case "relative":
+                       case "absolute":
+                               // assume that left and top values are in pixels already
+                               l = Math.round(parseFloat(s.left)) || 0;
+                               t = Math.round(parseFloat(s.top)) || 0;
+                               break;
+                       default:
+                               s.position = "absolute";        // enforcing the absolute mode
+                               var m = dojo.marginBox(this.node);
+                               // event.pageX/pageY (which we used to generate the initial
+                               // margin box) includes padding and margin set on the body.
+                               // However, setting the node's position to absolute and then
+                               // doing dojo.marginBox on it *doesn't* take that additional
+                               // space into account - so we need to subtract the combined
+                               // padding and margin.  We use getComputedStyle and
+                               // _getMarginBox/_getContentBox to avoid the extra lookup of
+                               // the computed style.
+                               var b = dojo.doc.body;
+                               var bs = dojo.getComputedStyle(b);
+                               var bm = dojo._getMarginBox(b, bs);
+                               var bc = dojo._getContentBox(b, bs);
+                               l = m.l - (bc.l - bm.l);
+                               t = m.t - (bc.t - bm.t);
+                               break;
+               }
+               this.marginBox.l = l - this.marginBox.l;
+               this.marginBox.t = t - this.marginBox.t;
+               if(h && h.onFirstMove){
+                       h.onFirstMove(this, e);
+               }
+
+               // Disconnect onmousemove and ontouchmove events that call this function
+               dojo.disconnect(this.events.shift());
+       },
+       destroy: function(){
+               // summary:
+               //              stops the move, deletes all references, so the object can be garbage-collected
+               dojo.forEach(this.events, dojo.disconnect);
+               // undo global settings
+               var h = this.host;
+               if(h && h.onMoveStop){
+                       h.onMoveStop(this);
+               }
+               // destroy objects
+               this.events = this.node = this.host = null;
+       }
+});
+
+return dojo.dnd.Mover;
+});