package com.revolsys.ui.html.view; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.revolsys.record.io.format.xml.XmlWriter; import com.revolsys.ui.model.Menu; import com.revolsys.ui.web.config.JexlHttpServletRequestContext; import com.revolsys.util.HtmlAttr; import com.revolsys.util.HtmlElem; import com.revolsys.util.Property; public class MenuElement extends Element { private String cssClass = "menu"; private JexlHttpServletRequestContext jexlContext; private Menu menu; private int numLevels = 1; private boolean showRoot = true; public MenuElement() { } public MenuElement(final Menu menu, final String cssClass) { this.menu = menu; this.cssClass = cssClass; } /** * @return Returns the cssClass. */ public String getCssClass() { return this.cssClass; } /** * @return Returns the menu. */ public Menu getMenu() { return this.menu; } /** * @return Returns the numLevels. */ public int getNumLevels() { return this.numLevels; } @Override public void initialize(final HttpServletRequest request) { this.jexlContext = new JexlHttpServletRequestContext(request); } /** * @return Returns the showRoot. */ public boolean isShowRoot() { return this.showRoot; } private void menu(final XmlWriter out, final Collection<Menu> items, final int level) { if (items.size() > 0) { out.startTag(HtmlElem.UL); for (final Menu menu : items) { if (menu.isVisible()) { out.startTag(HtmlElem.LI); final String cssClass = menu.getCssClass(); if (cssClass != null) { out.attribute(HtmlAttr.CLASS, cssClass); } menuLink(out, menu); if (level < this.numLevels) { menu(out, menu.getMenus(), level + 1); } out.endTag(HtmlElem.LI); } } out.endTag(HtmlElem.UL); } } private void menuLink(final XmlWriter out, final Menu menu) { String uri = menu.getLink(this.jexlContext); final String linkTitle = menu.getLinkTitle(); final String onClick = menu.getOnClick(); if (onClick != null && uri == null) { uri = "#"; } if (Property.hasValue(uri)) { if (uri.startsWith("javascript:")) { out.startTag(HtmlElem.BUTTON); out.attribute(HtmlAttr.ON_CLICK, uri.substring(11)); out.text(menu.getTitle()); out.endTag(HtmlElem.BUTTON); } else { out.startTag(HtmlElem.A); out.attribute(HtmlAttr.HREF, uri); out.attribute(HtmlAttr.TITLE, linkTitle); out.attribute(HtmlAttr.ON_CLICK, onClick); out.attribute(HtmlAttr.TARGET, menu.getTarget()); out.text(linkTitle); out.endTag(HtmlElem.A); } } else { out.text(linkTitle); } } @Override public void serializeElement(final XmlWriter out) { if (this.menu != null) { final List<Menu> menus = new ArrayList<>(); for (final Menu menuItem : this.menu.getMenus()) { if (menuItem.isVisible()) { menus.add(menuItem); } } if (this.showRoot || !menus.isEmpty()) { out.startTag(HtmlElem.DIV); out.attribute(HtmlAttr.CLASS, this.cssClass); if (this.showRoot && this.menu.getTitle() != null) { out.startTag(HtmlElem.DIV); out.attribute(HtmlAttr.CLASS, "title"); menuLink(out, this.menu); out.endTag(HtmlElem.DIV); } menu(out, menus, 1); out.endTag(HtmlElem.DIV); } } } /** * @param cssClass The cssClass to set. */ public void setCssClass(final String cssClass) { this.cssClass = cssClass; } /** * @param menu The menu to set. */ public void setMenu(final Menu menu) { this.menu = menu; } /** * @param numLevels The numLevels to set. */ public void setNumLevels(final int numLevels) { this.numLevels = numLevels; } /** * @param showRoot The showRoot to set. */ public void setShowRoot(final boolean showRoot) { this.showRoot = showRoot; } }