package org.freehep.webutil.tree;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URLDecoder;
import java.util.Date;
import java.util.Enumeration;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* A tag for generating trees.
* @author The FreeHEP team @ SLAC
*/
public class TreeTag extends SimpleTagSupport {
private TreeNode root = null;
private boolean showRootNode = true;
private boolean showItemCount = false;
private String leafHref;
private String folderHref;
private int folderHrefLimit;
private String rootNodeName = "/";
private String target = null;
private String onclick = null;
private boolean useCookies = true;
private boolean showEmptyFolders = false;
private boolean showFolderHrefForNodesWithLeavesOnly = false;
public void doTag() throws JspException, IOException {
if ( root == null )
throw new JspException("The model could not be loaded.");
StringWriter title = new StringWriter();
if (getJspBody() != null) getJspBody().invoke(title);
HttpServletRequest request = (HttpServletRequest) ((PageContext) getJspContext()).getRequest();
HttpServletResponse response = (HttpServletResponse) ((PageContext) getJspContext()).getResponse();
String path = request.getContextPath();
Tree tree = new Tree(path);
tree.setRootVisible(showRootNode);
tree.setShowItemCount(showItemCount);
tree.setLeafHref(leafHref);
tree.setFolderHref(folderHref);
tree.setFolderHrefLimit(folderHrefLimit);
tree.setTarget(target);
tree.setOnclick(onclick);
tree.setShowEmptyFolders(showEmptyFolders);
tree.setShowFolderHrefForNodesWithLeavesOnly(showFolderHrefForNodesWithLeavesOnly);
Cookie[] cookies = request.getCookies();
for ( int i = 0; i < cookies.length; i++ ) {
Cookie c = cookies[i];
String name = URLDecoder.decode(c.getName(),"UTF-8");
if ( name.startsWith("tree.folder.") ) {
String folderName = name.replace("tree.folder.","");
TreeNode folder = TreeUtils.findNode(root,folderName);
if ( folder != null && useCookies ) {
tree.setNodeStatus(folder,c.getValue().equals("block"));
} else {
c.setMaxAge(0);
response.addCookie(c);
}
}
}
JspWriter out = getJspContext().getOut();
if (getJspContext().getAttribute("scriptIncluded",PageContext.PAGE_SCOPE) == null) {
tree.printStyle(out);
tree.printScript(out);
getJspContext().setAttribute("scriptIncluded",Boolean.TRUE,PageContext.PAGE_SCOPE);
}
tree.printTree(out,root,title.toString());
}
public void setModel(TreeNode model) {
this.root = model;
}
public void setRootVisible(boolean show) {
this.showRootNode = show;
}
public void setshowItemCount(boolean show) {
this.showItemCount = show;
}
public void setLeafHref(String href) {
this.leafHref = href;
}
public void setFolderHref(String href) {
this.folderHref = href;
}
public void setFolderHrefLimit(int limit) {
this.folderHrefLimit = limit;
}
public void setRootNodeName(String name) {
this.rootNodeName = name;
}
public void setTarget(String target) {
this.target = target;
}
public void setOnclick(String onclick) {
this.onclick = onclick;
}
public void setUseCookies(boolean useCookies) {
this.useCookies = useCookies;
}
public void setShowEmptyFolders(boolean showEmptyFolders) {
this.showEmptyFolders = showEmptyFolders;
}
public void setShowFolderHrefForNodesWithLeavesOnly(boolean visible) {
showFolderHrefForNodesWithLeavesOnly = visible;
}
}