package org.appfuse.webapp.components;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SupportsInformalParameters;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.internal.TapestryInternalUtils;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.services.Request;
import org.appfuse.webapp.internal.MenuContext;
import java.util.List;
/**
* The menu item component represents each list item in the menu.
* The parameters are used to define the link inside the item when applicable
*
* @author Serge Eby
*/
@SupportsInformalParameters
public class MenuItem {
@Property
@Parameter(required = true, defaultPrefix = BindingConstants.LITERAL, allowNull = false)
private String name;
@Property
@Parameter(required = true, defaultPrefix = BindingConstants.MESSAGE, allowNull = false)
private String title;
@Property
@Parameter(required = false, defaultPrefix = BindingConstants.LITERAL, allowNull = false)
private String page;
@Property
@Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = true)
private String description;
@Property
@Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = true)
private String style;
@Property
@Parameter(value = "false", defaultPrefix = BindingConstants.PROP, allowNull = false)
private boolean disabled;
@Property
@Parameter(defaultPrefix = BindingConstants.LITERAL, allowNull = true)
private String roles;
@Property
@Parameter(name = "class", defaultPrefix = BindingConstants.LITERAL, allowNull = true)
private String itemCssClass;
@Inject
private ComponentResources resources;
@Inject
private Request request;
@Environmental
private MenuContext menuContext;
public String getUrl() {
if (page == null) {
return "#";
}
StringBuilder sb = new StringBuilder();
sb.append(request.getContextPath());
if (page != null && !page.startsWith("/")) {
sb.append("/");
}
sb.append(page);
return sb.toString();
}
void beginRender(MarkupWriter writer) {
List<String> itemClass = CollectionFactory.newList();
Element e = writer.element("li");
if (itemCssClass != null) {
itemClass.add(itemCssClass);
}
if (menuContext.isActive(name)) {
itemClass.add("active");
}
if (!itemClass.isEmpty()) {
e.addClassName(TapestryInternalUtils.toClassAttributeValue(itemClass));
}
Element href = writer.element("a",
"id", name,
"href", getUrl(),
"title", title
);
if (style != null) {
href.attribute("style", style);
}
resources.renderInformalParameters(writer);
writer.write(title);
writer.end(); //a
}
void afterRender(MarkupWriter writer) {
writer.end(); // li
}
}