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
22
23
24
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
116
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();
144
145 }
146
147
148 void afterRender(MarkupWriter writer) {
149 writer.end();
150 }
151
152 }