TreeSelection.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. define("dojox/grid/TreeSelection", [
  2. "../main",
  3. "dojo/_base/declare",
  4. "dojo/_base/array",
  5. "dojo/_base/lang",
  6. "dojo/dom-attr",
  7. "dojo/query",
  8. "./DataSelection"
  9. ], function(dojox, declare, array, lang, domAttr, query, DataSelection){
  10. return declare("dojox.grid.TreeSelection", DataSelection, {
  11. setMode: function(mode){
  12. this.selected = {};
  13. this.sorted_sel = [];
  14. this.sorted_ltos = {};
  15. this.sorted_stol = {};
  16. DataSelection.prototype.setMode.call(this, mode);
  17. },
  18. addToSelection: function(inItemOrIndex){
  19. if(this.mode == 'none'){ return; }
  20. var idx = null;
  21. if(typeof inItemOrIndex == "number" || typeof inItemOrIndex == "string"){
  22. idx = inItemOrIndex;
  23. }else{
  24. idx = this.grid.getItemIndex(inItemOrIndex);
  25. }
  26. if(this.selected[idx]){
  27. this.selectedIndex = idx;
  28. }else{
  29. if(this.onCanSelect(idx) !== false){
  30. this.selectedIndex = idx;
  31. var rowNodes = query("tr[dojoxTreeGridPath='" + idx + "']", this.grid.domNode);
  32. if(rowNodes.length){
  33. domAttr.set(rowNodes[0], "aria-selected", "true");
  34. }
  35. this._beginUpdate();
  36. this.selected[idx] = true;
  37. this._insertSortedSelection(idx);
  38. //this.grid.onSelected(idx);
  39. this.onSelected(idx);
  40. //this.onSetSelected(idx, true);
  41. this._endUpdate();
  42. }
  43. }
  44. },
  45. deselect: function(inItemOrIndex){
  46. if(this.mode == 'none'){ return; }
  47. var idx = null;
  48. if(typeof inItemOrIndex == "number" || typeof inItemOrIndex == "string"){
  49. idx = inItemOrIndex;
  50. }else{
  51. idx = this.grid.getItemIndex(inItemOrIndex);
  52. }
  53. if(this.selectedIndex == idx){
  54. this.selectedIndex = -1;
  55. }
  56. if(this.selected[idx]){
  57. if(this.onCanDeselect(idx) === false){
  58. return;
  59. }
  60. var rowNodes = query("tr[dojoxTreeGridPath='" + idx + "']", this.grid.domNode);
  61. if(rowNodes.length){
  62. domAttr.set(rowNodes[0], "aria-selected", "false");
  63. }
  64. this._beginUpdate();
  65. delete this.selected[idx];
  66. this._removeSortedSelection(idx);
  67. //this.grid.onDeselected(idx);
  68. this.onDeselected(idx);
  69. //this.onSetSelected(idx, false);
  70. this._endUpdate();
  71. }
  72. },
  73. getSelected: function(){
  74. var result = [];
  75. for(var i in this.selected){
  76. if(this.selected[i]){
  77. result.push(this.grid.getItem(i));
  78. }
  79. }
  80. return result;
  81. },
  82. getSelectedCount: function(){
  83. var c = 0;
  84. for(var i in this.selected){
  85. if(this.selected[i]){
  86. c++;
  87. }
  88. }
  89. return c;
  90. },
  91. _bsearch: function(v){
  92. var o = this.sorted_sel;
  93. var h = o.length - 1, l = 0, m;
  94. while(l<=h){
  95. var cmp = this._comparePaths(o[m = (l + h) >> 1], v);
  96. if(cmp < 0){ l = m + 1; continue; }
  97. if(cmp > 0){ h = m - 1; continue; }
  98. return m;
  99. }
  100. return cmp < 0 ? m - cmp : m;
  101. },
  102. _comparePaths: function(a, b){
  103. for(var i=0, l=(a.length < b.length ? a.length : b.length); i<l; i++){
  104. if(a[i]<b[i]){ return -1; }
  105. if(a[i]>b[i]){ return 1; }
  106. }
  107. if(a.length<b.length){ return -1; }
  108. if(a.length>b.length){ return 1; }
  109. return 0;
  110. },
  111. _insertSortedSelection: function(index){
  112. index = String(index);
  113. var s = this.sorted_sel;
  114. var sl = this.sorted_ltos;
  115. var ss = this.sorted_stol;
  116. var lpath = index.split('/');
  117. lpath = array.map(lpath, function(item){ return parseInt(item, 10); });
  118. sl[lpath] = index;
  119. ss[index] = lpath;
  120. if(s.length === 0){
  121. s.push(lpath);
  122. return;
  123. }
  124. if(s.length==1){
  125. var cmp = this._comparePaths(s[0], lpath);
  126. if(cmp==1){ s.unshift(lpath); }
  127. else{ s.push(lpath); }
  128. return;
  129. }
  130. var idx = this._bsearch(lpath);
  131. this.sorted_sel.splice(idx, 0, lpath);
  132. },
  133. _removeSortedSelection: function(index){
  134. index = String(index);
  135. var s = this.sorted_sel;
  136. var sl = this.sorted_ltos;
  137. var ss = this.sorted_stol;
  138. if(s.length === 0){
  139. return;
  140. }
  141. var lpath = ss[index];
  142. if(!lpath){ return; }
  143. var idx = this._bsearch(lpath);
  144. if(idx > -1){
  145. delete sl[lpath];
  146. delete ss[index];
  147. s.splice(idx, 1);
  148. }
  149. },
  150. getFirstSelected: function(){
  151. if(!this.sorted_sel.length||this.mode == 'none'){ return -1; }
  152. var fpath = this.sorted_sel[0];
  153. if(!fpath){
  154. return -1;
  155. }
  156. fpath = this.sorted_ltos[fpath];
  157. if(!fpath){
  158. return -1;
  159. }
  160. return fpath;
  161. },
  162. getNextSelected: function(inPrev){
  163. if(!this.sorted_sel.length||this.mode == 'none'){ return -1; }
  164. inPrev = String(inPrev);
  165. var prevPath = this.sorted_stol[inPrev];
  166. if(!prevPath){ return -1; }
  167. var idx = this._bsearch(prevPath);
  168. var lpath = this.sorted_sel[idx+1];
  169. if(!lpath){
  170. return -1;
  171. }
  172. return this.sorted_ltos[lpath];
  173. },
  174. _range: function(inFrom, inTo, func){
  175. if(!lang.isString(inFrom) && inFrom < 0){
  176. inFrom = inTo;
  177. }
  178. var cells = this.grid.layout.cells,
  179. store = this.grid.store,
  180. grid = this.grid;
  181. inFrom = new dojox.grid.TreePath(String(inFrom), grid);
  182. inTo = new dojox.grid.TreePath(String(inTo), grid);
  183. if(inFrom.compare(inTo) > 0){
  184. var tmp = inFrom;
  185. inFrom = inTo;
  186. inTo = tmp;
  187. }
  188. var inFromStr = inFrom._str, inToStr = inTo._str;
  189. // select/deselect the first
  190. func(inFromStr);
  191. var p = inFrom;
  192. while((p = p.next())){
  193. if(p._str == inToStr){
  194. break;
  195. }
  196. func(p._str);
  197. }
  198. // select/deselect the last
  199. func(inToStr);
  200. }
  201. });
  202. });