1 Reply Latest reply on Mar 12, 2010 9:57 PM by jnorman67.jnorman.ni.com

    ajax richfaces tree problems

    mike82
      I keep trying to use richfaces tree component with ajax toggle style. I want to build 3 level tree and I managed to, but with two problems.

      1.When I expand nodes on lev1 and lev2 (so the leaves on 3rd lev are displayed) and then I collapse lev1 and then expand again - lev2 shows it is expanded, but no leaves on 3rd lev are displayed - I need to collapse&expand lev2 again.

      2.When I click on 3rd lev leaf (NodeSelectedEvent is raised), collapse lev1, and then try to expand it again I got: java.lang.IllegalStateException: No tree element available or row key not set!

      Please take a look at my code:

      <h:form id="form1">
                <rich:tree style="width:300px" changeExpandListener="#{categoryTree.processToggle}" nodeSelectListener="#{categoryTree.processSelection}"
                  reRender="selectedNode" ajaxSubmitSelection="true" switchType="ajax" id="categoriesTree"
                  value="#{categoryTree.treeNode}" var="item" stateVar="true">
                 <rich:treeNode>
                      <h:outputText value="#{item}" />
                 </rich:treeNode>
              </rich:tree>
                
              <h:outputText escape="false" value="Selected Node: #{categoryTree.nodeTitle}" id="selectedNode" />
      </h:form>     


      @Name("categoryTree")
      @Scope(ScopeType.PAGE)
      public class CategoryTree {
           @In(create=true) private Categories categories;
           private Log log = Logging.getLog(CategoryTree.class);
           private CategoryTreeNode rootNode = null;
         
          private String nodeTitle;
          private Integer selectedCategoryId;
         
          private CategoryTreeCache cache;
         
           public CategoryTree() {
                try {
                     cache = CategoryTreeCache.getInstance();
                } catch(Exception ex) {
                     log.error("Can't obtain " + cache.getClass().getName() + " instance", ex);
                }
           }
         
          private void addNode(TreeNode node, Category category) {       
              CategoryTreeNode nodeImpl = new CategoryTreeNode();
              nodeImpl.setData(category);       
              node.addChild(category.getCategoryId(), nodeImpl);       
          }
         
          private void addNodes(TreeNode node, Integer parentCategory) {
              List<Category> categoryList = null;
              if(cache.isInCache(parentCategory.toString())) {
                   categoryList = cache.getCategories(parentCategory);
              } else {
                   categoryList = categories.getCategories(parentCategory);
              }
              cache.addCategories(parentCategory, categoryList);
               Iterator<Category> it = categoryList.iterator();         
               while(it.hasNext()) {              
                  addNode(node, it.next());
               }
          }
         
          public void processSelection(NodeSelectedEvent event) {
              HtmlTree tree = (HtmlTree) event.getComponent();
              nodeTitle = (String)tree.getRowData();
              selectedCategoryId = ((CategoryTreeNode)tree.getModelTreeNode(tree.getRowKey())).getCategoryId();
          }
         
          public void processToggle(NodeExpandedEvent event) {
               HtmlTree tree = (HtmlTree) event.getComponent();       
              CategoryTreeNode currentNode = (CategoryTreeNode)tree.getModelTreeNode(tree.getRowKey());
                 addNodes(currentNode, currentNode.getCategoryId());
          }
         
          public CategoryTreeNode getTreeNode() {
              if (rootNode == null) {
                   rootNode = new CategoryTreeNode();
                   rootNode.setData(new Category(0, "Root", -1, (short)0, false));
                   addNodes(rootNode, 0);
              }       
              return rootNode;
          }

         
          public String getNodeTitle() {
              return nodeTitle;
          }

          public void setNodeTitle(String nodeTitle) {
              this.nodeTitle = nodeTitle;
          }
      }
        • 1. Re: ajax richfaces tree problems
          jnorman67.jnorman.ni.com

          Francis Drake,


          Your post is several months old, so this is probably not helpful to you, but it might be helpful to others:


          Regarding problem 2, the exception is thrown when you call getRowData() in processSelection().  You can catch IllegalStateException there and move on.  This isn't the ultimate solution, but, for me, it's a decent work-around until I can get a deeper understanding.