summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/dnd/Selector.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/dnd/Selector.js')
-rw-r--r--js/dojo/dojox/dnd/Selector.js211
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