|
Struts example source code file (HtmlDragManager.js)
The Struts HtmlDragManager.js source code/* 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"); })(); Other Struts examples (source code examples)Here is a short list of links related to this Struts HtmlDragManager.js source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.