/* Copyright (c) 2003 eInnovation Inc. All rights reserved This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ /* * Created on May 29, 2003 */ package com.openedit.webui.tree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * This is a placeholder for a future version * */ public abstract class HtmlTreeRenderer extends BaseTreeRenderer { private static final Log log = LogFactory.getLog(HtmlTreeRenderer.class); protected boolean fieldExpandingAll = false; protected String fieldIconHome; protected int fieldIconWidth = 16; public int getIconWidth() { return fieldIconWidth; } public void setIconWidth(int inIconWidth) { fieldIconWidth = inIconWidth; } /* * Gets the root directory for icons. */ public String getIconHome() { if (fieldIconHome == null) fieldIconHome = "/system/images/tree/"; return fieldIconHome; } /** * Sets the root directory for icons. * @param inIconHome the root directory for icons. If <code>null</code> defaults to <code>/openedit/images/tree/</code>. * */ public void setIconHome(String inIconHome) { fieldIconHome = inIconHome; if (inIconHome!=null && !fieldIconHome.endsWith("/")) fieldIconHome = fieldIconHome + "/"; } public HtmlTreeRenderer(WebTree inWebTree) { fieldWebTree = inWebTree; } public HtmlTreeRenderer() { } public String renderAsString() { StringBuffer js = new StringBuffer( ); // Ensure the root node is always expanded. Object obj = getWebTree().getModel().getRoot(); expandNode( obj ); //Amazingly... In IE6.0 you cannot name your div id the same as a globally defined javascript variable js.append("<div class=\"dtree\" id='root" + getWebTree().getName() + "'>"); js.append( renderFolder( getWebTree().getModel().getRoot(),0)); //line levels and blank levels js.append("</div>"); return js.toString(); } public String renderAsString(String inNodeId) { StringBuffer js = new StringBuffer( ); WebTreeModel model = getWebTree().getModel(); int levels = 0; Object child = model.getChildById(inNodeId); if( child != null) { Object parent = child; while (parent != null && parent != model.getRoot()) { levels++; parent = model.getParent(parent); } js.append( renderFolder( child,levels)); //line levels and blank levels } return js.toString(); } protected String renderFolder(Object inNode, int level) { // Use null for our folder icon, and the JavaScript tree will substitute either folder.png or // folderopen.png, depending on whether the node is open or closed. StringBuffer js = new StringBuffer(); String id = getWebTree().getModel().getId(inNode); String name = toName(inNode); String path = toUrl(inNode); // String post = ""; // if( isLast) // { // post = "bottom"; // } String selected = "node"; boolean select = false; // if( fieldLastCutoffNode != null) // { if( getSelectedNode() == inNode ) { select = true; } else { if( inNode == getLastCutoffNode() ) { //If the selected node is visible then no need to make the cut off visible Object parent = getSelectedNode(); if( parent != null) { parent = getWebTree().getModel().getParent(parent); if( !hasBeenExpanded(parent) ) { select = true; } } } } if( select ) { selected = "nodeSel"; } String icon = customIconSet(inNode); if( icon == null) { icon = ""; } int wide = getIconWidth(); boolean folder = !getWebTree().getModel().isLeaf(inNode); if ( folder ) { boolean expanded = hasBeenExpanded( inNode ); boolean shouldexpand = false; boolean isroot = false; if (inNode == getWebTree().getModel().getRoot()) { isroot = true; } int padding = (level)*wide; if( padding == 0) { padding = wide/3; } renderRow(inNode, js, id, name, path, icon, expanded, shouldexpand, isroot, level , padding, select); } else if( isRenderLeaves()) { renderLeaf(level, js, id, name, path, select, icon, wide); } return js.toString(); } private void renderLeaf(int level, StringBuffer js, String id, String name, String path, boolean select, String icon, int wide) { // js.append("\n </div>\n"); // if (entire) // { // } // else { js.append("<div id='" + getWebTree().getName() + "treerow" + id + "' >"); js.append("\n<div class='" + (select ? "dTreeNodeSel ":"") + "treerowtext' id='" + getWebTree().getName() + "treerowtext" + id + "' path='" + path + "' nodeid='"+ id +"' >"); js.append("\n<div class='treerowinside' style='padding-left: " + (level)*wide + "px;'>"); js.append("<img alt='' src='" + getHome() + getIconHome() + "rightempty.png' id='jpageTree" + id + "' />"); // } //indent(js,level+2); js.append("<a title='" + path + "' href='#" + path + "' onclick=\"return " + getWebTree().getName() +".jumpToNode('" + path + "','" + id + "');\" >"); //js.append("<img src='" + getHome() + getIconHome() + icon + "page.png' class='treeicon' id='" + getWebTree().getName() + "ipageTree" + id + "' alt='' />" + name + "</a></div></div></div>"); js.append(name + "</a></div></div></div>"); } private void renderRow(Object inNode, StringBuffer js, String id, String name, String path, String icon, boolean expanded, boolean shouldexpand, boolean isroot,int level, int padding, boolean select) { js.append("<div id='" + getWebTree().getName() + "treerow" + id + "' >"); js.append("<div class='" + (select ? "dTreeNodeSel ":"") + "treerowtext' id='" + getWebTree().getName() + "treerowtext" + id + "' path='" + path + "' nodeid='"+ id +"'>"); js.append("<div class='treerowinside' style='padding-left: " + padding + "px;' >"); //Has children so make it a link to open and close if( (!isroot && isRenderLeaves() && getWebTree().getModel().hasChildren(inNode) ) || (!isroot && !isRenderLeaves() && getWebTree().getModel().hasFolderChildren(inNode))) { js.append("<a class='node' href='#" + path + "' onclick=\"return " + getWebTree().getName() +".toggleNode('" + path + "','"); js.append( getWebTree().getId() ); js.append("','" + id + "');\" >"); if( expanded ) { //if( level > 0) if (inNode != getWebTree().getModel().getRoot()) { js.append("<img alt='' src='" + getHome() + getIconHome() + "down.png' id='jpageTree" + id + "' />"); } //js.append("<img alt='' class='treeicon' src='" + getHome() + getIconHome() + icon + "folderopen.png' id='ipageTree" + id + "' />" ); } else { shouldexpand = true; if (inNode != getWebTree().getModel().getRoot()) { js.append("<img alt='' src='" + getHome() + getIconHome() + "right.png' id='jpageTree" + id + "' />"); } } js.append("</a>"); } else { if( !isroot) { js.append("<img alt='' src='" + getHome() + getIconHome() + "right.png' id='jpageTree" + id + "' />" ); } } js.append("<a title='" + path + "' href='#" + path + "' onclick=\""); if( shouldexpand ) { js.append("return " + getWebTree().getName() +".jumpAndOpenNode('" + path + "','"); js.append( getWebTree().getId() ); js.append("','" + id + "');\""); } else { js.append(" return " + getWebTree().getName() +".jumpToNode('" + path + "','" + id + "');\" "); //js.append(" return jumpAndOpenNode('" + path + "','" + id + "');\" "); } js.append( " id='" + getWebTree().getName() + "spageTree" + id + "'>" + name + "</a>"); js.append("</div>\n"); js.append("</div>\n"); if ( expanded ) { int c = getWebTree().getModel().getChildCount( inNode ); for (int i = 0; i < c; i++ ) { Object childNode = getWebTree().getModel().getChild( inNode, i ); try { js.append(renderFolder(childNode,level + 1 )); } catch ( Exception ex) { //js.append("Error: " + ex); log.error(ex); } } } js.append("</div>\n"); } }