package org.freehep.webutil.tree;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
/**
*
* @author The FreeHEP team @ SLAC.
*
*/
public class TreeUtils {
public static TreeNode[] nodesForPath(String path, TreeNode root, boolean recursive) {
TreeNode node = findNode(root, path);
if (node.isLeaf())
return new TreeNode[] { node };
return getAllChildren(node, recursive);
}
private static TreeNode[] getAllChildren(TreeNode node, boolean recursive) {
List allChildren = new ArrayList();
addChildrenToList(node, allChildren, recursive);
TreeNode[] nodes = new TreeNode[allChildren.size()];
for ( int i = 0; i < allChildren.size(); i++ ) {
TreeNode child = (TreeNode) allChildren.get(i);
nodes[i] = child;
}
return nodes;
}
private static void addChildrenToList(TreeNode node, List list, boolean recursive) {
List children = node.children();
for ( int i = 0; i < children.size(); i++ ) {
TreeNode child = (TreeNode) children.get(i);
if ( child.isLeaf() )
list.add(child);
else if ( recursive )
addChildrenToList(child, list, true);
}
}
public static TreeNode findNode(TreeNode root, String path) {
StringTokenizer st = new StringTokenizer(path, "/");
TreeNode parent = root;
while( st.hasMoreTokens() ) {
String name = (String) st.nextToken();
TreeNode child = findChild(parent, name);
if ( child == null )
return null;
parent = child;
}
return parent;
}
public static TreeNode findChild(TreeNode node, String name) {
if (node.children() == null) return null;
for (Iterator i = node.children().iterator(); i.hasNext(); ) {
TreeNode child = (TreeNode) i.next();
if (name.equals(child.getLabel())) return child;
}
return null;
}
public static void expandNode(TreeNode root, String path) {
StringTokenizer st = new StringTokenizer(path, "/");
TreeNode parent = root;
while( st.hasMoreTokens() ) {
String name = (String) st.nextToken();
TreeNode child = findChild(parent, name);
if ( child == null )
return;
if ( child instanceof DefaultTreeNode )
((DefaultTreeNode) child).setIsExpanded(true);
parent = child;
}
}
public static boolean nodeHasInnerLeaves(TreeNode node) {
return nodeHasInnerLeaves(node, true);
}
public static boolean nodeHasInnerLeaves(TreeNode node, boolean recursive) {
if ( node.isLeaf() )
throw new RuntimeException("Improper invocation of this method. Node must be a folder.");
List children = node.children();
if ( children.size() == 0 )
return false;
for ( int i = 0; i < children.size(); i++ ) {
TreeNode child = (TreeNode) children.get(i);
if ( child.isLeaf() )
return true;
if (recursive) {
boolean hasInnerLeaves = nodeHasInnerLeaves(child);
if ( hasInnerLeaves )
return true;
}
}
return false;
}
}