123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- 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);
- }
- });
- });
|