1 /* 2 * @(#)TOCItemTag.java 1.5 06/10/30 3 * 4 * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. 5 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 6 * 7 * This code is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 only, as 9 * published by the Free Software Foundation. Sun designates this 10 * particular file as subject to the "Classpath" exception as provided 11 * by Sun in the LICENSE file that accompanied this code. 12 * 13 * This code is distributed in the hope that it will be useful, but WITHOUT 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16 * version 2 for more details (a copy is included in the LICENSE file that 17 * accompanied this code). 18 * 19 * You should have received a copy of the GNU General Public License version 20 * 2 along with this work; if not, write to the Free Software Foundation, 21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 22 * 23 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 24 * CA 95054 USA or visit www.sun.com if you need additional information or 25 * have any questions. 26 */ 27 28 package javax.help.tagext; 29 30 import javax.servlet.jsp.*; 31 import javax.servlet.jsp.tagext.*; 32 import java.util.*; 33 import java.io.*; 34 import java.net.URL; 35 import java.net.MalformedURLException; 36 import javax.help.HelpBroker; 37 import javax.help.HelpSet; 38 import javax.help.Map; 39 import javax.help.Map.ID; 40 import javax.help.Merge; 41 import javax.help.MergeHelpUtilities; 42 import javax.help.NavigatorView; 43 import javax.help.TOCItem; 44 import javax.help.TOCView; 45 import javax.help.SortMerge; 46 import javax.swing.tree.DefaultMutableTreeNode; 47 import javax.swing.tree.TreeNode; 48 49 /** 50 * The JSP tag extra info class for an TocItem 51 * 52 * @author Roger D. Brinkley 53 * @version 1.5 10/30/06 54 * @see javax.help.TOCItem 55 */ 56 57 public class TOCItemTag extends BodyTagSupport { 58 private Enumeration treeEnum; 59 private DefaultMutableTreeNode topNode; 60 private String baseID="root"; 61 private HelpBroker hb; 62 private TOCView view=null; 63 setTocView(TOCView view)64 public void setTocView(TOCView view) { 65 this.view = view; 66 } 67 setBaseID(String baseID)68 public void setBaseID(String baseID) { 69 this.baseID = baseID; 70 } 71 setHelpBroker(HelpBroker hb)72 public void setHelpBroker(HelpBroker hb) { 73 this.hb = hb; 74 } 75 initialize()76 private void initialize() { 77 if (view == null) { 78 return; 79 } 80 topNode = view.getDataAsTree(); 81 82 String mergeType = view.getMergeType(); 83 HelpSet hs = view.getHelpSet(); 84 Locale locale = hs.getLocale(); 85 86 87 // Make sure the children are all handled correctly 88 MergeHelpUtilities.mergeNodeChildren(mergeType, topNode); 89 90 // add all the subhelpsets 91 addSubHelpSets(hs); 92 93 treeEnum = topNode.preorderEnumeration(); 94 } 95 96 /** Adds subhelpsets 97 * 98 * @param hs The HelpSet which subhelpsets will be added 99 */ addSubHelpSets(HelpSet hs)100 private void addSubHelpSets(HelpSet hs){ 101 for( Enumeration e = hs.getHelpSets(); e.hasMoreElements(); ) { 102 HelpSet ehs = (HelpSet) e.nextElement(); 103 if (ehs == null) { 104 continue; 105 } 106 // merge views 107 NavigatorView[] views = ehs.getNavigatorViews(); 108 for(int i = 0; i < views.length; i++){ 109 if (views[i] instanceof TOCView) { 110 Merge mergeObject = 111 Merge.DefaultMergeFactory.getMerge(view, views[i]); 112 if (mergeObject != null) { 113 mergeObject.processMerge(topNode); 114 } 115 } 116 } 117 addSubHelpSets( ehs ); 118 } 119 } 120 doStartTag()121 public int doStartTag() { 122 initialize(); 123 if(treeEnum.hasMoreElements()) { 124 DefaultMutableTreeNode node = 125 (DefaultMutableTreeNode) treeEnum.nextElement(); 126 // never use the top node. It is just the container node 127 if (node == topNode) { 128 try { 129 node = (DefaultMutableTreeNode) treeEnum.nextElement(); 130 } catch (NoSuchElementException e) { 131 return SKIP_BODY; 132 } 133 } 134 setNodeAttributes(node); 135 return EVAL_BODY_TAG; 136 } 137 else { 138 return SKIP_BODY; 139 } 140 } 141 doAfterBody()142 public int doAfterBody() throws JspException { 143 BodyContent body = getBodyContent(); 144 try { 145 body.writeOut(getPreviousOut()); 146 } catch (IOException e) { 147 throw new JspTagException("TOCItemTag: " + e.getMessage()); 148 } 149 150 // clear up so the next time the body content is empty 151 body.clearBody(); 152 if (treeEnum.hasMoreElements()) { 153 DefaultMutableTreeNode node = 154 (DefaultMutableTreeNode) treeEnum.nextElement(); 155 setNodeAttributes(node); 156 return EVAL_BODY_TAG; 157 } else { 158 return SKIP_BODY; 159 } 160 } 161 setNodeAttributes(DefaultMutableTreeNode node)162 private void setNodeAttributes(DefaultMutableTreeNode node) { 163 TOCItem item = (TOCItem) node.getUserObject(); 164 pageContext.setAttribute("name", item.getName()); 165 String helpID = ""; 166 if (item.getID() != null) { 167 helpID = item.getID().id; 168 } 169 pageContext.setAttribute("helpID", helpID); 170 pageContext.setAttribute("parent", Integer.toHexString(node.getParent().hashCode())); 171 String id = getID(node.getParent()); 172 pageContext.setAttribute("parentID", id); 173 pageContext.setAttribute("node", Integer.toHexString(node.hashCode())); 174 id = getID(node); 175 pageContext.setAttribute("nodeID", id); 176 String content = getContentURL(item); 177 pageContext.setAttribute("contentURL", content); 178 String icon = getIconURL(node, item, true); 179 pageContext.setAttribute("iconURL", icon); 180 String iconOpen = getIconURL(node, item, false); 181 pageContext.setAttribute("iconOpenURL", iconOpen); 182 String expansionType = Integer.toString(item.getExpansionType()); 183 pageContext.setAttribute("expansionType", expansionType); 184 } 185 getID(TreeNode node)186 private String getID(TreeNode node) { 187 if (node == topNode) { 188 return baseID; 189 } 190 TreeNode parent = node.getParent(); 191 if (parent == null) { 192 return ""; 193 } 194 String id = getID(parent); 195 id = id.concat("_" + Integer.toString(parent.getIndex(node))); 196 return id; 197 } 198 199 /** 200 * return the content URL in String form for a given TOCItem 201 * 202 * returns an empty String if no content exists. 203 */ getContentURL(TOCItem item)204 private String getContentURL(TOCItem item) { 205 URL url = null; 206 ID id = item.getID(); 207 if (id != null) { 208 HelpSet hs = id.hs; 209 Map map = hs.getLocalMap(); 210 try { 211 url = map.getURLFromID(id); 212 } catch (MalformedURLException e) { 213 // just ignore 214 } 215 } 216 if (url == null) { 217 return ""; 218 } 219 return url.toExternalForm(); 220 } 221 222 /** 223 * return the icon URL in String form for a given TOCItem 224 * 225 * returns empty String if no content exists. 226 */ getIconURL(DefaultMutableTreeNode node, TOCItem item, boolean closedIcon)227 private String getIconURL(DefaultMutableTreeNode node, 228 TOCItem item, 229 boolean closedIcon) { 230 URL url = null; 231 ID id = item.getImageID(); 232 if (id == null) { 233 if (node.isLeaf()) { 234 id = view.getTopicImageID(); 235 } else { 236 if (closedIcon) { 237 id = view.getCategoryClosedImageID(); 238 } else { 239 id = view.getCategoryOpenImageID(); 240 } 241 } 242 } 243 if (id != null) { 244 HelpSet hs = id.hs; 245 Map map = hs.getLocalMap(); 246 try { 247 url = map.getURLFromID(id); 248 } catch (MalformedURLException e) { 249 // just ignore 250 } 251 } 252 if (url == null) { 253 return ""; 254 } 255 return url.toExternalForm(); 256 } 257 } 258 259