| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | /*	Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.	Available via Academic Free License >= 2.1 OR the modified BSD license.	see: http://dojotoolkit.org/license for details*/if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojo.dnd.Mover"] = true;dojo.provide("dojo.dnd.Mover");dojo.require("dojo.dnd.common");dojo.require("dojo.dnd.autoscroll");dojo.declare("dojo.dnd.Mover", null, {	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);		var pos = e.touches ? e.touches[0] : e;		this.marginBox = {l: pos.pageX, t: pos.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, "onmousemove", this, "onFirstMove"),			dojo.connect(d, "ontouchmove", this, "onFirstMove"),			// These are called continually during the drag			dojo.connect(d, "onmousemove", this, "onMouseMove"),			dojo.connect(d, "ontouchmove", this, "onMouseMove"),			// And these are called at the end of the drag			dojo.connect(d, "onmouseup",   this, "onMouseUp"),			dojo.connect(d, "ontouchend", 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,			pos = e.touches ? e.touches[0] : e;		this.host.onMove(this, {l: m.l + pos.pageX, t: m.t + pos.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());		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;	}});}
 |