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 | } |