root / trunk / web / dojo / dojox / grid / enhanced / dnd / _DndSelectingManager.js
History | View | Annotate | Download (10.7 KB)
1 |
/*
|
---|---|
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 |
} |