SimpleNodeTreeNodeAdapter.java
001 package net.sourceforge.pmd.util.viewer.model;
002 
003 
004 import java.util.ArrayList;
005 import java.util.Collections;
006 import java.util.Enumeration;
007 import java.util.List;
008 
009 import javax.swing.tree.TreeNode;
010 
011 import net.sourceforge.pmd.lang.ast.Node;
012 
013 
014 /**
015  * provides the adapter for the tree model
016  *
017  @author Boris Gruschko ( boris at gruschko.org )
018  @version $Id: SimpleNodeTreeNodeAdapter.java 5954 2008-04-04 03:51:12Z rgustav $
019  */
020 
021 public class SimpleNodeTreeNodeAdapter implements TreeNode {
022   
023     private Node node;
024     private List<TreeNode> children;
025     private SimpleNodeTreeNodeAdapter parent;
026 
027     /**
028      * constructs the node
029      *
030      @param node underlying AST's node
031      */
032     public SimpleNodeTreeNodeAdapter(SimpleNodeTreeNodeAdapter parent, Node node) {
033         this.parent = parent;
034         this.node = node;
035     }
036 
037     /**
038      * retrieves the underlying node
039      *
040      @return AST node
041      */
042     public Node getSimpleNode() {
043         return node;
044     }
045 
046 
047     /**
048      @see javax.swing.tree.TreeNode#getChildAt(int)
049      */
050     public TreeNode getChildAt(int childIndex) {
051         checkChildren();
052         return children.get(childIndex);
053     }
054 
055 
056     /**
057      @see javax.swing.tree.TreeNode#getChildCount()
058      */
059     public int getChildCount() {
060         checkChildren();
061         return children.size();
062     }
063 
064 
065     /**
066      @see javax.swing.tree.TreeNode#getParent()
067      */
068     public TreeNode getParent() {
069         return parent;
070     }
071 
072     /**
073      @see javax.swing.tree.TreeNode#getIndex(javax.swing.tree.TreeNode)
074      */
075     public int getIndex(TreeNode node) {
076         checkChildren();
077         return children.indexOf(node);
078     }
079 
080 
081     /**
082      @see javax.swing.tree.TreeNode#getAllowsChildren()
083      */
084     public boolean getAllowsChildren() {
085         return true;
086     }
087 
088 
089     /**
090      @see javax.swing.tree.TreeNode#isLeaf()
091      */
092 
093     public boolean isLeaf() {
094         checkChildren();
095         return children.isEmpty();
096     }
097 
098 
099     /**
100      @see javax.swing.tree.TreeNode#children()
101      */
102 
103     public Enumeration<TreeNode> children() {
104         return Collections.enumeration(children);
105     }
106 
107 
108     /**
109      * checks the children and creates them if neccessary
110      */
111     private void checkChildren() {
112         if (children == null) {
113             children = new ArrayList<TreeNode>(node.jjtGetNumChildren());
114             for (int i = 0; i < node.jjtGetNumChildren(); i++) {
115                 children.add(new SimpleNodeTreeNodeAdapter(this, node.jjtGetChild(i)));
116             }
117         }
118     }
119 
120     /**
121      @see java.lang.Object#toString()
122      */
123     public String toString() {
124         return node.toString();
125     }
126 }