Code:
Bm.util.CheckTreePanel = Ext.extend(Ext.tree.TreePanel, {
config : {},
chkTreeRoot : null,
getTreePanelRoot : function() {
if(Ext.isEmpty(this.chkTreeRoot)) {
var root = new Ext.tree.TreeNode({
children : this.config.data
});
this.chkTreeRoot = root;
}
return this.chkTreeRoot;
},
getTreeLoader : function() {
var treeLoader = new Ext.tree.TreeLoader({
preloadChildren:true,
baseAttrs:{
uiProvider:Ext.tree.AsynchTriStateNodeUI
}
}).doPreload(this.getTreePanelRoot());
return treeLoader;
},
constructor : function(config) {
this.config = config;
if(!this.isValidConfig()) {
return;
}
var panelConfig = {
root : this.getTreePanelRoot(),
loader : this.getTreeLoader(),
listeners : {
}
};
Ext.apply(panelConfig, config, this.getDefaultValues());
panelConfig = this.addContextMenu(panelConfig);
this.config = panelConfig;
Bm.util.CheckTreePanel.superclass.constructor.call(this, this.config);
},
getDefaultValues : function() {
var defaultValues = {
title : '',
useArrows : true,
autoScroll : true,
animate : true,
enableDD : false,
containerScroll : true,
rootVisible : false,
expandRootNode : true,
border : false,
header : false,
enableContextMenu : true
};
if(Ext.isEmpty(this.config.height)) {
defaultValues.autoHeight = true;
} else {
defaultValues.height = this.config.height;
}
if(!Ext.isEmpty(this.config.width)) {
defaultValues.width = this.config.width;
}
return defaultValues;
},
isValidConfig : function() {
//mandatory values
if(isInvalidValue(this.config.id, "id")) {
return false;
}
if(isInvalidValue(this.config.renderTo, "renderTo")) {
return false;
}
if(isInvalidValue(this.config.data, "data")) {
return false;
}
return true;
},
render : function() {
Bm.util.CheckTreePanel.superclass.render.apply(this, arguments);
this.expandAll();
Ext.each(this.getRootNode().childNodes, function(node){
node.collapse(true);
node.expand(false);
});
},
getSelectedItems : function() {
var selNodes = this.getChecked();
var sel = {};
var tmp = {};
Ext.each(selNodes, function(node){
var nodeId = getNodeId(node);
if(node.hasChildNodes()) {
var parent = node.parentNode;
if(parent) {
var parentNodeId = getNodeId(parent);
if(sel[parentNodeId] != "all"
&& tmp[parentNodeId] != "sibling-not-all") {
sel[nodeId] = "all";
if(!Ext.isEmpty(parentNodeId)) {
sel[parentNodeId] =
getCommaSepStr(sel[parentNodeId], nodeId);
}
} else {
tmp[nodeId] = "sibling-not-all";
}
} else {
sel[nodeId] = "";
}
} else {
var parent = node.parentNode;
if(parent) {
if(sel[getNodeId(parent)] != "all") {
if(tmp[getNodeId(parent)] != "sibling-not-all") {
var childId = nodeId;
do {
sel[getNodeId(parent)] =
getCommaSepStr(sel[getNodeId(parent)], childId);
childId = getNodeId(parent);
parent = parent.parentNode;
} while(parent && !Ext.isEmpty(getNodeId(parent)))
sel[nodeId] = "yes";
}
}
}
}
})
return sel;
},
addContextMenu : function(panelConfig) {
if(panelConfig.enableContextMenu) {
var contextMenu = {
contextMenu: new Ext.menu.Menu({
items: [{
id: 'selectAll',
text: 'Select All'
}, {
id: 'deselectAll',
text: 'DeSelect All'
}, {
id: 'expand',
text: 'Expand'
}, {
id: 'collapse',
text: 'Collapse'
}, {
id: 'expandAll',
text: 'Expand All'
}, {
id: 'collapseAll',
text: 'Collapse All'
}],
listeners: {
itemclick: function(item) {
switch (item.id) {
case 'selectAll':
var n = item.parentMenu.contextNode;
toggleCheck(n, true);
n.expand(true);
break;
case 'deselectAll':
var n = item.parentMenu.contextNode;
toggleCheck(n, false);
n.expand(true);
break;
case 'expand':
var n = item.parentMenu.contextNode;
n.expand(false);
break;
case 'collapse':
var n = item.parentMenu.contextNode;
n.collapse(false);
break;
case 'expandAll':
var n = item.parentMenu.contextNode;
n.expand(true);
break;
case 'collapseAll':
var n = item.parentMenu.contextNode;
n.collapse(true);
break;
}
}
}
})
}
var contextMenuListener = {
contextmenu : function(node, e) {
if(!node.isLeaf()) {
node.select();
var c = node.getOwnerTree().contextMenu;
c.contextNode = node;
c.showAt(e.getXY());
}
}
};
Ext.applyIf(panelConfig, contextMenu);
Ext.applyIf(panelConfig.listeners, contextMenuListener);
};
return panelConfig;
}
});
Thanks!