New file |
0,0 → 1,293 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
|
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
|
http://dojotoolkit.org/community/licensing.shtml |
*/ |
|
dojo.provide("dojo.dnd.HtmlDragManager"); |
dojo.require("dojo.dnd.DragAndDrop"); |
dojo.require("dojo.event.*"); |
dojo.require("dojo.lang.array"); |
dojo.require("dojo.html.common"); |
dojo.require("dojo.html.layout"); |
dojo.declare("dojo.dnd.HtmlDragManager", dojo.dnd.DragManager, {disabled:false, nestedTargets:false, mouseDownTimer:null, dsCounter:0, dsPrefix:"dojoDragSource", dropTargetDimensions:[], currentDropTarget:null, previousDropTarget:null, _dragTriggered:false, selectedSources:[], dragObjects:[], dragSources:[], dropTargets:[], currentX:null, currentY:null, lastX:null, lastY:null, mouseDownX:null, mouseDownY:null, threshold:7, dropAcceptable:false, cancelEvent:function (e) { |
e.stopPropagation(); |
e.preventDefault(); |
}, registerDragSource:function (ds) { |
if (ds["domNode"]) { |
var dp = this.dsPrefix; |
var dpIdx = dp + "Idx_" + (this.dsCounter++); |
ds.dragSourceId = dpIdx; |
this.dragSources[dpIdx] = ds; |
ds.domNode.setAttribute(dp, dpIdx); |
if (dojo.render.html.ie) { |
dojo.event.browser.addListener(ds.domNode, "ondragstart", this.cancelEvent); |
} |
} |
}, unregisterDragSource:function (ds) { |
if (ds["domNode"]) { |
var dp = this.dsPrefix; |
var dpIdx = ds.dragSourceId; |
delete ds.dragSourceId; |
delete this.dragSources[dpIdx]; |
ds.domNode.setAttribute(dp, null); |
if (dojo.render.html.ie) { |
dojo.event.browser.removeListener(ds.domNode, "ondragstart", this.cancelEvent); |
} |
} |
}, registerDropTarget:function (dt) { |
this.dropTargets.push(dt); |
}, unregisterDropTarget:function (dt) { |
var index = dojo.lang.find(this.dropTargets, dt, true); |
if (index >= 0) { |
this.dropTargets.splice(index, 1); |
} |
}, getDragSource:function (e) { |
var tn = e.target; |
if (tn === dojo.body()) { |
return; |
} |
var ta = dojo.html.getAttribute(tn, this.dsPrefix); |
while ((!ta) && (tn)) { |
tn = tn.parentNode; |
if ((!tn) || (tn === dojo.body())) { |
return; |
} |
ta = dojo.html.getAttribute(tn, this.dsPrefix); |
} |
return this.dragSources[ta]; |
}, onKeyDown:function (e) { |
}, onMouseDown:function (e) { |
if (this.disabled) { |
return; |
} |
if (dojo.render.html.ie) { |
if (e.button != 1) { |
return; |
} |
} else { |
if (e.which != 1) { |
return; |
} |
} |
var target = e.target.nodeType == dojo.html.TEXT_NODE ? e.target.parentNode : e.target; |
if (dojo.html.isTag(target, "button", "textarea", "input", "select", "option")) { |
return; |
} |
var ds = this.getDragSource(e); |
if (!ds) { |
return; |
} |
if (!dojo.lang.inArray(this.selectedSources, ds)) { |
this.selectedSources.push(ds); |
ds.onSelected(); |
} |
this.mouseDownX = e.pageX; |
this.mouseDownY = e.pageY; |
e.preventDefault(); |
dojo.event.connect(document, "onmousemove", this, "onMouseMove"); |
}, onMouseUp:function (e, cancel) { |
if (this.selectedSources.length == 0) { |
return; |
} |
this.mouseDownX = null; |
this.mouseDownY = null; |
this._dragTriggered = false; |
e.dragSource = this.dragSource; |
if ((!e.shiftKey) && (!e.ctrlKey)) { |
if (this.currentDropTarget) { |
this.currentDropTarget.onDropStart(); |
} |
dojo.lang.forEach(this.dragObjects, function (tempDragObj) { |
var ret = null; |
if (!tempDragObj) { |
return; |
} |
if (this.currentDropTarget) { |
e.dragObject = tempDragObj; |
var ce = this.currentDropTarget.domNode.childNodes; |
if (ce.length > 0) { |
e.dropTarget = ce[0]; |
while (e.dropTarget == tempDragObj.domNode) { |
e.dropTarget = e.dropTarget.nextSibling; |
} |
} else { |
e.dropTarget = this.currentDropTarget.domNode; |
} |
if (this.dropAcceptable) { |
ret = this.currentDropTarget.onDrop(e); |
} else { |
this.currentDropTarget.onDragOut(e); |
} |
} |
e.dragStatus = this.dropAcceptable && ret ? "dropSuccess" : "dropFailure"; |
dojo.lang.delayThese([function () { |
try { |
tempDragObj.dragSource.onDragEnd(e); |
} |
catch (err) { |
var ecopy = {}; |
for (var i in e) { |
if (i == "type") { |
ecopy.type = "mouseup"; |
continue; |
} |
ecopy[i] = e[i]; |
} |
tempDragObj.dragSource.onDragEnd(ecopy); |
} |
}, function () { |
tempDragObj.onDragEnd(e); |
}]); |
}, this); |
this.selectedSources = []; |
this.dragObjects = []; |
this.dragSource = null; |
if (this.currentDropTarget) { |
this.currentDropTarget.onDropEnd(); |
} |
} else { |
} |
dojo.event.disconnect(document, "onmousemove", this, "onMouseMove"); |
this.currentDropTarget = null; |
}, onScroll:function () { |
for (var i = 0; i < this.dragObjects.length; i++) { |
if (this.dragObjects[i].updateDragOffset) { |
this.dragObjects[i].updateDragOffset(); |
} |
} |
if (this.dragObjects.length) { |
this.cacheTargetLocations(); |
} |
}, _dragStartDistance:function (x, y) { |
if ((!this.mouseDownX) || (!this.mouseDownX)) { |
return; |
} |
var dx = Math.abs(x - this.mouseDownX); |
var dx2 = dx * dx; |
var dy = Math.abs(y - this.mouseDownY); |
var dy2 = dy * dy; |
return parseInt(Math.sqrt(dx2 + dy2), 10); |
}, cacheTargetLocations:function () { |
dojo.profile.start("cacheTargetLocations"); |
this.dropTargetDimensions = []; |
dojo.lang.forEach(this.dropTargets, function (tempTarget) { |
var tn = tempTarget.domNode; |
if (!tn || !tempTarget.accepts([this.dragSource])) { |
return; |
} |
var abs = dojo.html.getAbsolutePosition(tn, true); |
var bb = dojo.html.getBorderBox(tn); |
this.dropTargetDimensions.push([[abs.x, abs.y], [abs.x + bb.width, abs.y + bb.height], tempTarget]); |
}, this); |
dojo.profile.end("cacheTargetLocations"); |
}, onMouseMove:function (e) { |
if ((dojo.render.html.ie) && (e.button != 1)) { |
this.currentDropTarget = null; |
this.onMouseUp(e, true); |
return; |
} |
if ((this.selectedSources.length) && (!this.dragObjects.length)) { |
var dx; |
var dy; |
if (!this._dragTriggered) { |
this._dragTriggered = (this._dragStartDistance(e.pageX, e.pageY) > this.threshold); |
if (!this._dragTriggered) { |
return; |
} |
dx = e.pageX - this.mouseDownX; |
dy = e.pageY - this.mouseDownY; |
} |
this.dragSource = this.selectedSources[0]; |
dojo.lang.forEach(this.selectedSources, function (tempSource) { |
if (!tempSource) { |
return; |
} |
var tdo = tempSource.onDragStart(e); |
if (tdo) { |
tdo.onDragStart(e); |
tdo.dragOffset.y += dy; |
tdo.dragOffset.x += dx; |
tdo.dragSource = tempSource; |
this.dragObjects.push(tdo); |
} |
}, this); |
this.previousDropTarget = null; |
this.cacheTargetLocations(); |
} |
dojo.lang.forEach(this.dragObjects, function (dragObj) { |
if (dragObj) { |
dragObj.onDragMove(e); |
} |
}); |
if (this.currentDropTarget) { |
var c = dojo.html.toCoordinateObject(this.currentDropTarget.domNode, true); |
var dtp = [[c.x, c.y], [c.x + c.width, c.y + c.height]]; |
} |
if ((!this.nestedTargets) && (dtp) && (this.isInsideBox(e, dtp))) { |
if (this.dropAcceptable) { |
this.currentDropTarget.onDragMove(e, this.dragObjects); |
} |
} else { |
var bestBox = this.findBestTarget(e); |
if (bestBox.target === null) { |
if (this.currentDropTarget) { |
this.currentDropTarget.onDragOut(e); |
this.previousDropTarget = this.currentDropTarget; |
this.currentDropTarget = null; |
} |
this.dropAcceptable = false; |
return; |
} |
if (this.currentDropTarget !== bestBox.target) { |
if (this.currentDropTarget) { |
this.previousDropTarget = this.currentDropTarget; |
this.currentDropTarget.onDragOut(e); |
} |
this.currentDropTarget = bestBox.target; |
e.dragObjects = this.dragObjects; |
this.dropAcceptable = this.currentDropTarget.onDragOver(e); |
} else { |
if (this.dropAcceptable) { |
this.currentDropTarget.onDragMove(e, this.dragObjects); |
} |
} |
} |
}, findBestTarget:function (e) { |
var _this = this; |
var bestBox = new Object(); |
bestBox.target = null; |
bestBox.points = null; |
dojo.lang.every(this.dropTargetDimensions, function (tmpDA) { |
if (!_this.isInsideBox(e, tmpDA)) { |
return true; |
} |
bestBox.target = tmpDA[2]; |
bestBox.points = tmpDA; |
return Boolean(_this.nestedTargets); |
}); |
return bestBox; |
}, isInsideBox:function (e, coords) { |
if ((e.pageX > coords[0][0]) && (e.pageX < coords[1][0]) && (e.pageY > coords[0][1]) && (e.pageY < coords[1][1])) { |
return true; |
} |
return false; |
}, onMouseOver:function (e) { |
}, onMouseOut:function (e) { |
}}); |
dojo.dnd.dragManager = new dojo.dnd.HtmlDragManager(); |
(function () { |
var d = document; |
var dm = dojo.dnd.dragManager; |
dojo.event.connect(d, "onkeydown", dm, "onKeyDown"); |
dojo.event.connect(d, "onmouseover", dm, "onMouseOver"); |
dojo.event.connect(d, "onmouseout", dm, "onMouseOut"); |
dojo.event.connect(d, "onmousedown", dm, "onMouseDown"); |
dojo.event.connect(d, "onmouseup", dm, "onMouseUp"); |
dojo.event.connect(window, "onscroll", dm, "onScroll"); |
})(); |
|