1 package fr.improve.struts.taglib.layout.treeview; 2 3 import java.io.Serializable ; 4 import java.util.Arrays ; 5 import java.util.Hashtable ; 6 import java.util.Vector ; 7 8 import javax.servlet.ServletContext ; 9 import javax.servlet.http.Cookie ; 10 import javax.servlet.http.HttpServletRequest ; 11 import javax.servlet.jsp.JspException ; 12 13 import fr.improve.struts.taglib.layout.PanelTag; 14 import fr.improve.struts.taglib.layout.menu.MenuComponent; 15 import fr.improve.struts.taglib.layout.skin.Skin; 16 import fr.improve.struts.taglib.layout.util.LayoutUtils; 17 import fr.improve.struts.taglib.layout.util.MenuInterface; 18 import fr.improve.struts.taglib.layout.util.TagUtils; 19 import fr.improve.struts.taglib.layout.util.TreeviewInterface; 20 21 33 public class TreeViewTag extends PanelTag implements MenuInterface { 34 35 38 private static final String TREEVIEW_NUMBER = "fr.improve.struts.taglib.layout.TreeviewTag.TREEVIEW_NUMBER"; 39 40 43 public static final String DEFAULT_TREEVIEW_ACTION = "treeview.do"; 44 45 54 public class TreeViewIds implements Serializable { 55 private int counter = -1; 56 java.util.Hashtable namedTreeview; 57 java.util.Hashtable anonymousTreeview; 58 TreeViewIds() { 59 namedTreeview = new Hashtable (); 60 anonymousTreeview = new Hashtable (); 61 } 62 public synchronized int getNewId() { 63 counter++; 64 return counter; 65 } 66 } 67 68 71 protected Vector menus = new Vector (); 72 73 76 protected boolean autoIncrement = true; 77 78 81 protected int expandedLevelsAtFirst = -1; 82 83 86 public void addItem(MenuComponent item) { 87 menus.add(item); 88 } 89 public void addItems(MenuComponent[] items) { 90 menus.addAll(Arrays.asList(items)); 91 } 92 93 96 public int doEndLayoutTag() throws JspException { 97 boolean allowIndirection = false; 101 if (menus.size()==0 && name!=null) { 102 MenuComponent lc_tree = LayoutUtils.getMenu(pageContext, name); 103 if (lc_tree==null) { 104 throw new JspException ("Could not find menu named \"" + name + "\""); 105 } 106 addItems(lc_tree.getMenuComponents()); 107 allowIndirection = true; 108 } 109 110 doStartLayout(); 111 StringBuffer buffer = new StringBuffer (); 112 doStartPanel(buffer); 113 114 buffer.append("<tr><td>"); 115 116 String lc_i = computeTreeviewId(); 118 119 buffer.append("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" id=\"treeView" + lc_i+ "\">\n"); 120 121 String lc_styleClass = styleClass; 123 if (lc_styleClass==null) { 124 lc_styleClass = ""; 125 } 126 if (lc_styleClass.length()!=0 && autoIncrement) { 127 lc_styleClass += "1"; 128 } 129 130 doPrintMenu(buffer,(MenuComponent[])menus.toArray(new MenuComponent[menus.size()]), (HttpServletRequest )pageContext.getRequest(), pageContext.getServletContext(), bundle, lc_i, name, lc_styleClass, allowIndirection); 132 133 buffer.append("</table>"); 134 135 if (pageContext.getRequest().getAttribute("fr.improve.struts.taglib.layout.treeview.TreeViewTag.KEY")==null && name!=null && allowIndirection) { 137 buffer.append("<iframe id=\"treeFrame\" name=\"treeFrame\" style=\"width:0px; height:0px; border: 0px\" SRC=\""); 138 buffer.append(buildIFrameSource((HttpServletRequest )pageContext.getRequest())); 139 buffer.append("\"></iframe>"); 140 pageContext.getRequest().setAttribute("fr.improve.struts.taglib.layout.treeview.TreeViewTag.KEY", ""); 141 } 142 143 buffer.append("</td></tr>"); 144 doEndPanel(buffer); 145 146 if (expandedLevelsAtFirst > 0) { 147 Cookie [] lc_cookies = ((HttpServletRequest ) pageContext.getRequest()).getCookies(); 149 boolean lc_firstDisplay = true; 150 if (lc_cookies != null) { 151 for (int i = 0; i < lc_cookies.length; i++) 152 { 153 if (lc_cookies[i].getName().equals("treeView")) { 154 lc_firstDisplay = false; 156 break; 157 } 158 } 159 } 160 if (lc_firstDisplay) { 161 buffer.append("<script>"); 162 buffer.append("expandFirstLevels(\""); 163 buffer.append(lc_i); 164 buffer.append("\", "); 165 buffer.append(expandedLevelsAtFirst); 166 buffer.append(");"); 167 buffer.append("</script>"); 168 } 169 } 170 171 TagUtils.write(pageContext, buffer.toString()); 172 doEndLayout(); 173 174 menus.removeAllElements(); 175 name = null; 176 return EVAL_PAGE; 177 } 178 179 183 private String computeTreeviewId() throws JspException { 184 if (name!=null) { 185 return name; 186 } 187 TreeViewIds treeviewIds = (TreeViewIds) pageContext.getSession().getAttribute(TREEVIEW_NUMBER); 188 Integer lc_id; 189 if (treeviewIds == null) { 190 treeviewIds = new TreeViewIds(); 191 pageContext.getSession().setAttribute(TREEVIEW_NUMBER, treeviewIds); 192 } 193 if (name!=null) { 194 lc_id = (Integer ) treeviewIds.namedTreeview.get(name); 195 if (lc_id==null) { 196 lc_id = new Integer (treeviewIds.getNewId()); 197 treeviewIds.namedTreeview.put(name, lc_id); 198 } 199 return lc_id.toString(); 200 } else { 201 if (pageContext.getRequest().getAttribute(TREEVIEW_NUMBER)!=null) { 202 throw new JspException ("There can be only one anonymous treeview per request"); 203 } else { 204 pageContext.getRequest().setAttribute(TREEVIEW_NUMBER, ""); 205 lc_id = (Integer ) treeviewIds.anonymousTreeview.get(((HttpServletRequest )pageContext.getRequest()).getRequestURI()); 206 if (lc_id==null) { 207 lc_id = new Integer (treeviewIds.getNewId()); 208 treeviewIds.anonymousTreeview.put(((HttpServletRequest )pageContext.getRequest()).getRequestURI(), lc_id); 209 } 210 return lc_id.toString(); 211 } 212 } 213 } 214 215 public static int doPrintMenu(StringBuffer buffer, MenuComponent[] menus, HttpServletRequest in_request, ServletContext in_servletcontext, String in_bundle, String in_path, String in_name, String in_styleClass) throws JspException { 216 return doPrintMenu(buffer, menus, in_request, in_servletcontext, in_bundle, in_path, in_name, in_styleClass, true); 217 } 218 219 232 public static int doPrintMenu(StringBuffer buffer, MenuComponent[] menus, HttpServletRequest in_request, ServletContext in_servletcontext, String in_bundle, String in_path, String in_name, String in_styleClass, boolean in_allowIndirection) throws JspException { 233 TreeviewInterface lc_treeviewRenderer = LayoutUtils.getSkin(in_request.getSession()).getTreeviewInterface(); 235 236 TreeItemInfo lc_info = new TreeItemInfo(); 238 239 int lc_numberOfMenusPrinted = menus.length; 240 241 lc_info.imageDirectory = LayoutUtils.getSkin(in_request.getSession()).getImageDirectory(in_request); 243 244 lc_info.styleClass = lc_treeviewRenderer.computeStyleClass(in_styleClass); 246 247 lc_info.bundle = in_bundle; 248 lc_info.name = in_name; 249 250 for (int i=0;i<menus.length;i++) { 252 253 255 256 MenuComponent item = (MenuComponent) menus[i]; 258 String link = item.getLocation(); 259 String key = item.getTitle(); 260 String image = item.getImage(); 261 String target = item.getTarget(); 262 String onclick = item.getOnClick(); 263 String style = item.getStyle(); 264 265 lc_info.hasSubMenus = item.hasMenuComponents(); 267 268 lc_info.isLast = i+1 == menus.length; 270 271 String lc_id = item.getId(); 274 if (lc_id==null) { 275 lc_id = String.valueOf(i); 276 } 277 lc_info.path = in_path.length()==0 ? lc_id : in_path + "*" + lc_id; 278 279 lc_info.isClosed = TreeViewTag.isNodeClosed(in_request, lc_info.path); 281 282 int lc_numberOfMenusToLoad = LayoutUtils.getSkin(in_request.getSession()).getNumberOfMenusLoaded(); 284 285 lc_info.useIndirection = in_allowIndirection && lc_numberOfMenusPrinted >= lc_numberOfMenusToLoad && in_name!=null && lc_info.isClosed; 287 288 289 290 292 lc_treeviewRenderer.startRow(buffer); 294 295 lc_treeviewRenderer.renderTree(buffer, in_request, lc_info); 297 298 if (lc_info.hasSubMenus) { 300 lc_treeviewRenderer.startSubMenu(buffer); 301 } 302 303 lc_treeviewRenderer.renderIcon(buffer, lc_info, item); 305 306 lc_treeviewRenderer.startLabel(buffer, in_styleClass, onclick, style); 308 309 lc_treeviewRenderer.renderImage(buffer, in_request, lc_info, item); 311 312 lc_treeviewRenderer.renderLabel(buffer, in_request, in_servletcontext, lc_info, item); 314 315 lc_treeviewRenderer.endLabel(buffer); 317 318 lc_treeviewRenderer.renderActions(buffer, in_request, in_servletcontext, lc_info, item); 319 320 if (lc_info.hasSubMenus) { 321 lc_numberOfMenusPrinted = lc_treeviewRenderer.endSubMenu(buffer, in_request, in_servletcontext, lc_numberOfMenusPrinted, item, lc_info); 322 } 323 324 lc_treeviewRenderer.endRow(buffer); 325 } 326 return lc_numberOfMenusPrinted; 327 } 328 329 337 public static boolean isNodeClosed(HttpServletRequest in_request, String in_path) { 338 Cookie [] lc_cookies = in_request.getCookies(); 339 340 if (lc_cookies==null) return true; 341 for (int i=0;i<lc_cookies.length;i++) { 342 Cookie lc_cookie = lc_cookies[i]; 343 if (lc_cookie.getName().equals("treeView")) { 344 if (lc_cookie.getValue().indexOf("_treeView" + in_path + "_")==-1) { 345 return true; 346 } else { 347 return false; 348 } 349 } 350 } 351 return true; 352 } 353 354 355 public int doStartLayoutTag() throws JspException { 356 return EVAL_BODY_INCLUDE; 357 } 358 public void setAutoIncrement(String in_value) { 359 if ("true".equalsIgnoreCase(in_value)) { 360 autoIncrement = true; 361 } else { 362 autoIncrement = false; 363 } 364 } 365 public void release() { 366 super.release(); 367 autoIncrement = true; 368 expandedLevelsAtFirst = -1; 369 } 370 371 374 public final void setExpandedLevelsAtFirst(int expandedLevelsAtFirst) 375 { 376 this.expandedLevelsAtFirst = expandedLevelsAtFirst; 377 } 378 379 384 private String buildIFrameSource(HttpServletRequest in_request) { 385 String action = LayoutUtils.getSkin(in_request.getSession()).getProperty(Skin.TREEVIEW_ACTION, DEFAULT_TREEVIEW_ACTION); 386 return in_request.getContextPath() + "/" + action + "?iframe=iframe"; 387 } 388 } 389 | Popular Tags |