Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojo.dnd.Selector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojo.dnd.Selector"] = true;dojo.provide("dojo.dnd.Selector");dojo.require("dojo.dnd.common");dojo.require("dojo.dnd.Container");/*Container item states:"" - an item is not selected"Selected" - an item is selected"Anchor" - an item is selected, and is an anchor for a "shift" selection*/dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {// summary: a Selector object, which knows how to select its childrenconstructor: function(node, params){// summary: a constructor of the Selector// node: Node: node or node's id to build the selector on// params: Object: a dict of parameters, recognized parameters are:// singular: Boolean: allows selection of only one element, if true// the rest of parameters are passed to the containerif(!params){ params = {}; }this.singular = params.singular;// class-specific variablesthis.selection = {};this.anchor = null;this.simpleSelection = false;// set up eventsthis.events.push(dojo.connect(this.node, "onmousedown", this, "onMouseDown"),dojo.connect(this.node, "onmouseup", this, "onMouseUp"));},// object attributes (for markup)singular: false, // is singular property// methodsgetSelectedNodes: function(){// summary: returns a list (an array) of selected nodesvar t = new dojo.NodeList();var e = dojo.dnd._empty;for(var i in this.selection){if(i in e){ continue; }t.push(dojo.byId(i));}return t; // Array},selectNone: function(){// summary: unselects all itemsreturn this._removeSelection()._removeAnchor(); // self},selectAll: function(){// summary: selects all itemsthis.forInItems(function(data, id){this._addItemClass(dojo.byId(id), "Selected");this.selection[id] = 1;}, this);return this._removeAnchor(); // self},deleteSelectedNodes: function(){// summary: deletes all selected itemsvar e = dojo.dnd._empty;for(var i in this.selection){if(i in e){ continue; }var n = dojo.byId(i);this.delItem(i);dojo._destroyElement(n);}this.anchor = null;this.selection = {};return this; // self},insertNodes: function(addSelected, data, before, anchor){// summary: inserts new data items (see Container's insertNodes method for details)// addSelected: Boolean: all new nodes will be added to selected items, if true, no selection change otherwise// data: Array: a list of data items, which should be processed by the creator function// before: Boolean: insert before the anchor, if true, and after the anchor otherwise// anchor: Node: the anchor node to be used as a point of insertionvar oldCreator = this._normalizedCreator;this._normalizedCreator = function(item, hint){var t = oldCreator.call(this, item, hint);if(addSelected){if(!this.anchor){this.anchor = t.node;this._removeItemClass(t.node, "Selected");this._addItemClass(this.anchor, "Anchor");}else if(this.anchor != t.node){this._removeItemClass(t.node, "Anchor");this._addItemClass(t.node, "Selected");}this.selection[t.node.id] = 1;}else{this._removeItemClass(t.node, "Selected");this._removeItemClass(t.node, "Anchor");}return t;};dojo.dnd.Selector.superclass.insertNodes.call(this, data, before, anchor);this._normalizedCreator = oldCreator;return this; // self},destroy: function(){// summary: prepares the object to be garbage-collecteddojo.dnd.Selector.superclass.destroy.call(this);this.selection = this.anchor = null;},// markup methodsmarkupFactory: function(params, node){params._skipStartup = true;return new dojo.dnd.Selector(node, params);},// mouse eventsonMouseDown: function(e){// summary: event processor for onmousedown// e: Event: mouse eventif(!this.current){ return; }if(!this.singular && !dojo.dnd.getCopyKeyState(e) && !e.shiftKey && (this.current.id in this.selection)){this.simpleSelection = true;dojo.stopEvent(e);return;}if(!this.singular && e.shiftKey){if(!dojo.dnd.getCopyKeyState(e)){this._removeSelection();}var c = dojo.query("> .dojoDndItem", this.parent);if(c.length){if(!this.anchor){this.anchor = c[0];this._addItemClass(this.anchor, "Anchor");}this.selection[this.anchor.id] = 1;if(this.anchor != this.current){var i = 0;for(; i < c.length; ++i){var node = c[i];if(node == this.anchor || node == this.current){ break; }}for(++i; i < c.length; ++i){var node = c[i];if(node == this.anchor || node == this.current){ break; }this._addItemClass(node, "Selected");this.selection[node.id] = 1;}this._addItemClass(this.current, "Selected");this.selection[this.current.id] = 1;}}}else{if(this.singular){if(this.anchor == this.current){if(dojo.dnd.getCopyKeyState(e)){this.selectNone();}}else{this.selectNone();this.anchor = this.current;this._addItemClass(this.anchor, "Anchor");this.selection[this.current.id] = 1;}}else{if(dojo.dnd.getCopyKeyState(e)){if(this.anchor == this.current){delete this.selection[this.anchor.id];this._removeAnchor();}else{if(this.current.id in this.selection){this._removeItemClass(this.current, "Selected");delete this.selection[this.current.id];}else{if(this.anchor){this._removeItemClass(this.anchor, "Anchor");this._addItemClass(this.anchor, "Selected");}this.anchor = this.current;this._addItemClass(this.current, "Anchor");this.selection[this.current.id] = 1;}}}else{if(!(this.current.id in this.selection)){this.selectNone();this.anchor = this.current;this._addItemClass(this.current, "Anchor");this.selection[this.current.id] = 1;}}}}dojo.stopEvent(e);},onMouseUp: function(e){// summary: event processor for onmouseup// e: Event: mouse eventif(!this.simpleSelection){ return; }this.simpleSelection = false;this.selectNone();if(this.current){this.anchor = this.current;this._addItemClass(this.anchor, "Anchor");this.selection[this.current.id] = 1;}},onMouseMove: function(e){// summary: event processor for onmousemove// e: Event: mouse eventthis.simpleSelection = false;},// utilitiesonOverEvent: function(){// summary: this function is called once, when mouse is over our containerthis.onmousemoveEvent = dojo.connect(this.node, "onmousemove", this, "onMouseMove");},onOutEvent: function(){// summary: this function is called once, when mouse is out of our containerdojo.disconnect(this.onmousemoveEvent);delete this.onmousemoveEvent;},_removeSelection: function(){// summary: unselects all itemsvar e = dojo.dnd._empty;for(var i in this.selection){if(i in e){ continue; }var node = dojo.byId(i);if(node){ this._removeItemClass(node, "Selected"); }}this.selection = {};return this; // self},_removeAnchor: function(){if(this.anchor){this._removeItemClass(this.anchor, "Anchor");this.anchor = null;}return this; // self}});}