[jboss-user] [JBoss Seam] - Re: Seam application with tree on left and editor for select
christian.bauer@jboss.com
do-not-reply at jboss.com
Wed Oct 18 07:09:32 EDT 2006
This is how I get stuff into the tree:
| package adapters;
|
| import org.apache.myfaces.trinidad.model.ChildPropertyTreeModel;
| import org.apache.myfaces.trinidad.model.TreeModel;
|
| import java.util.Collection;
|
| /**
| * Wraps a nested tree of nodes into a Trinidad TreeModel.
| *
| * The primary purpose of this adapter is to check if a node has children,
| * or not. The wrapped TreeModel then results in correct rendering of the
| * tree, either as a container or a node icon.
| *
| * See faces-config.xml for a usage example.
| *
| * @author Christian Bauer
| */
| public class TreeModelAdapter {
|
| private Collection rootCollection;
| private String childCollectionPropertyName;
|
| public TreeModelAdapter() {}
|
| public TreeModel getTreeModel() {
| return new ContainerAwareChildPropertyTreeModel(rootCollection, childCollectionPropertyName);
| }
|
| public Collection getRootCollection() {
| return rootCollection;
| }
|
| public void setRootCollection(Collection rootCollection) {
| this.rootCollection = rootCollection;
| }
|
| public String getChildCollectionPropertyName() {
| return childCollectionPropertyName;
| }
|
| public void setChildCollectionPropertyName(String childCollectionPropertyName) {
| this.childCollectionPropertyName = childCollectionPropertyName;
| }
|
| /**
| * This inner class extends the built-in Trinidad TreeModel, which by default
| * treats every node as a container. Users have to click on a node to see
| * if there is something in the container, and the rendering is also wrong.
| * This might trigger loading of the children (the collection of children is
| * touched) if you have lazy loading. However, you now get correct rendering
| * of nodes and a regular node does no longer appear as a container.
| */
| class ContainerAwareChildPropertyTreeModel extends ChildPropertyTreeModel {
|
| public ContainerAwareChildPropertyTreeModel(Object object, String string) {
| super(object, string);
| }
|
| public ContainerAwareChildPropertyTreeModel() {
| super();
| }
|
| public boolean isContainer() {
| boolean hasChildren = false;
| // Hit the children collection of this container to
| // figure out if its really a container
| enterContainer();
| if (getRowCount() > 0) hasChildren = true;
| exitContainer();
|
| return hasChildren;
| }
| }
| }
|
| <faces-config>
|
| <!-- JSF backing beans that call Seam components, these
| backing beans provide an additional layer between
| business components managed by Seam and presentation-only
| beans. Common backing beans in a Seam application are
| model adapters (that convert from a java.util.Collection
| to a Trinidad TreeModel, for example).
| -->
| <managed-bean>
| <managed-bean-name>catalogCategoryAdapter</managed-bean-name>
| <managed-bean-class>adapters.TreeModelAdapter</managed-bean-class>
| <managed-bean-scope>request</managed-bean-scope>
| <managed-property>
| <property-name>rootCollection</property-name>
| <value>#{catalog.rootCategories}</value>
| </managed-property>
| <managed-property>
| <property-name>childCollectionPropertyName</property-name>
| <value>childCategories</value>
| </managed-property>
| </managed-bean>
| ...
|
I guess I should use a Seam component for this last bit, instead of a dumb JSF backing bean.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3979032#3979032
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3979032
More information about the jboss-user
mailing list