package test; import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.zkoss.zul.DefaultTreeModel; import org.zkoss.zul.TreeNode; public class FileTreeNode implements TreeNode, Serializable{ private static final long serialVersionUID = 1L; private boolean checkedChildren = false; private ArrayList children; private final File file; private DefaultTreeModel model; private final FileTreeNode parent; public FileTreeNode(final File f, final FileTreeNode p){ file = f; parent = p; } public FileTreeNode(final String n){ file = new File(n); parent = null; } @Override public void add(final TreeNode child){ throw new UnsupportedOperationException("add"); } private void ensureChildren(){ if(!checkedChildren){ if(isLeaf()){ children = null; }else{ final File[] files = file.listFiles(); if(files != null){ Arrays.sort(files); final ArrayList tmp = new ArrayList(); for(final File f : files){ if(!f.isHidden()){ final FileTreeNode child = new FileTreeNode(f, this); tmp.add(child); } } children = tmp; }else{ children = new ArrayList(1); } System.out.println("ensure children : " + file + "\t" + children.size()); } checkedChildren = true; } } @Override public FileTreeNode getChildAt(final int childIndex){ ensureChildren(); if(childIndex < 0 || getChildCount() <= childIndex){ return null; } return children.get(childIndex); } @Override public int getChildCount(){ ensureChildren(); if(children == null){ return 0; } return children.size(); } @Override public List getChildren(){ ensureChildren(); return children; } @Override public File getData(){ return file; } @Override public int getIndex(final TreeNode node){ ensureChildren(); if(getChildCount() < 1){ return -1; } return children.indexOf(node); } @Override public DefaultTreeModel getModel(){ if(parent != null){ return parent.getModel(); } return model; } @Override public FileTreeNode getParent(){ return parent; } public String getRenderName(){ if(isLeaf()){ return file.getName(); }else{ return "/" + file.getName(); } } @Override public void insert(final TreeNode child, final int index){ throw new UnsupportedOperationException("insert"); } @Override public boolean isLeaf(){ return !file.isDirectory(); } @Override public void remove(final int index){ throw new UnsupportedOperationException("remove"); } @Override public void remove(final TreeNode child){ throw new UnsupportedOperationException("remove"); } @Override public void setData(final Object data){ throw new UnsupportedOperationException("setData"); } @Override public void setModel(final DefaultTreeModel m){ if(m != null && parent != null){ throw new IllegalStateException("Only root allowed, " + this); } model = m; } }