root / trunk / web / dojo / dojox / grid / enhanced / dnd / _DndSelectingManager.js
History | View | Annotate | Download (10.7 KB)
| 1 | 9 | andrej.cim | /*
|
|---|---|---|---|
| 2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
| 3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
| 4 | see: http://dojotoolkit.org/license for details
|
||
| 5 | */
|
||
| 6 | |||
| 7 | |||
| 8 | if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndSelectingManager"]){ |
||
| 9 | dojo._hasResource["dojox.grid.enhanced.dnd._DndSelectingManager"]=true; |
||
| 10 | dojo.provide("dojox.grid.enhanced.dnd._DndSelectingManager");
|
||
| 11 | dojo.require("dojox.grid.util");
|
||
| 12 | dojo.require("dojox.grid._Builder");
|
||
| 13 | dojo.require("dojox.grid.enhanced.dnd._DndGrid");
|
||
| 14 | dojo.require("dojox.grid.enhanced.dnd._DndBuilder");
|
||
| 15 | dojo.require("dojox.grid.enhanced.dnd._DndRowSelector");
|
||
| 16 | dojo.require("dojox.grid.enhanced.dnd._DndFocusManager");
|
||
| 17 | dojo.declare("dojox.grid.enhanced.dnd._DndSelectingManager",null,{typeSelectingMode:[],selectingDisabledTypes:[],drugSelectionStart:null,drugCurrentPoint:null,drugMode:null,keepState:false,extendSelect:false,headerNodes:null,selectedCells:null,selectedColumns:[],selectedClass:"dojoxGridRowSelected",autoScrollRate:1000,constructor:function(_1){ |
||
| 18 | this.grid=_1;
|
||
| 19 | this.typeSelectingMode=[];
|
||
| 20 | this.selectingDisabledTypes=[];
|
||
| 21 | this.selectedColumns=[];
|
||
| 22 | this.drugSelectionStart=new Object(); |
||
| 23 | this.drugCurrentPoint=new Object(); |
||
| 24 | this.resetStartPoint();
|
||
| 25 | this.extendGridForDnd(_1);
|
||
| 26 | this.selectedCells=[];
|
||
| 27 | dojo.connect(this.grid,"_onFetchComplete",dojo.hitch(this,"refreshColumnSelection")); |
||
| 28 | dojo.connect(this.grid.scroller,"scroll",dojo.hitch(this,"refreshColumnSelection")); |
||
| 29 | dojo.subscribe(this.grid.rowSelectionChangedTopic,dojo.hitch(this,function(_2){ |
||
| 30 | try{
|
||
| 31 | if(_2.grid==this.grid&&_2!=this){ |
||
| 32 | this.cleanCellSelection();
|
||
| 33 | } |
||
| 34 | } |
||
| 35 | catch(e){
|
||
| 36 | } |
||
| 37 | })); |
||
| 38 | },extendGridForDnd:function(_3){ |
||
| 39 | var _4=_3.constructor;
|
||
| 40 | _3.mixin(_3,dojo.hitch(new dojox.grid.enhanced.dnd._DndGrid(this))); |
||
| 41 | _3.constructor=_4; |
||
| 42 | _3.mixin(_3.focus,new dojox.grid.enhanced.dnd._DndFocusManager());
|
||
| 43 | _3.mixin(_3.selection,{clickSelect:function(){
|
||
| 44 | }}); |
||
| 45 | dojo.forEach(_3.views.views,function(_5){
|
||
| 46 | _3.mixin(_5.content,new dojox.grid.enhanced.dnd._DndBuilder());
|
||
| 47 | _3.mixin(_5.header,new dojox.grid.enhanced.dnd._DndHeaderBuilder());
|
||
| 48 | if(_5.declaredClass=="dojox.grid._RowSelector"){ |
||
| 49 | _3.mixin(_5,new dojox.grid.enhanced.dnd._DndRowSelector());
|
||
| 50 | } |
||
| 51 | dojox.grid.util.funnelEvents(_5.contentNode,_5,"doContentEvent",["mouseup"]); |
||
| 52 | dojox.grid.util.funnelEvents(_5.headerNode,_5,"doHeaderEvent",["mouseup"]); |
||
| 53 | }); |
||
| 54 | dojo.forEach(this.grid.dndDisabledTypes,function(_6){ |
||
| 55 | this.disableSelecting(_6);
|
||
| 56 | },this);
|
||
| 57 | this.disableFeatures();
|
||
| 58 | },disableFeatures:function(){ |
||
| 59 | if(this.selectingDisabledTypes["cell"]){ |
||
| 60 | this.cellClick=function(){ |
||
| 61 | }; |
||
| 62 | this.drugSelectCell=function(){ |
||
| 63 | }; |
||
| 64 | } |
||
| 65 | if(this.selectingDisabledTypes["row"]){ |
||
| 66 | this.drugSelectRow=function(){ |
||
| 67 | }; |
||
| 68 | } |
||
| 69 | if(this.selectingDisabledTypes["col"]){ |
||
| 70 | this.selectColumn=function(){ |
||
| 71 | }; |
||
| 72 | this.drugSelectColumn=function(){ |
||
| 73 | }; |
||
| 74 | } |
||
| 75 | },disableSelecting:function(_7){ |
||
| 76 | this.selectingDisabledTypes[_7]=true; |
||
| 77 | },isInSelectingMode:function(_8){ |
||
| 78 | return !!this.typeSelectingMode[_8]; |
||
| 79 | },setInSelectingMode:function(_9,_a){ |
||
| 80 | this.typeSelectingMode[_9]=_a;
|
||
| 81 | },getSelectedRegionInfo:function(){ |
||
| 82 | var _b=[],_c=""; |
||
| 83 | if(this.selectedColumns.length>0){ |
||
| 84 | _c="col";
|
||
| 85 | dojo.forEach(this.selectedColumns,function(_d,_e){ |
||
| 86 | !!_d&&_b.push(_e); |
||
| 87 | }); |
||
| 88 | }else{
|
||
| 89 | if(this.grid.selection.getSelectedCount()>0){ |
||
| 90 | _c="row";
|
||
| 91 | _b=dojox.grid.Selection.prototype.getSelected.call(this.grid.selection);
|
||
| 92 | } |
||
| 93 | } |
||
| 94 | return {"selectionType":_c,"selectedIdx":_b}; |
||
| 95 | },clearInSelectingMode:function(){ |
||
| 96 | this.typeSelectingMode=[];
|
||
| 97 | },getHeaderNodes:function(){ |
||
| 98 | return this.headerNodes==null?dojo.query("[role*='columnheader']",this.grid.viewsHeaderNode):this.headerNode; |
||
| 99 | },_range:function(_f,_10,_11){ |
||
| 100 | var s=(_f>=0?_f:_10),e=_10; |
||
| 101 | if(s>e){
|
||
| 102 | e=s; |
||
| 103 | s=_10; |
||
| 104 | } |
||
| 105 | for(var i=s;i<=e;i++){ |
||
| 106 | _11(i); |
||
| 107 | } |
||
| 108 | },cellClick:function(_12,_13){ |
||
| 109 | if(_12>this.exceptColumnsTo){ |
||
| 110 | this.grid.selection.clear();
|
||
| 111 | this.publishRowChange();
|
||
| 112 | var _14=this.getCellNode(_12,_13); |
||
| 113 | this.cleanAll();
|
||
| 114 | this.addCellToSelection(_14);
|
||
| 115 | } |
||
| 116 | },setDrugStartPoint:function(_15,_16){ |
||
| 117 | this.drugSelectionStart.colIndex=_15;
|
||
| 118 | this.drugSelectionStart.rowIndex=_16;
|
||
| 119 | this.drugCurrentPoint.colIndex=_15;
|
||
| 120 | this.firstOut=true; |
||
| 121 | var _17=dojo.connect(dojo.doc,"onmousemove",dojo.hitch(this,function(e){ |
||
| 122 | this.outRangeValue=e.clientY-dojo.coords(this.grid.domNode).y-this.grid.domNode.offsetHeight; |
||
| 123 | if(this.outRangeValue>0){ |
||
| 124 | if(this.drugSelectionStart.colIndex==-1){ |
||
| 125 | if(!this.outRangeY){ |
||
| 126 | this.autoRowScrollDrug(e);
|
||
| 127 | } |
||
| 128 | }else{
|
||
| 129 | if(this.drugSelectionStart.rowIndex==-1){ |
||
| 130 | }else{
|
||
| 131 | this.autoCellScrollDrug(e);
|
||
| 132 | } |
||
| 133 | } |
||
| 134 | }else{
|
||
| 135 | this.firstOut=true; |
||
| 136 | this.outRangeY=false; |
||
| 137 | } |
||
| 138 | })); |
||
| 139 | var _18=dojo.connect(dojo.doc,"onmouseup",dojo.hitch(this,function(e){ |
||
| 140 | this.outRangeY=false; |
||
| 141 | dojo.disconnect(_18); |
||
| 142 | dojo.disconnect(_17); |
||
| 143 | this.grid.onMouseUp(e);
|
||
| 144 | })); |
||
| 145 | },autoRowScrollDrug:function(e){ |
||
| 146 | this.outRangeY=true; |
||
| 147 | this.autoSelectNextRow();
|
||
| 148 | },autoSelectNextRow:function(){ |
||
| 149 | if(this.grid.select.outRangeY){ |
||
| 150 | this.grid.scrollToRow(this.grid.scroller.firstVisibleRow+1); |
||
| 151 | this.drugSelectRow(this.drugCurrentPoint.rowIndex+1); |
||
| 152 | setTimeout(dojo.hitch(this,"autoSelectNextRow",this.drugCurrentPoint.rowIndex+1),this.getAutoScrollRate()); |
||
| 153 | } |
||
| 154 | },autoCellScrollDrug:function(e){ |
||
| 155 | var _19=null; |
||
| 156 | dojo.forEach(this.getHeaderNodes(),function(_1a){ |
||
| 157 | var _1b=dojo.coords(_1a);
|
||
| 158 | if(e.clientX>=_1b.x&&e.clientX<=_1b.x+_1b.w){
|
||
| 159 | _19=Number(_1a.attributes.getNamedItem("idx").value);
|
||
| 160 | } |
||
| 161 | }); |
||
| 162 | if(_19!=this.drugCurrentPoint.colIndex||this.firstOut){ |
||
| 163 | if(!this.firstOut){ |
||
| 164 | this.colChanged=true; |
||
| 165 | this.drugCurrentPoint.colIndex=_19;
|
||
| 166 | } |
||
| 167 | this.firstOut=false; |
||
| 168 | this.outRangeY=true; |
||
| 169 | dojo.hitch(this,"autoSelectCellInNextRow")(); |
||
| 170 | } |
||
| 171 | },autoSelectCellInNextRow:function(){ |
||
| 172 | if(this.grid.select.outRangeY){ |
||
| 173 | this.grid.scrollToRow(this.grid.scroller.firstVisibleRow+1); |
||
| 174 | this.drugSelectCell(this.drugCurrentPoint.colIndex,this.drugCurrentPoint.rowIndex+1); |
||
| 175 | if(this.grid.select.colChanged){ |
||
| 176 | this.grid.select.colChanged=false; |
||
| 177 | }else{
|
||
| 178 | setTimeout(dojo.hitch(this,"autoSelectCellInNextRow",this.drugCurrentPoint.rowIndex+1),this.getAutoScrollRate()); |
||
| 179 | } |
||
| 180 | } |
||
| 181 | },getAutoScrollRate:function(){ |
||
| 182 | return this.autoScrollRate; |
||
| 183 | },resetStartPoint:function(){ |
||
| 184 | if(this.drugSelectionStart.colIndex==-1&&this.drugSelectionStart.rowIndex==-1){ |
||
| 185 | return;
|
||
| 186 | } |
||
| 187 | this.lastDrugSelectionStart=dojo.clone(this.drugSelectionStart); |
||
| 188 | this.drugSelectionStart.colIndex=-1; |
||
| 189 | this.drugSelectionStart.rowIndex=-1; |
||
| 190 | },restorLastDragPoint:function(){ |
||
| 191 | this.drugSelectionStart=dojo.clone(this.lastDrugSelectionStart); |
||
| 192 | },drugSelectCell:function(_1c,_1d){ |
||
| 193 | this.cleanAll();
|
||
| 194 | this.drugCurrentPoint.columnIndex=_1c;
|
||
| 195 | this.drugCurrentPoint.rowIndex=_1d;
|
||
| 196 | var _1e,_1f,_20,_21;
|
||
| 197 | if(_1d<this.drugSelectionStart.rowIndex){ |
||
| 198 | _1e=_1d; |
||
| 199 | _1f=this.drugSelectionStart.rowIndex;
|
||
| 200 | }else{
|
||
| 201 | _1e=this.drugSelectionStart.rowIndex;
|
||
| 202 | _1f=_1d; |
||
| 203 | } |
||
| 204 | if(_1c<this.drugSelectionStart.colIndex){ |
||
| 205 | _20=_1c; |
||
| 206 | _21=this.drugSelectionStart.colIndex;
|
||
| 207 | }else{
|
||
| 208 | _20=this.drugSelectionStart.colIndex;
|
||
| 209 | _21=_1c; |
||
| 210 | } |
||
| 211 | for(var i=_20;i<=_21;i++){ |
||
| 212 | this.addColumnRangeToSelection(i,_1e,_1f);
|
||
| 213 | } |
||
| 214 | },selectColumn:function(_22){ |
||
| 215 | this.addColumnToSelection(_22);
|
||
| 216 | },drugSelectColumn:function(_23){ |
||
| 217 | this.selectColumnRange(this.drugSelectionStart.colIndex,_23); |
||
| 218 | },drugSelectColumnToMax:function(dir){ |
||
| 219 | if(dir=="left"){ |
||
| 220 | this.selectColumnRange(this.drugSelectionStart.colIndex,0); |
||
| 221 | }else{
|
||
| 222 | this.selectColumnRange(this.drugSelectionStart.colIndex,this.getHeaderNodes().length-1); |
||
| 223 | } |
||
| 224 | },selectColumnRange:function(_24,_25){ |
||
| 225 | if(!this.keepState){ |
||
| 226 | this.cleanAll();
|
||
| 227 | } |
||
| 228 | this._range(_24,_25,dojo.hitch(this,"addColumnToSelection")); |
||
| 229 | },addColumnToSelection:function(_26){ |
||
| 230 | this.selectedColumns[_26]=true; |
||
| 231 | dojo.toggleClass(this.getHeaderNodes()[_26],"dojoxGridHeaderSelected",true); |
||
| 232 | this._rangCellsInColumn(_26,-1,Number.POSITIVE_INFINITY,this.addCellToSelection); |
||
| 233 | },addColumnRangeToSelection:function(_27,_28,to){ |
||
| 234 | var _29=this.grid.views; |
||
| 235 | var _2a=[];
|
||
| 236 | var _2b=this; |
||
| 237 | dojo.forEach(_29.views,function(_2c){
|
||
| 238 | dojo.forEach(this.getViewRowNodes(_2c.rowNodes),function(_2d,_2e){ |
||
| 239 | if(!_2d){
|
||
| 240 | return;
|
||
| 241 | } |
||
| 242 | if(_2e>=_28&&_2e<=to){
|
||
| 243 | dojo.forEach(_2d.firstChild.rows[0].cells,function(_2f){ |
||
| 244 | if(_2f&&_2f.attributes&&(idx=_2f.attributes.getNamedItem("idx"))&&Number(idx.value)==_27){ |
||
| 245 | _2b.addCellToSelection(_2f); |
||
| 246 | } |
||
| 247 | }); |
||
| 248 | } |
||
| 249 | },this);
|
||
| 250 | },this);
|
||
| 251 | },_rangCellsInColumn:function(_30,_31,to,_32){ |
||
| 252 | var _33=this.grid.views; |
||
| 253 | var _34=[];
|
||
| 254 | var _35=this; |
||
| 255 | dojo.forEach(_33.views,function(_36){
|
||
| 256 | dojo.forEach(this.getViewRowNodes(_36.rowNodes),function(_37,_38){ |
||
| 257 | if(!_37){
|
||
| 258 | return;
|
||
| 259 | } |
||
| 260 | if(_38>=_31&&_38<=to){
|
||
| 261 | dojo.forEach(_37.firstChild.rows[0].cells,function(_39){ |
||
| 262 | if(_39&&_39.attributes&&(idx=_39.attributes.getNamedItem("idx"))&&Number(idx.value)==_30){ |
||
| 263 | _32(_39,_35); |
||
| 264 | } |
||
| 265 | }); |
||
| 266 | } |
||
| 267 | },this);
|
||
| 268 | },this);
|
||
| 269 | },drugSelectRow:function(_3a){ |
||
| 270 | this.drugCurrentPoint.rowIndex=_3a;
|
||
| 271 | this.cleanCellSelection();
|
||
| 272 | this.clearDrugDivs();
|
||
| 273 | var _3b=this.grid.selection; |
||
| 274 | _3b._beginUpdate(); |
||
| 275 | if(!this.keepState){ |
||
| 276 | _3b.deselectAll(); |
||
| 277 | } |
||
| 278 | _3b.selectRange(this.drugSelectionStart.rowIndex,_3a);
|
||
| 279 | _3b._endUpdate(); |
||
| 280 | this.publishRowChange();
|
||
| 281 | },drugSelectRowToMax:function(dir){ |
||
| 282 | if(dir=="up"){ |
||
| 283 | this.drugSelectRow(0); |
||
| 284 | }else{
|
||
| 285 | this.drugSelectRow(this.grid.rowCount); |
||
| 286 | } |
||
| 287 | },getCellNode:function(_3c,_3d){ |
||
| 288 | var _3e=[],_3f=null; |
||
| 289 | var _40=this.grid.views; |
||
| 290 | for(var i=0,v,n;(v=_40.views[i])&&(n=v.getRowNode(_3d));i++){ |
||
| 291 | _3e.push(n); |
||
| 292 | } |
||
| 293 | dojo.forEach(_3e,dojo.hitch(function(_41,_42){
|
||
| 294 | if(_3f){
|
||
| 295 | return;
|
||
| 296 | } |
||
| 297 | var _43=dojo.query("[idx='"+_3c+"']",_41); |
||
| 298 | if(_43&&_43[0]){ |
||
| 299 | _3f=_43[0];
|
||
| 300 | } |
||
| 301 | })); |
||
| 302 | return _3f;
|
||
| 303 | },addCellToSelection:function(_44,_45){ |
||
| 304 | if(!_45){
|
||
| 305 | _45=this;
|
||
| 306 | } |
||
| 307 | _45.selectedCells[_45.selectedCells.length]=_44; |
||
| 308 | dojo.toggleClass(_44,_45.selectedClass,true);
|
||
| 309 | },isColSelected:function(_46){ |
||
| 310 | return this.selectedColumns[_46]; |
||
| 311 | },isRowSelected:function(_47){ |
||
| 312 | return this.grid.selection.selected[_47]; |
||
| 313 | },isContinuousSelection:function(_48){ |
||
| 314 | var _49=-1; |
||
| 315 | for(var i=0;i<_48.length;i++){ |
||
| 316 | if(!_48[i]){
|
||
| 317 | continue;
|
||
| 318 | } |
||
| 319 | if(_49<0||i-_49==1){ |
||
| 320 | _49=i; |
||
| 321 | }else{
|
||
| 322 | if(i-_49>=2){ |
||
| 323 | return false; |
||
| 324 | } |
||
| 325 | } |
||
| 326 | } |
||
| 327 | return _49>=0?true:false; |
||
| 328 | },cleanCellSelection:function(){ |
||
| 329 | dojo.forEach(this.selectedCells,dojo.hitch(this,"removeCellSelectedState")); |
||
| 330 | this.selectedCells=[];
|
||
| 331 | dojo.forEach(this.selectedColumns,function(_4a,_4b){ |
||
| 332 | if(_4a){
|
||
| 333 | dojo.toggleClass(this.getHeaderNodes()[_4b],"dojoxGridHeaderSelected",false); |
||
| 334 | } |
||
| 335 | },this);
|
||
| 336 | this.selectedColumns=[];
|
||
| 337 | this.grid.edit.isEditing()&&this.grid.edit.apply(); |
||
| 338 | },removeCellSelectedState:function(_4c){ |
||
| 339 | dojo.toggleClass(_4c,this.selectedClass,false); |
||
| 340 | },cleanAll:function(){ |
||
| 341 | this.cleanCellSelection();
|
||
| 342 | this.grid.selection.clear();
|
||
| 343 | this.publishRowChange();
|
||
| 344 | },refreshColumnSelection:function(){ |
||
| 345 | dojo.forEach(this.selectedColumns,dojo.hitch(this,function(_4d,_4e){ |
||
| 346 | if(_4d){
|
||
| 347 | this.grid.select.addColumnToSelection(_4e);
|
||
| 348 | } |
||
| 349 | })); |
||
| 350 | },inSelectedArea:function(_4f,_50){ |
||
| 351 | return this.selectedColumns[_4f]||this.gird.selection.selecteded[_50]; |
||
| 352 | },publishRowChange:function(){ |
||
| 353 | dojo.publish(this.grid.rowSelectionChangedTopic,[this]); |
||
| 354 | },getViewRowNodes:function(_51){ |
||
| 355 | var _52=[];
|
||
| 356 | for(i in _51){ |
||
| 357 | _52.push(_51[i]); |
||
| 358 | } |
||
| 359 | return _52;
|
||
| 360 | },getFirstSelected:function(){ |
||
| 361 | return dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype.getFirstSelected)(); |
||
| 362 | },getLastSelected:function(){ |
||
| 363 | var _53=this.grid.selection.selected; |
||
| 364 | for(var i=_53.length-1;i>=0;i--){ |
||
| 365 | if(_53[i]){
|
||
| 366 | return i;
|
||
| 367 | } |
||
| 368 | } |
||
| 369 | return -1; |
||
| 370 | }}); |
||
| 371 | } |