package com.frovi.ss.Tree; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Vector; /** * PureHtmlTree.java * Created on 2002-sep-27 * @author Stefan Sik, ss@frovi.com * ss * */ public class MakeTree { private boolean showTreeLines = true; private ArrayList ret = new ArrayList(); private INodeSupplier nodeSupplier; private boolean showRoot = true; private int startLevel = -1; private Vector intTreeLines = new Vector(50,10); // Constructor, we need a nodeSupplier. public MakeTree(INodeSupplier nodeSupplier) { setNodeSupplier(nodeSupplier); } // Creates a nodelist with the default parent node, and no expansion string public Collection makeNodeList() { return makeNodeList(""); } // Creates a nodelist with the default parent node public Collection makeNodeList(String expString) { BaseNode root = nodeSupplier.getRootNode(); root.setIsRoot(true); if (showRoot) { addNodeToList(root, startLevel, makeKey(root.getId()), true, true); } return makeNodeList(root.getId(), expString); } public Collection makeNodeList(Integer parentNode, String expString) { intTreeLines.setSize(50); FillTree(parentNode, startLevel, expString, new String("")); return ret; } public Collection makeNodeList(BaseNode parentNode, String expString) { intTreeLines.setSize(50); FillTree(parentNode.getId(), startLevel, expString, new String("")); return ret; } public void setNodeSupplier(INodeSupplier nodeSupplier) { this.nodeSupplier = nodeSupplier; } private String makeKey(Integer id) { if(id == null) return ""; return "/" + String.valueOf(id.intValue()).trim() + "/"; } private void FillTree(Integer parent, int level, String expkey, String makekey) { Collection leafs = new ArrayList(); Collection roots = new ArrayList();; // Every time this method is called, we are one step // deeper in the tree. level++; // Get all the children to this node try { roots = nodeSupplier.getChildContainerNodes(parent); leafs = nodeSupplier.getChildLeafNodes(parent); } catch(Exception e) { e.printStackTrace(); } boolean blnHasDocs = leafs.size() > 0; // Create expansion key to this node String parentKey = makeKey(parent); makekey += parentKey; // loop through all container nodes. Iterator rIter = roots.iterator(); while (rIter.hasNext()) { BaseNode thisNode = (BaseNode) rIter.next(); String nodeKey = makeKey(thisNode.getId()); // TreeLines check if (showTreeLines) { intTreeLines.add(level, new Integer(3)); if (!rIter.hasNext()) { if (blnHasDocs == false) { intTreeLines.remove(level); intTreeLines.add(level, new Integer(2)); } } } // Kolla om denna folder finns med i expansionsnyckeln. I s� // fall l�ter vi rekursionen g�ra sitt. if ( expkey.indexOf(nodeKey) != -1) { addNodeToList(thisNode, level, makekey, true, true); // Open folder // TreeLines check if (showTreeLines) { if (!rIter.hasNext()) { if (blnHasDocs == false) { intTreeLines.remove(level); intTreeLines.add(level, new Integer(0)); } } if (((Integer) intTreeLines.get(level)).intValue() == 3) { intTreeLines.remove(level); intTreeLines.add(level, new Integer(1)); } } // older is open, recursion FillTree(thisNode.getId(), level, expkey, makekey); } else { // Folder �r st�ngd addNodeToList(thisNode, level, makekey, false, true); } } // Documents if (blnHasDocs) { rIter = leafs.iterator(); while (rIter.hasNext()) { BaseNode thisNode = (BaseNode) rIter.next(); if (showTreeLines) { intTreeLines.remove(level); intTreeLines.add(level, new Integer(3)); if (!rIter.hasNext()) { intTreeLines.remove(level); intTreeLines.add(level, new Integer(2)); } } addNodeToList(thisNode, level, "", false, false); } } intTreeLines.remove(level); intTreeLines.add(level, new Integer(0)); } /** * Method addNodeToList * @param thisNode * @param level * @param makekey * @param b */ private void addNodeToList(BaseNode thisNode, int level, String makekey, boolean isOpen, boolean isContainer) { String newKey = makekey; String thisKey = makeKey(thisNode.getId()); int cnt = 0; Vector tree = null; if (level > -1) tree = new Vector(level); Iterator i = intTreeLines.iterator(); while (i.hasNext() && cnt <= level) tree.add(cnt++, i.next()); if (!isOpen) newKey += thisKey; thisNode.setTreeStuff(tree); thisNode.setOpen(isOpen); thisNode.setThisKey(thisKey); thisNode.setOpenCloseKey(newKey); thisNode.setLevel(level); thisNode.setContainer(isContainer); try { // has children check (may belong here??) if (isContainer && nodeSupplier.hasChildren()) { thisNode.setChildren(nodeSupplier.hasChildren(thisNode.getId())); } } catch(Exception e) { e.printStackTrace(); } ret.add(thisNode); } /** * Returns the showRoot. * @return boolean */ public boolean getShowRoot() { return showRoot; } /** * Sets the showRoot. * @param showRoot The showRoot to set */ public void setShowRoot(boolean showRoot) { this.showRoot = showRoot; } }