diff options
Diffstat (limited to 'js/dojo-1.7.2/dojox/grid/TreeSelection.js')
| -rw-r--r-- | js/dojo-1.7.2/dojox/grid/TreeSelection.js | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/grid/TreeSelection.js b/js/dojo-1.7.2/dojox/grid/TreeSelection.js new file mode 100644 index 0000000..84e4b74 --- /dev/null +++ b/js/dojo-1.7.2/dojox/grid/TreeSelection.js @@ -0,0 +1,216 @@ +//>>built +define("dojox/grid/TreeSelection", [ + "../main", + "dojo/_base/declare", + "dojo/_base/array", + "dojo/_base/lang", + "dojo/dom-attr", + "dojo/query", + "./DataSelection" +], function(dojox, declare, array, lang, domAttr, query, DataSelection){ + +return declare("dojox.grid.TreeSelection", DataSelection, { + setMode: function(mode){ + this.selected = {}; + this.sorted_sel = []; + this.sorted_ltos = {}; + this.sorted_stol = {}; + DataSelection.prototype.setMode.call(this, mode); + }, + addToSelection: function(inItemOrIndex){ + if(this.mode == 'none'){ return; } + var idx = null; + if(typeof inItemOrIndex == "number" || typeof inItemOrIndex == "string"){ + idx = inItemOrIndex; + }else{ + idx = this.grid.getItemIndex(inItemOrIndex); + } + if(this.selected[idx]){ + this.selectedIndex = idx; + }else{ + if(this.onCanSelect(idx) !== false){ + this.selectedIndex = idx; + var rowNodes = query("tr[dojoxTreeGridPath='" + idx + "']", this.grid.domNode); + if(rowNodes.length){ + domAttr.set(rowNodes[0], "aria-selected", "true"); + } + this._beginUpdate(); + this.selected[idx] = true; + this._insertSortedSelection(idx); + //this.grid.onSelected(idx); + this.onSelected(idx); + //this.onSetSelected(idx, true); + this._endUpdate(); + } + } + }, + deselect: function(inItemOrIndex){ + if(this.mode == 'none'){ return; } + var idx = null; + if(typeof inItemOrIndex == "number" || typeof inItemOrIndex == "string"){ + idx = inItemOrIndex; + }else{ + idx = this.grid.getItemIndex(inItemOrIndex); + } + if(this.selectedIndex == idx){ + this.selectedIndex = -1; + } + if(this.selected[idx]){ + if(this.onCanDeselect(idx) === false){ + return; + } + var rowNodes = query("tr[dojoxTreeGridPath='" + idx + "']", this.grid.domNode); + if(rowNodes.length){ + domAttr.set(rowNodes[0], "aria-selected", "false"); + } + this._beginUpdate(); + delete this.selected[idx]; + this._removeSortedSelection(idx); + //this.grid.onDeselected(idx); + this.onDeselected(idx); + //this.onSetSelected(idx, false); + this._endUpdate(); + } + }, + getSelected: function(){ + var result = []; + for(var i in this.selected){ + if(this.selected[i]){ + result.push(this.grid.getItem(i)); + } + } + return result; + }, + getSelectedCount: function(){ + var c = 0; + for(var i in this.selected){ + if(this.selected[i]){ + c++; + } + } + return c; + }, + _bsearch: function(v){ + var o = this.sorted_sel; + var h = o.length - 1, l = 0, m; + while(l<=h){ + var cmp = this._comparePaths(o[m = (l + h) >> 1], v); + if(cmp < 0){ l = m + 1; continue; } + if(cmp > 0){ h = m - 1; continue; } + return m; + } + return cmp < 0 ? m - cmp : m; + }, + _comparePaths: function(a, b){ + for(var i=0, l=(a.length < b.length ? a.length : b.length); i<l; i++){ + if(a[i]<b[i]){ return -1; } + if(a[i]>b[i]){ return 1; } + } + if(a.length<b.length){ return -1; } + if(a.length>b.length){ return 1; } + return 0; + }, + _insertSortedSelection: function(index){ + index = String(index); + var s = this.sorted_sel; + var sl = this.sorted_ltos; + var ss = this.sorted_stol; + + var lpath = index.split('/'); + lpath = array.map(lpath, function(item){ return parseInt(item, 10); }); + sl[lpath] = index; + ss[index] = lpath; + + if(s.length === 0){ + s.push(lpath); + return; + } + if(s.length==1){ + var cmp = this._comparePaths(s[0], lpath); + if(cmp==1){ s.unshift(lpath); } + else{ s.push(lpath); } + return; + } + + var idx = this._bsearch(lpath); + this.sorted_sel.splice(idx, 0, lpath); + }, + _removeSortedSelection: function(index){ + index = String(index); + var s = this.sorted_sel; + var sl = this.sorted_ltos; + var ss = this.sorted_stol; + + if(s.length === 0){ + return; + } + + var lpath = ss[index]; + if(!lpath){ return; } + + var idx = this._bsearch(lpath); + if(idx > -1){ + delete sl[lpath]; + delete ss[index]; + s.splice(idx, 1); + } + }, + getFirstSelected: function(){ + if(!this.sorted_sel.length||this.mode == 'none'){ return -1; } + var fpath = this.sorted_sel[0]; + if(!fpath){ + return -1; + } + fpath = this.sorted_ltos[fpath]; + if(!fpath){ + return -1; + } + return fpath; + }, + getNextSelected: function(inPrev){ + if(!this.sorted_sel.length||this.mode == 'none'){ return -1; } + inPrev = String(inPrev); + var prevPath = this.sorted_stol[inPrev]; + if(!prevPath){ return -1; } + + var idx = this._bsearch(prevPath); + var lpath = this.sorted_sel[idx+1]; + if(!lpath){ + return -1; + } + return this.sorted_ltos[lpath]; + }, + _range: function(inFrom, inTo, func){ + if(!lang.isString(inFrom) && inFrom < 0){ + inFrom = inTo; + } + var cells = this.grid.layout.cells, + store = this.grid.store, + grid = this.grid; + inFrom = new dojox.grid.TreePath(String(inFrom), grid); + inTo = new dojox.grid.TreePath(String(inTo), grid); + + if(inFrom.compare(inTo) > 0){ + var tmp = inFrom; + inFrom = inTo; + inTo = tmp; + } + + var inFromStr = inFrom._str, inToStr = inTo._str; + + // select/deselect the first + func(inFromStr); + + var p = inFrom; + while((p = p.next())){ + if(p._str == inToStr){ + break; + } + func(p._str); + } + + // select/deselect the last + func(inToStr); + } +}); +});
\ No newline at end of file |
