Hope this helps all Tree2 users to create a dynamic (lazy loading) tree.
Modified from Sean's Simple tree2 example:
-----------------------------
In Faces-Config.xml
---------------------------------
<!-- Managed Beans for tree2.jsp -->
<managed-bean>
<managed-bean-name>treeBacker</managed-bean-name>
<managed-bean-class>org.apache.myfaces.examples.tree.TreeBacker</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
---------------------------------
package org.apache.myfaces.examples.tree;
---------------------------------
public class TreeBacker implements Serializable
{
private TreeModelBase _treeModel = null;
public TreeModel getTreeData()
{
// Create tree if TreeModel is null
If (_treeModel == null) {
TreeNode treeData = new TreeNodeBase("foo-folder", "Inbox", false);
// construct a set of fake data (normally your data would come from a database)
// populate Frank's portion of the tree
TreeNodeBase personNode = new TreeNodeBase("person", "Frank Foo", false);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo", false));
TreeNodeBase folderNode = new TreeNodeBase("foo-folder", "Requires Foo Reviewer", false);
folderNode.getChildren().add(new TreeNodeBase("document", "X050001", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X050003", true));
personNode.getChildren().add(folderNode);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo Recommendation", false));
folderNode = new TreeNodeBase("foo-folder", "Requires Foo Approval", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J050001", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J050003", true));
folderNode.getChildren().add(new TreeNodeBase("document", "E050011", true));
folderNode.getChildren().add(new TreeNodeBase("document", "R050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "C050003", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Processing", false);
folderNode.getChildren().add(new TreeNodeBase("document", "X050003", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X050011", true));
folderNode.getChildren().add(new TreeNodeBase("document", "F050002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "G050003", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Approval", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J050006", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J050007", true));
personNode.getChildren().add(folderNode);
treeData.getChildren().add(personNode);
// populate Betty's portion of the tree
personNode = new TreeNodeBase("person", "Betty Bar", false);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo", false));
folderNode = new TreeNodeBase("foo-folder", "Requires Foo Reviewer", false);
folderNode.getChildren().add(new TreeNodeBase("document", "X012000", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X013000", true));
folderNode.getChildren().add(new TreeNodeBase("document", "X014000", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("foo-folder", "Requires Foo Recommendation", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J010026", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J020002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J030103", true));
folderNode.getChildren().add(new TreeNodeBase("document", "E030214", true));
folderNode.getChildren().add(new TreeNodeBase("document", "R020444", true));
folderNode.getChildren().add(new TreeNodeBase("document", "C010000", true));
personNode.getChildren().add(folderNode);
personNode.getChildren().add(new TreeNodeBase("foo-folder", "Requires Foo Approval", false));
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Processing", false);
folderNode.getChildren().add(new TreeNodeBase("document", "T052003", true));
folderNode.getChildren().add(new TreeNodeBase("document", "T020011", true));
personNode.getChildren().add(folderNode);
folderNode = new TreeNodeBase("bar-folder", "Requires Bar Approval", false);
folderNode.getChildren().add(new TreeNodeBase("document", "J010002", true));
folderNode.getChildren().add(new TreeNodeBase("document", "J030047", true));
folderNode.getChildren().add(new TreeNodeBase("document", "F030112", true));
personNode.getChildren().add(folderNode);
treeData.getChildren().add(personNode);
// populate Dynamic Portion of tree
personNode = new TreeNodeBase("dynamic-person", "Dynamic Joe", false);
treeData.getChildren().add(personNode);
_treeModel = new TreeModelBase(treeData);
return _treeModel;
}
public void expandDynamicPerson(ActionEvent event)
{
UIComponent component = event.getComponent();
UIComponent parent = component.getParent().getParent();
HtmlTree tree = (HtmlTree) parent;
TreeNode personNode = tree.getNode();
if(personNode.getChildCount() == 0){
TreeNode folderNode = new TreeNodeBase("dynamic-folder", "Dynamic-Folder", false);
personNode.getChildren().add(folderNode);
}
}
public void expandDynamicFolder(ActionEvent event)
{
UIComponent component = event.getComponent();
UIComponent parent = component.getParent().getParent();
HtmlTree tree = (HtmlTree) parent;
TreeNode folderNode = tree.getNode();
if(folderNode.getChildCount() == 0){
folderNode.getChildren().add(new TreeNodeBase("document", "D12345", true));
folderNode.getChildren().add(new TreeNodeBase("document", "D67890", true));
}
}
// Destroy tree and make a new one
// Call this when you want to destroy the tree and recreate it.
public void destroyTree(){
FacesContext context = FacesContext.getCurrentInstance();
ValueBinding binding = context.getApplication().createValueBinding("#{treeBacker.treeModel}");
binding.setValue(context, null);
}
}
-------------------------
tree2.jsp
------------------------
<!-- Expand/Collapse Handled By Server -->
<t:tree2 id="serverTree" value="#{treeBacker.treeData}" var="node" varNodeToggler="t" clientSideToggle="false" showNav="false">
<f:facet name="person">
<h:panelGroup>
<t:graphicImage value="/images/yellow-folder-open.png" rendered="#{t.nodeExpanded}" border="0"/>
<t:graphicImage value="/images/yellow-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
</h:panelGroup>
</f:facet>
<f:facet name="foo-folder">
<h:panelGroup>
<t:graphicImage value="/images/yellow-folder-open.png" rendered="#{t.nodeExpanded}" border="0"/>
<t:graphicImage value="/images/yellow-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
<h:outputText value=" (#{node.childCount})" styleClass="childCount" rendered="#{!empty node.children}"/>
</h:panelGroup>
</f:facet>
<f:facet name="bar-folder">
<h:panelGroup>
<t:graphicImage value="/images/blue-folder-open.gif" rendered="#{t.nodeExpanded}" border="0"/>
<t:graphicImage value="/images/blue-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
<h:outputText value=" (#{node.childCount})" styleClass="childCount" rendered="#{!empty node.children}"/>
</h:panelGroup>
</f:facet>
<f:facet name="document">
<h:panelGroup>
<h:commandLink immediate="true" styleClass="#{t.nodeSelected ? 'documentSelected':'document'}" actionListener="#{t.setNodeSelected}">
<t:graphicImage value="/images/document.png" border="0"/>
<h:outputText value="#{node.description}"/>
<f:param name="docNum" value="#{node.identifier}"/>
</h:commandLink>
</h:panelGroup>
</f:facet>
<f:facet name="dynamic-person">
<h:panelGroup>
<h:commandLink immediate="true" action="">
actionListener="#{treeBacker.expandDynamicPerson}">
<t:graphicImage value="/images/yellow-folder-open.png" rendered="#{t.nodeExpanded}" border="0"/>
<t:graphicImage value="/images/yellow-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
</h:panelGroup>
</f:facet>
<f:facet name="dynamic-folder">
<h:panelGroup>
<h:commandLink immediate="true" action="">
actionListener="#{treeBacker.expandDynamicFolder}">
<t:graphicImage value="/images/blue-folder-open.gif" rendered="#{t.nodeExpanded}" border="0"/>
<t:graphicImage value="/images/blue-folder-closed.png" rendered="#{!t.nodeExpanded}" border="0"/>
<h:outputText value="#{node.description}" styleClass="nodeFolder"/>
<h:outputText value=" (#{node.childCount})" styleClass="childCount" rendered="#{!empty node.children}"/>
</h:panelGroup>
</f:facet>
</t:tree2>
</h:form>
</f:view>
*********************************************************************
This message and any attachments are solely for the intended recipient. If you are not the intended recipient, disclosure, copying, use or distribution of the information included in this message is prohibited -- Please immediately and permanently delete.

