View Javadoc

1   package org.appfuse.webapp.components;
2   
3   import org.apache.tapestry5.BindingConstants;
4   import org.apache.tapestry5.ComponentResources;
5   import org.apache.tapestry5.MarkupWriter;
6   import org.apache.tapestry5.annotations.Environmental;
7   import org.apache.tapestry5.annotations.Parameter;
8   import org.apache.tapestry5.annotations.Property;
9   import org.apache.tapestry5.annotations.SupportsInformalParameters;
10  import org.apache.tapestry5.dom.Element;
11  import org.apache.tapestry5.internal.TapestryInternalUtils;
12  import org.apache.tapestry5.ioc.annotations.Inject;
13  import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
14  import org.apache.tapestry5.services.Request;
15  import org.appfuse.webapp.internal.MenuContext;
16  import org.appfuse.webapp.services.SecurityContext;
17  
18  import java.util.List;
19  
20  /**
21   * The menu item component represents each list item in the menu.
22   * The parameters are used to define the link inside the item when applicable
23   *
24   * @author Serge Eby
25   */
26  
27  @SupportsInformalParameters
28  public class MenuItem {
29  
30      @Property
31      @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL, allowNull = false)
32      private String name;
33  
34      @Property
35      @Parameter(required = true, defaultPrefix = BindingConstants.MESSAGE, allowNull = false)
36      private String title;
37  
38      @Property
39      @Parameter(required = false, defaultPrefix = BindingConstants.LITERAL, allowNull = false)
40      private String page;
41  
42      @Property
43      @Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = true)
44      private String description;
45  
46      @Property
47      @Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = true)
48      private String style;
49  
50      @Property
51      @Parameter(value = "false", defaultPrefix = BindingConstants.PROP, allowNull = false)
52      private boolean disabled;
53  
54  
55      @Property
56      @Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = true)
57      private String roles;
58  
59      @Property
60      @Parameter(name = "class", defaultPrefix = BindingConstants.LITERAL, allowNull = true)
61      private String itemCssClass;
62  
63      @Inject
64      private SecurityContext securityContext;
65  
66      @Inject
67      private ComponentResources resources;
68  
69      @Inject
70      private Request request;
71  
72      @Environmental
73      private MenuContext menuContext;
74  
75  
76      public boolean isVisible() {
77          return securityContext.hasRoles(roles);
78      }
79  
80  
81      public String getUrl() {
82  
83          if (page == null) {
84             return "#";
85          }
86  
87          StringBuilder sb = new StringBuilder();
88          sb.append(request.getContextPath());
89          if (page != null && !page.startsWith("/")) {
90              sb.append("/");
91          }
92          sb.append(page);
93  
94          return sb.toString();
95      }
96  
97  
98      boolean setupRender() {
99          return isVisible();
100     }
101 
102     void beginRender(MarkupWriter writer) {
103 
104         List<String> itemClass = CollectionFactory.newList();
105 
106         Element e = writer.element("li");
107         if (itemCssClass != null) {
108             itemClass.add(itemCssClass);
109         }
110 
111         if (menuContext.isActive(name)) {
112             itemClass.add("active");
113         }
114 
115         //TODO: FIXME
116         // Hack to handle just sub-menus
117         if (page != null && page.startsWith("admin") && page.contains(resources.getPageName().toLowerCase())) {
118            itemClass.add("active");
119         }
120 
121 
122         if (!itemClass.isEmpty()) {
123             e.addClassName(TapestryInternalUtils.toClassAttributeValue(itemClass));
124         }
125 
126         Element href = writer.element("a",
127 
128                 "id", name,
129 
130                 "href", getUrl(),
131 
132                 "title", title
133         );
134 
135         if (style != null) {
136             href.attribute("style", style);
137         }
138         resources.renderInformalParameters(writer);
139 
140 
141         writer.write(title);
142 
143         writer.end(); //a
144 
145     }
146 
147 
148     void afterRender(MarkupWriter writer) {
149         writer.end();    // li
150     }
151 
152 }