diff options
Diffstat (limited to 'js/dojo/dojox/dnd/Selector.js')
| -rw-r--r-- | js/dojo/dojox/dnd/Selector.js | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/js/dojo/dojox/dnd/Selector.js b/js/dojo/dojox/dnd/Selector.js new file mode 100644 index 0000000..58a9633 --- /dev/null +++ b/js/dojo/dojox/dnd/Selector.js @@ -0,0 +1,211 @@ +//>>built +define("dojox/dnd/Selector", ["dojo", "dojox", "dojo/dnd/Selector"], function(dojo, dojox) { + + return dojo.declare('dojox.dnd.Selector', dojo.dnd.Selector, { + + conservative: true, + + 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 + return this.conservative ? this._conservativeBBLogic(node, left, top, right, bottom) : this._liberalBBLogic(node, left, top, right, bottom); + }, + + 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; + }, + + _conservativeBBLogic: function(node, left, top, right, bottom) { + // summary: + // logic which determines whether a node is bounded by the + // left,top,right,bottom parameters. This function returns true + // only if the coordinates of the node parameter are fully + // encompassed by the box determined by the left, top, right, bottom parameters. + 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 + }, + + _liberalBBLogic: function(node, left, top, right, bottom) { + // summary: + // logic which determines whether a node is bounded by the + // left,top,right,bottom parameters. Allows for the case where + // any section of the box determined by the left,top,right,bottom parameters + // overlapping the coordinates of the node parameter constitutes a true + // return value + var c = dojo.position(node), xBounded, yBounded, tlx, tly, brx, bry, leftGreater = false, bottomGreater = false, + nodeTlx = c.x, nodeTly = c.y, nodeBrx = c.x + c.w, nodeBry = c.y + c.h; + // tlx, tly represents the x,y coordinates for the top left of the bounding box + // brx, bry represents the x,y coordinates for the bottom right of the bounding box + // nodeTlx, nodeTly represents the x,y coordinates for the top left of the dom node + // nodeBrx, nodeBry represents the x,y coordinates for the bottom right of the dom node + if (left < right) { + tlx = left; + tly = top; + } else { + leftGreater = true; + tlx = right; + tly = bottom; + } + if (top < bottom) { + bottomGreater = true; + brx = right; + bry = bottom; + } else { + brx = left; + bry = top; + tlx = right; + tly = bottom; + } + if (leftGreater && bottomGreater) { + // accommodate for the case where the user is drawing from top down and from right to left. + brx = left; + bry = bottom; + tlx = right; + tly = top; + } + xBounded = (nodeTlx >= tlx || nodeBrx <= brx) && (tlx <= nodeBrx && brx >= nodeTlx) || (nodeTlx <= tlx && nodeBrx >= brx); + yBounded = (tly <= nodeBry && bry >= nodeTly) || (nodeBry >= bry && nodeTly <= bry); + return xBounded && yBounded; // Boolean + } + } + ); +});
\ No newline at end of file |
