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>
