package com.revolsys.ui.web.controller;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.jexl.JexlContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import com.revolsys.record.io.format.xml.XmlWriter;
import com.revolsys.ui.html.view.BootstrapUtil;
import com.revolsys.ui.html.view.MenuElement;
import com.revolsys.ui.model.Menu;
import com.revolsys.ui.model.Navbar;
import com.revolsys.ui.web.annotation.RequestMapping;
import com.revolsys.ui.web.config.JexlHttpServletRequestContext;
import com.revolsys.util.HtmlAttr;
import com.revolsys.util.HtmlElem;
import com.revolsys.util.HtmlUtil;
import com.revolsys.util.Property;
@Controller
public class MenuViewController {
private void bootstrapMenu(final XmlWriter writer, final Collection<Menu> items, final int level,
final JexlContext jexlContext) {
if (items.size() > 0) {
for (final Menu menu : items) {
if (menu.isVisible()) {
final List<Menu> menus = menu.getMenus();
if (menus.isEmpty()) {
writer.startTag(HtmlElem.LI);
final String cssClass = menu.getCssClass();
if (cssClass != null) {
writer.attribute(HtmlAttr.CLASS, cssClass);
}
bootStrapMenuLink(writer, menu, jexlContext);
writer.endTag(HtmlElem.LI);
} else {
BootstrapUtil.navbarDropdownStart(writer, menu);
bootstrapMenu(writer, menus, level + 1, jexlContext);
BootstrapUtil.navbarDropdownEnd(writer);
}
}
}
}
}
private void bootStrapMenuLink(final XmlWriter out, final Menu menu,
final JexlContext jexlContext) {
String uri = menu.getLink(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());
final String iconName = menu.getIconName();
if (Property.hasValue(iconName)) {
BootstrapUtil.icon(out, iconName);
HtmlUtil.serializeSpan(out, "sr-only", linkTitle);
} else {
out.text(linkTitle);
}
out.endTag(HtmlElem.A);
}
} else {
out.text(linkTitle);
}
}
private void bootstrapNavbar(final HttpServletRequest request, final HttpServletResponse response,
final Navbar navBar) throws IOException {
if (navBar != null) {
try (
final OutputStream out = response.getOutputStream();
XmlWriter writer = new XmlWriter(out, false)) {
writer.setIndent(false);
final JexlHttpServletRequestContext jexlContext = new JexlHttpServletRequestContext(
request);
final List<Menu> menus = new ArrayList<>();
for (final Menu menuItem : navBar.getMenus()) {
if (menuItem.isVisible()) {
menus.add(menuItem);
}
}
final String title = navBar.getTitle();
if (Property.hasValue(title) || !menus.isEmpty()) {
BootstrapUtil.navbarStart(writer, navBar, jexlContext);
bootstrapMenu(writer, menus, 1, jexlContext);
BootstrapUtil.navbarEnd(writer);
}
writer.flush();
}
}
}
@RequestMapping("/view/footer/{menuName}")
public void footer(final HttpServletRequest request, final HttpServletResponse response,
@PathVariable("menuName") final String menuName) throws IOException {
final Navbar navbar = (Navbar)request.getAttribute(menuName);
bootstrapNavbar(request, response, navbar);
}
@RequestMapping("/view/header/{menuName}")
public void header(final HttpServletRequest request, final HttpServletResponse response,
@PathVariable("menuName") final String menuName) throws IOException {
final Navbar navbar = (Navbar)request.getAttribute(menuName);
bootstrapNavbar(request, response, navbar);
}
@RequestMapping("/view/menu/{menuName}")
public void menu(final HttpServletRequest request, final HttpServletResponse response,
@PathVariable("menuName") final String menuName) throws IOException {
final Menu menu = (Menu)request.getAttribute(menuName);
if (menu != null) {
final MenuElement menuElement = new MenuElement(menu, menuName);
final OutputStream out = response.getOutputStream();
menuElement.serialize(out);
}
}
}