root / trunk / web / dojo / dojox / grid / _TreeView.js @ 10
History | View | Annotate | Download (10.8 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._TreeView"]){ |
9 |
dojo._hasResource["dojox.grid._TreeView"]=true; |
10 |
dojo.provide("dojox.grid._TreeView");
|
11 |
dojo.require("dijit._Widget");
|
12 |
dojo.require("dijit._Templated");
|
13 |
dojo.require("dojox.grid._View");
|
14 |
dojo.declare("dojox.grid._Expando",[dijit._Widget,dijit._Templated],{open:false,toggleClass:"",itemId:"",cellIdx:-1,view:null,rowNode:null,rowIdx:-1,expandoCell:null,level:0,templateString:"<div class=\"dojoxGridExpando\"\n\t><div class=\"dojoxGridExpandoNode\" dojoAttachEvent=\"onclick:onToggle\"\n\t\t><div class=\"dojoxGridExpandoNodeInner\" dojoAttachPoint=\"expandoInner\"></div\n\t></div\n></div>\n",_toggleRows:function(_1,_2){ |
15 |
if(!_1||!this.rowNode){ |
16 |
return;
|
17 |
} |
18 |
if(dojo.query("table.dojoxGridRowTableNeedsRowUpdate").length){ |
19 |
if(this._initialized){ |
20 |
this.view.grid.updateRow(this.rowIdx); |
21 |
} |
22 |
return;
|
23 |
} |
24 |
var _3=this; |
25 |
var g=this.view.grid; |
26 |
if(g.treeModel){
|
27 |
var p=this._tableRow?dojo.attr(this._tableRow,"dojoxTreeGridPath"):""; |
28 |
if(p){
|
29 |
dojo.query("tr[dojoxTreeGridPath^=\""+p+"/\"]",this.rowNode).forEach(function(n){ |
30 |
var en=dojo.query(".dojoxGridExpando",n)[0]; |
31 |
if(en&&en.parentNode&&en.parentNode.parentNode&&!dojo.hasClass(en.parentNode.parentNode,"dojoxGridNoChildren")){ |
32 |
var ew=dijit.byNode(en);
|
33 |
if(ew){
|
34 |
ew._toggleRows(_1,ew.open&&_2); |
35 |
} |
36 |
} |
37 |
n.style.display=_2?"":"none"; |
38 |
}); |
39 |
} |
40 |
}else{
|
41 |
dojo.query("tr."+_1,this.rowNode).forEach(function(n){ |
42 |
if(dojo.hasClass(n,"dojoxGridExpandoRow")){ |
43 |
var en=dojo.query(".dojoxGridExpando",n)[0]; |
44 |
if(en){
|
45 |
var ew=dijit.byNode(en);
|
46 |
var _4=ew?ew.toggleClass:en.getAttribute("toggleClass"); |
47 |
var _5=ew?ew.open:_3.expandoCell.getOpenState(en.getAttribute("itemId")); |
48 |
_3._toggleRows(_4,_5&&_2); |
49 |
} |
50 |
} |
51 |
n.style.display=_2?"":"none"; |
52 |
}); |
53 |
} |
54 |
},setOpen:function(_6){ |
55 |
if(_6&&dojo.hasClass(this.domNode,"dojoxGridExpandoLoading")){ |
56 |
_6=false;
|
57 |
} |
58 |
var _7=this.view; |
59 |
var _8=_7.grid;
|
60 |
var _9=_8.store;
|
61 |
var _a=_8.treeModel;
|
62 |
var d=this; |
63 |
var _b=this.rowIdx; |
64 |
var me=_8._by_idx[_b];
|
65 |
if(!me){
|
66 |
return;
|
67 |
} |
68 |
if(_a&&!this._loadedChildren){ |
69 |
if(_6){
|
70 |
var _c=_8.getItem(dojo.attr(this._tableRow,"dojoxTreeGridPath")); |
71 |
if(_c){
|
72 |
this.expandoInner.innerHTML="o"; |
73 |
dojo.addClass(this.domNode,"dojoxGridExpandoLoading"); |
74 |
_a.getChildren(_c,function(_d){
|
75 |
d._loadedChildren=true;
|
76 |
d._setOpen(_6); |
77 |
}); |
78 |
}else{
|
79 |
this._setOpen(_6);
|
80 |
} |
81 |
}else{
|
82 |
this._setOpen(_6);
|
83 |
} |
84 |
}else{
|
85 |
if(!_a&&_9){
|
86 |
if(_6){
|
87 |
var _e=_8._by_idx[this.rowIdx]; |
88 |
if(_e&&!_9.isItemLoaded(_e.item)){
|
89 |
this.expandoInner.innerHTML="o"; |
90 |
dojo.addClass(this.domNode,"dojoxGridExpandoLoading"); |
91 |
_9.loadItem({item:_e.item,onItem:dojo.hitch(this,function(i){ |
92 |
var _f=_9.getIdentity(i);
|
93 |
_8._by_idty[_f]=_8._by_idx[this.rowIdx]={idty:_f,item:i}; |
94 |
this._setOpen(_6);
|
95 |
})}); |
96 |
}else{
|
97 |
this._setOpen(_6);
|
98 |
} |
99 |
}else{
|
100 |
this._setOpen(_6);
|
101 |
} |
102 |
}else{
|
103 |
this._setOpen(_6);
|
104 |
} |
105 |
} |
106 |
},_setOpen:function(_10){ |
107 |
if(_10&&this._tableRow&&dojo.hasClass(this._tableRow,"dojoxGridNoChildren")){ |
108 |
this._setOpen(false); |
109 |
return;
|
110 |
} |
111 |
this.expandoInner.innerHTML=_10?"-":"+"; |
112 |
dojo.removeClass(this.domNode,"dojoxGridExpandoLoading"); |
113 |
dojo.toggleClass(this.domNode,"dojoxGridExpandoOpened",_10); |
114 |
if(this._tableRow){ |
115 |
dojo.toggleClass(this._tableRow,"dojoxGridRowCollapsed",!_10); |
116 |
var _11=dojo.attr(this._tableRow,"dojoxTreeGridBaseClasses"); |
117 |
var _12=""; |
118 |
if(_10){
|
119 |
_12=dojo.trim((" "+_11+" ").replace(" dojoxGridRowCollapsed "," ")); |
120 |
}else{
|
121 |
if((" "+_11+" ").indexOf(" dojoxGridRowCollapsed ")<0){ |
122 |
_12=_11+(_11?" ":"")+"dojoxGridRowCollapsed"; |
123 |
}else{
|
124 |
_12=_11; |
125 |
} |
126 |
} |
127 |
dojo.attr(this._tableRow,"dojoxTreeGridBaseClasses",_12); |
128 |
} |
129 |
var _13=(this.open!==_10); |
130 |
this.open=_10;
|
131 |
if(this.expandoCell&&this.itemId){ |
132 |
this.expandoCell.openStates[this.itemId]=_10; |
133 |
} |
134 |
var v=this.view; |
135 |
var g=v.grid;
|
136 |
if(this.toggleClass&&_13){ |
137 |
if(!this._tableRow||!this._tableRow.style.display){ |
138 |
this._toggleRows(this.toggleClass,_10); |
139 |
} |
140 |
} |
141 |
if(v&&this._initialized&&this.rowIdx>=0){ |
142 |
g.rowHeightChanged(this.rowIdx);
|
143 |
g.postresize(); |
144 |
v.hasVScrollbar(true);
|
145 |
} |
146 |
this._initialized=true; |
147 |
},onToggle:function(e){ |
148 |
this.setOpen(!this.open); |
149 |
dojo.stopEvent(e); |
150 |
},setRowNode:function(_14,_15,_16){ |
151 |
if(this.cellIdx<0||!this.itemId){ |
152 |
return false; |
153 |
} |
154 |
this._initialized=false; |
155 |
this.view=_16;
|
156 |
this.rowNode=_15;
|
157 |
this.rowIdx=_14;
|
158 |
this.expandoCell=_16.structure.cells[0][this.cellIdx]; |
159 |
var d=this.domNode; |
160 |
if(d&&d.parentNode&&d.parentNode.parentNode){
|
161 |
this._tableRow=d.parentNode.parentNode;
|
162 |
} |
163 |
this.open=this.expandoCell.getOpenState(this.itemId); |
164 |
if(_16.grid.treeModel){
|
165 |
dojo.style(this.domNode,"marginLeft",(this.level*18)+"px"); |
166 |
if(this.domNode.parentNode){ |
167 |
dojo.style(this.domNode.parentNode,"backgroundPosition",((this.level*18)+(3))+"px"); |
168 |
} |
169 |
} |
170 |
this.setOpen(this.open); |
171 |
return true; |
172 |
}}); |
173 |
dojo.declare("dojox.grid._TreeContentBuilder",dojox.grid._ContentBuilder,{generateHtml:function(_17,_18){ |
174 |
var _19=this.getTableArray(),v=this.view,row=v.structure.cells[0],_1a=this.grid.getItem(_18),_1b=this.grid,_1c=this.grid.store; |
175 |
dojox.grid.util.fire(this.view,"onBeforeRow",[_18,[row]]); |
176 |
var _1d=function(_1e,_1f,_20,_21,_22,_23){ |
177 |
if(!_23){
|
178 |
if(_19[0].indexOf("dojoxGridRowTableNeedsRowUpdate")==-1){ |
179 |
_19[0]=_19[0].replace("dojoxGridRowTable","dojoxGridRowTable dojoxGridRowTableNeedsRowUpdate"); |
180 |
} |
181 |
return;
|
182 |
} |
183 |
var _24=_19.length;
|
184 |
_21=_21||[]; |
185 |
var _25=_21.join("|"); |
186 |
var _26=_21[_21.length-1]; |
187 |
var _27=_26+(_20?" dojoxGridSummaryRow":""); |
188 |
var _28=""; |
189 |
if(_1b.treeModel&&_1f&&!_1b.treeModel.mayHaveChildren(_1f)){
|
190 |
_27+=" dojoxGridNoChildren";
|
191 |
} |
192 |
_19.push("<tr style=\""+_28+"\" class=\""+_27+"\" dojoxTreeGridPath=\""+_22.join("/")+"\" dojoxTreeGridBaseClasses=\""+_27+"\">"); |
193 |
var _29=_1e+1; |
194 |
var _2a=null; |
195 |
for(var i=0,_2b;(_2b=row[i]);i++){ |
196 |
var m=_2b.markup,cc=_2b.customClasses=[],cs=_2b.customStyles=[];
|
197 |
m[5]=_2b.formatAtLevel(_22,_1f,_1e,_20,_26,cc);
|
198 |
m[1]=cc.join(" "); |
199 |
m[3]=cs.join(";"); |
200 |
_19.push.apply(_19,m); |
201 |
if(!_2a&&_2b.level===_29&&_2b.parentCell){
|
202 |
_2a=_2b.parentCell; |
203 |
} |
204 |
} |
205 |
_19.push("</tr>");
|
206 |
if(_1f&&_1c&&_1c.isItem(_1f)){
|
207 |
var _2c=_1c.getIdentity(_1f);
|
208 |
if(typeof _1b._by_idty_paths[_2c]=="undefined"){ |
209 |
_1b._by_idty_paths[_2c]=_22.join("/");
|
210 |
} |
211 |
} |
212 |
var _2d;
|
213 |
var _2e;
|
214 |
var _2f;
|
215 |
var _30;
|
216 |
var _31=_22.concat([]);
|
217 |
if(_1b.treeModel&&_1f){
|
218 |
if(_1b.treeModel.mayHaveChildren(_1f)){
|
219 |
_2d=v.structure.cells[0][_1b.expandoCell||0]; |
220 |
_2e=_2d.getOpenState(_1f)&&_23; |
221 |
_2f=new dojox.grid.TreePath(_22.join("/"),_1b); |
222 |
_30=_2f.children(true)||[];
|
223 |
dojo.forEach(_30,function(_32,idx){
|
224 |
var _33=_25.split("|"); |
225 |
_33.push(_33[_33.length-1]+"-"+idx); |
226 |
_31.push(idx); |
227 |
_1d(_29,_32,false,_33,_31,_2e);
|
228 |
_31.pop(); |
229 |
}); |
230 |
} |
231 |
}else{
|
232 |
if(_1f&&_2a&&!_20){
|
233 |
_2d=v.structure.cells[0][_2a.level];
|
234 |
_2e=_2d.getOpenState(_1f)&&_23; |
235 |
if(_1c.hasAttribute(_1f,_2a.field)){
|
236 |
var _34=_25.split("|"); |
237 |
_34.pop(); |
238 |
_2f=new dojox.grid.TreePath(_22.join("/"),_1b); |
239 |
_30=_2f.children(true)||[];
|
240 |
if(_30.length){
|
241 |
_19[_24]="<tr class=\""+_34.join(" ")+" dojoxGridExpandoRow\" dojoxTreeGridPath=\""+_22.join("/")+"\">"; |
242 |
dojo.forEach(_30,function(_35,idx){
|
243 |
var _36=_25.split("|"); |
244 |
_36.push(_36[_36.length-1]+"-"+idx); |
245 |
_31.push(idx); |
246 |
_1d(_29,_35,false,_36,_31,_2e);
|
247 |
_31.pop(); |
248 |
}); |
249 |
_31.push(_30.length); |
250 |
_1d(_1e,_1f,true,_21,_31,_2e);
|
251 |
}else{
|
252 |
_19[_24]="<tr class=\""+_26+" dojoxGridNoChildren\" dojoxTreeGridPath=\""+_22.join("/")+"\">"; |
253 |
} |
254 |
}else{
|
255 |
if(!_1c.isItemLoaded(_1f)){
|
256 |
_19[0]=_19[0].replace("dojoxGridRowTable","dojoxGridRowTable dojoxGridRowTableNeedsRowUpdate"); |
257 |
}else{
|
258 |
_19[_24]="<tr class=\""+_26+" dojoxGridNoChildren\" dojoxTreeGridPath=\""+_22.join("/")+"\">"; |
259 |
} |
260 |
} |
261 |
}else{
|
262 |
if(_1f&&!_20&&_21.length>1){ |
263 |
_19[_24]="<tr class=\""+_21[_21.length-2]+"\" dojoxTreeGridPath=\""+_22.join("/")+"\">"; |
264 |
} |
265 |
} |
266 |
} |
267 |
}; |
268 |
_1d(0,_1a,false,["dojoxGridRowToggle-"+_18],[_18],true); |
269 |
_19.push("</table>");
|
270 |
return _19.join(""); |
271 |
},findTarget:function(_37,_38){ |
272 |
var n=_37;
|
273 |
while(n&&(n!=this.domNode)){ |
274 |
if(n.tagName&&n.tagName.toLowerCase()=="tr"){ |
275 |
break;
|
276 |
} |
277 |
n=n.parentNode; |
278 |
} |
279 |
return (n!=this.domNode)?n:null; |
280 |
},getCellNode:function(_39,_3a){ |
281 |
var _3b=dojo.query("td[idx='"+_3a+"']",_39)[0]; |
282 |
if(_3b&&_3b.parentNode&&!dojo.hasClass(_3b.parentNode,"dojoxGridSummaryRow")){ |
283 |
return _3b;
|
284 |
} |
285 |
},decorateEvent:function(e){ |
286 |
e.rowNode=this.findRowTarget(e.target);
|
287 |
if(!e.rowNode){
|
288 |
return false; |
289 |
} |
290 |
e.rowIndex=dojo.attr(e.rowNode,"dojoxTreeGridPath");
|
291 |
this.baseDecorateEvent(e);
|
292 |
e.cell=this.grid.getCell(e.cellIndex);
|
293 |
return true; |
294 |
}}); |
295 |
dojo.declare("dojox.grid._TreeView",[dojox.grid._View],{_contentBuilderClass:dojox.grid._TreeContentBuilder,_onDndDrop:function(_3c,_3d,_3e){ |
296 |
if(this.grid&&this.grid.aggregator){ |
297 |
this.grid.aggregator.clearSubtotalCache();
|
298 |
} |
299 |
this.inherited(arguments); |
300 |
},postCreate:function(){ |
301 |
this.inherited(arguments); |
302 |
this.connect(this.grid,"_cleanupExpandoCache","_cleanupExpandoCache"); |
303 |
},_cleanupExpandoCache:function(_3f,_40,_41){ |
304 |
if(_3f==-1){ |
305 |
return;
|
306 |
} |
307 |
dojo.forEach(this.grid.layout.cells,function(_42){ |
308 |
if(typeof _42["openStates"]!="undefined"){ |
309 |
if(_40 in _42.openStates){ |
310 |
delete _42.openStates[_40];
|
311 |
} |
312 |
} |
313 |
}); |
314 |
if(typeof _3f=="string"&&_3f.indexOf("/")>-1){ |
315 |
var _43=new dojox.grid.TreePath(_3f,this.grid); |
316 |
var _44=_43.parent();
|
317 |
while(_44){
|
318 |
_43=_44; |
319 |
_44=_43.parent(); |
320 |
} |
321 |
var _45=_43.item();
|
322 |
if(!_45){
|
323 |
return;
|
324 |
} |
325 |
var _46=this.grid.store.getIdentity(_45); |
326 |
if(typeof this._expandos[_46]!="undefined"){ |
327 |
for(var i in this._expandos[_46]){ |
328 |
var exp=this._expandos[_46][i]; |
329 |
if(exp){
|
330 |
exp.destroy(); |
331 |
} |
332 |
delete this._expandos[_46][i]; |
333 |
} |
334 |
delete this._expandos[_46]; |
335 |
} |
336 |
}else{
|
337 |
for(var i in this._expandos){ |
338 |
if(typeof this._expandos[i]!="undefined"){ |
339 |
for(var j in this._expandos[i]){ |
340 |
var exp=this._expandos[i][j]; |
341 |
if(exp){
|
342 |
exp.destroy(); |
343 |
} |
344 |
} |
345 |
} |
346 |
} |
347 |
this._expandos={};
|
348 |
} |
349 |
},postMixInProperties:function(){ |
350 |
this.inherited(arguments); |
351 |
this._expandos={};
|
352 |
},onBeforeRow:function(_47,_48){ |
353 |
var g=this.grid; |
354 |
if(g._by_idx&&g._by_idx[_47]&&g._by_idx[_47].idty){
|
355 |
var _49=g._by_idx[_47].idty;
|
356 |
this._expandos[_49]=this._expandos[_49]||{}; |
357 |
} |
358 |
this.inherited(arguments); |
359 |
},onAfterRow:function(_4a,_4b,_4c){ |
360 |
dojo.forEach(dojo.query("span.dojoxGridExpando",_4c),function(n){ |
361 |
if(n&&n.parentNode){
|
362 |
var tc=n.getAttribute("toggleClass"); |
363 |
var _4d;
|
364 |
var _4e;
|
365 |
var g=this.grid; |
366 |
if(g._by_idx&&g._by_idx[_4a]&&g._by_idx[_4a].idty){
|
367 |
_4d=g._by_idx[_4a].idty; |
368 |
_4e=this._expandos[_4d][tc];
|
369 |
} |
370 |
if(_4e){
|
371 |
dojo.place(_4e.domNode,n,"replace");
|
372 |
_4e.itemId=n.getAttribute("itemId");
|
373 |
_4e.cellIdx=parseInt(n.getAttribute("cellIdx"),10); |
374 |
if(isNaN(_4e.cellIdx)){
|
375 |
_4e.cellIdx=-1;
|
376 |
} |
377 |
}else{
|
378 |
_4e=dojo.parser.parse(n.parentNode)[0];
|
379 |
if(_4d){
|
380 |
this._expandos[_4d][tc]=_4e;
|
381 |
} |
382 |
} |
383 |
if(!_4e.setRowNode(_4a,_4c,this)){ |
384 |
_4e.domNode.parentNode.removeChild(_4e.domNode); |
385 |
} |
386 |
} |
387 |
},this);
|
388 |
var alt=false; |
389 |
var _4f=this; |
390 |
dojo.query("tr[dojoxTreeGridPath]",_4c).forEach(function(n){ |
391 |
dojo.toggleClass(n,"dojoxGridSubRowAlt",alt);
|
392 |
dojo.attr(n,"dojoxTreeGridBaseClasses",n.className);
|
393 |
alt=!alt; |
394 |
_4f.grid.rows.styleRowNode(dojo.attr(n,"dojoxTreeGridPath"),n);
|
395 |
}); |
396 |
this.inherited(arguments); |
397 |
},updateRowStyles:function(_50){ |
398 |
var _51=dojo.query("tr[dojoxTreeGridPath='"+_50+"']",this.domNode); |
399 |
if(_51.length){
|
400 |
this.styleRowNode(_50,_51[0]); |
401 |
} |
402 |
},getCellNode:function(_52,_53){ |
403 |
var row=dojo.query("tr[dojoxTreeGridPath='"+_52+"']",this.domNode)[0]; |
404 |
if(row){
|
405 |
return this.content.getCellNode(row,_53); |
406 |
} |
407 |
}}); |
408 |
} |