diff options
Diffstat (limited to 'js/dojo/dojox/grid/Selection.js')
| -rw-r--r-- | js/dojo/dojox/grid/Selection.js | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/js/dojo/dojox/grid/Selection.js b/js/dojo/dojox/grid/Selection.js new file mode 100644 index 0000000..56e6884 --- /dev/null +++ b/js/dojo/dojox/grid/Selection.js @@ -0,0 +1,267 @@ +//>>built +define("dojox/grid/Selection", [ + "dojo/_base/declare", + "dojo/_base/array", + "dojo/_base/lang", + "dojo/dom-attr" +], function(declare, array, lang, domAttr){ + +return declare("dojox.grid.Selection", null, { + // summary: + // Manages row selection for grid. Owned by grid and used internally + // for selection. Override to implement custom selection. + + constructor: function(inGrid){ + this.grid = inGrid; + this.selected = []; + + this.setMode(inGrid.selectionMode); + }, + + mode: 'extended', + + selected: null, + updating: 0, + selectedIndex: -1, + + setMode: function(mode){ + if(this.selected.length){ + this.deselectAll(); + } + if(mode != 'extended' && mode != 'multiple' && mode != 'single' && mode != 'none'){ + this.mode = 'extended'; + }else{ + this.mode = mode; + } + }, + + onCanSelect: function(inIndex){ + return this.grid.onCanSelect(inIndex); + }, + + onCanDeselect: function(inIndex){ + return this.grid.onCanDeselect(inIndex); + }, + + onSelected: function(inIndex){ + }, + + onDeselected: function(inIndex){ + }, + + //onSetSelected: function(inIndex, inSelect) { }; + onChanging: function(){ + }, + + onChanged: function(){ + }, + + isSelected: function(inIndex){ + if(this.mode == 'none'){ + return false; + } + return this.selected[inIndex]; + }, + + getFirstSelected: function(){ + if(!this.selected.length||this.mode == 'none'){ return -1; } + for(var i=0, l=this.selected.length; i<l; i++){ + if(this.selected[i]){ + return i; + } + } + return -1; + }, + + getNextSelected: function(inPrev){ + if(this.mode == 'none'){ return -1; } + for(var i=inPrev+1, l=this.selected.length; i<l; i++){ + if(this.selected[i]){ + return i; + } + } + return -1; + }, + + getSelected: function(){ + var result = []; + for(var i=0, l=this.selected.length; i<l; i++){ + if(this.selected[i]){ + result.push(i); + } + } + return result; + }, + + getSelectedCount: function(){ + var c = 0; + for(var i=0; i<this.selected.length; i++){ + if(this.selected[i]){ + c++; + } + } + return c; + }, + + _beginUpdate: function(){ + if(this.updating === 0){ + this.onChanging(); + } + this.updating++; + }, + + _endUpdate: function(){ + this.updating--; + if(this.updating === 0){ + this.onChanged(); + } + }, + + select: function(inIndex){ + if(this.mode == 'none'){ return; } + if(this.mode != 'multiple'){ + this.deselectAll(inIndex); + this.addToSelection(inIndex); + }else{ + this.toggleSelect(inIndex); + } + }, + + addToSelection: function(inIndex){ + if(this.mode == 'none'){ return; } + if(lang.isArray(inIndex)){ + array.forEach(inIndex, this.addToSelection, this); + return; + } + inIndex = Number(inIndex); + if(this.selected[inIndex]){ + this.selectedIndex = inIndex; + }else{ + if(this.onCanSelect(inIndex) !== false){ + this.selectedIndex = inIndex; + var rowNode = this.grid.getRowNode(inIndex); + if(rowNode){ + domAttr.set(rowNode, "aria-selected", "true"); + } + this._beginUpdate(); + this.selected[inIndex] = true; + //this.grid.onSelected(inIndex); + this.onSelected(inIndex); + //this.onSetSelected(inIndex, true); + this._endUpdate(); + } + } + }, + + deselect: function(inIndex){ + if(this.mode == 'none'){ return; } + if(lang.isArray(inIndex)){ + array.forEach(inIndex, this.deselect, this); + return; + } + inIndex = Number(inIndex); + if(this.selectedIndex == inIndex){ + this.selectedIndex = -1; + } + if(this.selected[inIndex]){ + if(this.onCanDeselect(inIndex) === false){ + return; + } + var rowNode = this.grid.getRowNode(inIndex); + if(rowNode){ + domAttr.set(rowNode, "aria-selected", "false"); + } + this._beginUpdate(); + delete this.selected[inIndex]; + //this.grid.onDeselected(inIndex); + this.onDeselected(inIndex); + //this.onSetSelected(inIndex, false); + this._endUpdate(); + } + }, + + setSelected: function(inIndex, inSelect){ + this[(inSelect ? 'addToSelection' : 'deselect')](inIndex); + }, + + toggleSelect: function(inIndex){ + if(lang.isArray(inIndex)){ + array.forEach(inIndex, this.toggleSelect, this); + return; + } + this.setSelected(inIndex, !this.selected[inIndex]); + }, + + _range: function(inFrom, inTo, func){ + var s = (inFrom >= 0 ? inFrom : inTo), e = inTo; + if(s > e){ + e = s; + s = inTo; + } + for(var i=s; i<=e; i++){ + func(i); + } + }, + + selectRange: function(inFrom, inTo){ + this._range(inFrom, inTo, lang.hitch(this, "addToSelection")); + }, + + deselectRange: function(inFrom, inTo){ + this._range(inFrom, inTo, lang.hitch(this, "deselect")); + }, + + insert: function(inIndex){ + this.selected.splice(inIndex, 0, false); + if(this.selectedIndex >= inIndex){ + this.selectedIndex++; + } + }, + + remove: function(inIndex){ + this.selected.splice(inIndex, 1); + if(this.selectedIndex >= inIndex){ + this.selectedIndex--; + } + }, + + deselectAll: function(inExcept){ + for(var i in this.selected){ + if((i!=inExcept)&&(this.selected[i]===true)){ + this.deselect(i); + } + } + }, + + clickSelect: function(inIndex, inCtrlKey, inShiftKey){ + if(this.mode == 'none'){ return; } + this._beginUpdate(); + if(this.mode != 'extended'){ + this.select(inIndex); + }else{ + var lastSelected = this.selectedIndex; + if(!inCtrlKey){ + this.deselectAll(inIndex); + } + if(inShiftKey){ + this.selectRange(lastSelected, inIndex); + }else if(inCtrlKey){ + this.toggleSelect(inIndex); + }else{ + this.addToSelection(inIndex); + } + } + this._endUpdate(); + }, + + clickSelectEvent: function(e){ + this.clickSelect(e.rowIndex, dojo.isCopyKey(e), e.shiftKey); + }, + + clear: function(){ + this._beginUpdate(); + this.deselectAll(); + this._endUpdate(); + } +}); +});
\ No newline at end of file |
