2010-11-15 07:39:52 +00:00
|
|
|
/*
|
|
|
|
Copyright (c) 2004-2010, 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
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2011-03-04 16:02:28 +00:00
|
|
|
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;
|
2010-11-15 07:39:52 +00:00
|
|
|
dojo.provide("dojo.dnd.Mover");
|
2011-03-04 16:02:28 +00:00
|
|
|
|
2010-11-15 07:39:52 +00:00
|
|
|
dojo.require("dojo.dnd.common");
|
|
|
|
dojo.require("dojo.dnd.autoscroll");
|
2011-03-04 16:02:28 +00:00
|
|
|
|
|
|
|
dojo.declare("dojo.dnd.Mover", null, {
|
|
|
|
constructor: function(node, e, host){
|
|
|
|
// summary:
|
|
|
|
// an object, which makes a node follow the mouse.
|
|
|
|
// 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,
|
|
|
|
firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
|
|
|
|
this.events = [
|
|
|
|
dojo.connect(d, "onmousemove", this, "onMouseMove"),
|
|
|
|
dojo.connect(d, "onmouseup", this, "onMouseUp"),
|
|
|
|
// cancel text selection and text dragging
|
|
|
|
dojo.connect(d, "ondragstart", dojo.stopEvent),
|
|
|
|
dojo.connect(d.body, "onselectstart", dojo.stopEvent),
|
|
|
|
firstEvent
|
|
|
|
];
|
|
|
|
// notify that the move has started
|
|
|
|
if(h && h.onMoveStart){
|
|
|
|
h.onMoveStart(this);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// mouse event processors
|
|
|
|
onMouseMove: function(e){
|
|
|
|
// summary:
|
|
|
|
// event processor for onmousemove
|
|
|
|
// e: Event
|
|
|
|
// mouse 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){
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
dojo.disconnect(this.events.pop());
|
|
|
|
},
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2010-11-15 07:39:52 +00:00
|
|
|
}
|