Today i need to set a different icon for different node on the same level of a richFaces tree.
Before this need i set icon image for each node level with facet:
<rich:treeNodesAdaptor id="level2" nodes="${level1.subDir}" var="lev2">
<rich:treeNode nodeSelectListener="${lev2.selectNode}" data="${lev2.desc}">
<f:facet name="icon">
<h:graphicImage value="/img/sitemap.png"/>
</f:facet>
<f:facet name="iconLeaf">
<h:graphicImage value="/img/sitemap.png"/>
</f:facet>
<h:commandLink value="${lev2.desc}" rendered="true">
<f:setPropertyActionListener target="${treeModel.currentNodeObject}"
value="${lev2}"/>
</h:commandLink>
</rich:treeNode>
As you can see image icon for node and leaf (a node without children) are the same and are statically defined.
With this method is difficult to set a different image for different nodes, because facets “icon” and “iconLeaf” are set for all nodes inside collection defined by “nodes” attribute of rich:treeNodesAdaptor.
You can simply set a String attribute in “lev2″ object, called ,for example, imageUrl, at tree building time (Java side).
for (NodesModel node : lev1.getChildren()){
if (node.type == 1)
node.setImageUrl("/img/image1.png");
else if (node.type == 2)
node.setImageUrl("/img/image2.png");
}
In this example i set a different image icon depending on node type.
Now i can use imageUrl property in richFaces:
<rich:treeNodesAdaptor id="level2" nodes="${level1.subDir}" var="lev2">
<rich:treeNode nodeSelectListener="${lev2.selectNode}" data="${lev2.desc}">
<f:facet name="icon">
<h:graphicImage value="${lev2.imageUrl}"/>
</f:facet>
<f:facet name="iconLeaf">
<h:graphicImage value="${lev2.imageUrl}"/>
</f:facet>
<h:commandLink value="${lev2.desc}" rendered="true">
<f:setPropertyActionListener target="${treeModel.currentNodeObject}"
value="${lev2}"/>
</h:commandLink>
</rich:treeNode>