| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | /*	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["dojox.dnd.Selector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.dnd.Selector"] = true;dojo.provide("dojox.dnd.Selector");dojo.require("dojo.dnd.Selector");dojo.declare(	"dojox.dnd.Selector",	dojo.dnd.Selector,	{		isSelected: function(node){			//	summary:			//		checks if node is selected			//	node: String|DomNode:			//		Node to check (id or DOM Node)			var id = dojo.isString(node) ? node : node.id,				item = this.getItem(id);			return item && this.selected[id];	// Boolean		},				selectNode: function(node, add){			//	summary:			//		selects a node			//	node: String|DomNode:			//		Node to select (id or DOM Node)			//	add: Boolean?:			//		If true, node is added to selection, otherwise current			//		selection is removed, and node will be the only selection.			if(!add){				this.selectNone();			}			var id = dojo.isString(node) ? node : node.id,				item = this.getItem(id);			if(item){				this._removeAnchor();				this.anchor = dojo.byId(node);				this._addItemClass(this.anchor, "Anchor");				this.selection[id] = 1;				this._addItemClass(this.anchor, "Selected");			}			return this;	// self		},				deselectNode: function(node){			//	summary:			//		deselects a node			//	node: String|DomNode:			//		Node to deselect (id or DOM Node)			var id = dojo.isString(node) ? node : node.id,				item = this.getItem(id);			if(item && this.selection[id]){				if(this.anchor === dojo.byId(node)){					this._removeAnchor();				}				delete this.selection[id];				this._removeItemClass(this.anchor, "Selected");			}			return this;	// self		},				selectByBBox: function(left, top, right, bottom, add) {			//	summary:			//		selects nodes by bounding box			//	left: Number:			//		Left coordinate of the bounding box			//	top: Number:			//		Top coordinate of the bounding box			//	right: Number:			//		Right coordinate of the bounding box			//	bottom: Number:			//		Bottom coordinate of the bounding box			//	add: Boolean?:			//		If true, node is added to selection, otherwise current			//		selection is removed, and node will be the only selection.			// user has drawn a bounding box ... time to see whether any dom nodes			// in this container satisfy the bounding box range.			if(!add){				this.selectNone();			}			this.forInItems(function(data, id){				var node = dojo.byId(id);				if(node && this._isBoundedByBox(node, left, top, right, bottom)){					this.selectNode(id, true);				}			}, this);			return this;	// self		},				_isBoundedByBox: function(node, left, top, right, bottom) {			//	summary:			//		figures out whether certain coodinates bound a particular			//		dom node.			//	node: String|DomNode:			//		Node to check (id or DOM Node)			//	left: Number:			//		Left coordinate of the bounding box			//	top: Number:			//		Top coordinate of the bounding box			//	right: Number:			//		Right coordinate of the bounding box			//	bottom: Number:			//		Bottom coordinate of the bounding box			var c = dojo.coords(node), t;			// normalize input			if(left > right){				t = left;				left = right;				right = t;			}			if(top > bottom){				t = top;				top = bottom;				bottom = t;			}			return c.x >= left && c.x + c.w <= right && c.y >= top && c.y + c.h <= bottom;	// Boolean		},				shift: function(toNext, add) {			//	summary:			//		shifts the currently selected dnd item forwards and backwards.			//		One possible use would be to allow a user select different			//		dnd items using the right and left keys.			//	toNext: Boolean:			//		If true, we select the next node, otherwise the previous one.			//	add: Boolean?:			//		If true, add to selection, otherwise current selection is			//		removed before adding any nodes.			var selectedNodes = this.getSelectedNodes();			if(selectedNodes && selectedNodes.length) {				// only delegate to selectNode if at least one node is selected.				// If multiple nodes are selected assume that we go with				// the last selected node.				this.selectNode(this._getNodeId(selectedNodes[selectedNodes.length - 1].id, toNext), add);			}		},		_getNodeId: function(nodeId, toNext) {			//	summary:			//		finds a next/previous node in relation to nodeId			//	nodeId: String:			//		the id of the node to use as the base node			//	toNext: Boolean:			//		If true, we select the next node, otherwise the previous one.			var allNodes = this.getAllNodes(), newId = nodeId;			for(var i = 0, l = allNodes.length; i < l; ++i) {				if(allNodes[i].id == nodeId) {					// have a match ... make sure we don't go outside					var j = Math.min(l - 1, Math.max(0, i + (toNext ? 1 : -1)));					if(i != j){						// we should be fine to go with the id the user has requested.						newId = allNodes[j].id;					}					break;				}			}			// if we don't get a match, the newId defaults to the currently selected node			return newId;		}	});}
 |