<rich:tree> how to keep state
somefatman Jun 8, 2011 4:18 PMFor my application I am using <rich:tree> as a navigation menu. When a user clicks on a node in the tree the appropriate page is loaded. Currently when the user clicks on the nodes they navigate to the correct page but the tree is rendered collapsed. I want it to work such that the tree will be rendered exactly as it was before the navigation to the next page.
The tree is part of a common template for all the pages which includes a top menu, the side menu with the tree for navigation, and a content area. The tree itself is in its own xhtml file which is included in the template using a <ui:include>.
I have done a lot of searching looking for a solution to this problem but so far almost everything I have found is for earlier versions of richfaces. I am using 4.0.0.Final and have not found much of anything relating to it. I tried binding the tree to a UITree component in my bean but that gave me duplicate Id exceptions. And when I did manage to get around the duplicate Id exceptions it rendered completely wrong after navigating to a second page after the welcome page. Instead of rendering as a tree it rendered all the nodes without any toggling ability, rendered all of the icons, both expanded and closed along with the leaf icons.
I saw information about componentState and adviseNodeOpened for previous versions of richfaces but I have not seen anything that would replace them in 4.0.0.Final.
here is my tree:
<r:tree id="richTreeBar" value="#{richTree.rootNode}" var="node" toggleType="client" selectionType="ajax" nodeType="#{node.type}" iconExpanded="/resources/images/FolderOpen_web.png" iconCollapsed="/resources/images/FolderClosed_web.png" iconLeaf="/resources/images/Worksheet_web_mini.png" rowKeyConverter="org.richfaces.IntegerSequenceRowKeyConverter" > <r:treeNode id="rootNode" type="folder" iconExpanded="/resources/images/FolderOpen_web.png" iconCollapsed="/resources/images/FolderClosed_web.png" style="#{node.style}"> <h:commandButton id="rootNodeOutput" action="#{richTree.nodeRowClick}" value="#{node}" style="border: 0px; background-color: transparent; background-image: none; font-size: 9pt; color: inherit"> <f:setPropertyActionListener target="#{richTree.selectedNode}" value="#{node}" /> </h:commandButton> </r:treeNode> <r:treeNode id="leafNode" type="leaf" iconLeaf="/resources/images/Worksheet_web_mini.png" style="#{node.style}"> <h:commandButton id="leafNodeOutput" action="#{richTree.nodeRowClick}" value="#{node}" style="border: 0px; background-color: transparent; background-image: none; font-size: 9pt; color: inherit"> <f:setPropertyActionListener target="#{richTree.selectedNode}" value="#{node}" /> </h:commandButton> </r:treeNode> <r:treeNode id="locationNode" type="location" iconExpanded="/resources/images/HOME_webHI.png" iconCollapsed="/resources/images/HOME_webHI.png" style="#{node.style}"> <h:commandButton id="locationNodeOutput" action="#{richTree.nodeRowClick}" value="#{node}" style="border: 0px; background-color: transparent; background-image: none; font-size: 9pt; color: inherit"> <f:setPropertyActionListener target="#{richTree.selectedNode}" value="#{node}" /> </h:commandButton> </r:treeNode> </r:tree>
and here is my backingbean which is session scoped:
package com.agois.wcpps.jsf.tree; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import javax.faces.event.AbortProcessingException; import org.richfaces.component.UITree; import org.richfaces.event.TreeSelectionChangeEvent; import org.richfaces.event.TreeSelectionChangeListener; import org.richfaces.model.TreeNode; /** * * @author DCosta */ public class RichTree implements TreeSelectionChangeListener{ //private ArrayList<CTClaim> claimList; private TreeNode rootNode; private UITree treeBinding; private AGOTreeNode selectedNode; private static final String unselectedStyle = "color: white;"; private static final String selectedStyle = "background-color: white; color: black;"; public RichTree() { rootNode = new AGOTreeNode(); selectedNode = new AGOTreeNode(); loadTree(); } /** * @return the rootNode */ public TreeNode getRootNode() { return rootNode; } public void setRootNode(TreeNode rootNode) { this.rootNode = rootNode; } private void loadTree() { . . . } /** * @return the treeBinding */ public UITree getTreeBinding() { return treeBinding; } /** * @param treeBinding the treeBinding to set */ public void setTreeBinding(UITree treeBinding) { this.treeBinding = treeBinding; } public Boolean adviseNodeOpened(UITree tree) { return Boolean.TRUE; } public String nodeRowClick(){ return selectedNode.getNavigationString(); } /** * @return the selectedNode */ public AGOTreeNode getSelectedNode() { return selectedNode; } /** * @param selectedNode the selectedNode to set */ public void setSelectedNode(AGOTreeNode selectedNode) { this.selectedNode.setStyle(unselectedStyle); this.selectedNode = selectedNode; this.selectedNode.setStyle(selectedStyle); } }