NodeSelectListener issues (please help)
meghiddo Jul 20, 2009 7:47 PMAlright, I have a tree that display a list of projects, and under each project a list of devices that belong to it. I need to have things change when a user clicks on a device or on a project. I have it to the point where if a user clicks on a project, it will do what I want. But when a user clicks on a device under the project I get this error:
WARNING: /disposable/test.xhtml @47,99 nodeSelectListener="#{treeClickBean.projectSelection}": java.lang.ClassCastException: java.lang.String cannot be cast to nodesContainer.ProjectHolder
I have a List of Objects bound to my rich:tree (the Object is called ProjectHolder). So for my rich tree I did this for the nodeSelectListener:
<rich:tree nodeSelectListener="#{treeClickBean.projectSelection}" reRender="selectedNode"
switchType="client" ajaxSubmitSelection="true" ajaxKeys="#{null}">
<rich:treeNodesAdaptor nodes="#{nodesBean.projects}" var="project">
<rich:treeNode>
<h:outputText value="#{project.projectName}" />
</rich:treeNode>
<rich:recursiveTreeNodesAdaptor roots="#{project.devicesList}" var="device">
<rich:treeNode>
<h:outputText value="#{device}" />
</rich:treeNode>
</rich:recursiveTreeNodesAdaptor>
</rich:treeNodesAdaptor>
</rich:tree>This calls the following method:
public void projectSelection(NodeSelectedEvent event){
HtmlTree tree = (HtmlTree) event.getComponent();
node = (ProjectHolder) tree.getRowData();
name=node.getProjectId();
}And then I have a h:outputText to display the value of that name variable. So when a user clicks on the project, the projectId is displayed as intended.
But my problem is with when a user clicks on the device. If I do it as is, I get the error above saying cannot convert from String to ProjectHolder Object.
I tried adding a nodeSelectListener attribute to the device treeNode, that uses String values instead of the ProjectHolder Object but it does the same. I would like to find a way to just manipulate that java code, and leave the tree as is, with only the one nodeSelectListener attribute in the first rich:tree tag.
Oh and one other thing, this part of the tree:
<rich:recursiveTreeNodesAdaptor roots="#{project.devicesList}" var="device">
<rich:treeNode>
<h:outputText value="#{device}" />
</rich:treeNode>
</rich:recursiveTreeNodesAdaptor>is actually referring to a List of devices, not just a String with one device.
So Im sure there is a way to manipulate that projectSelection() method above where it can tell the difference between clicking on the project name or one of the devices from the List right? I was looking at stuff like (this is incomplete btw):
selectedNodeChildren.clear();
TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
if (currentNode.isLeaf()){
selectedNodeChildren.add((String)currentNode.getData());
}else
{
Iterator<Map.Entry<Object, TreeNode>> it = currentNode.getChildren();
while (it!=null &&it.hasNext()) {
Map.Entry<Object, TreeNode> entry = it.next();
selectedNodeChildren.add(entry.getValue().getData().toString());
}
}to add to the projectSelection method, but this has givem me no luck as of yet.
Can anyone please give me some guidance on this one?