package de.elatexam.editor.components.menu; import java.util.List; import org.apache.wicket.AttributeModifier; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.IHeaderContributor; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.request.resource.PackageResourceReference; import org.apache.wicket.request.resource.ResourceReference; /** * Simple menu bar based on http://www.dynamicdrive.com/dynamicindex1/chrome/index.htm. */ public class ChromeMenu extends Panel implements IHeaderContributor { public enum Theme { THEME1, THEME2, THEME3, THEME4, THEME5; /** * @return */ public ResourceReference getResourceReference() { return new PackageResourceReference(ChromeMenu.class, String.format("css/%s.css", this.name().toLowerCase())); } } private ResourceReference CSS_REFERENCE; /** * * @param id * @param listOfMenus */ public ChromeMenu(final String id, final List<List<LinkVO>> listOfMenus, final Theme cssTheme) { super(id); if (cssTheme == null) { // set default theme CSS_REFERENCE = Theme.THEME1.getResourceReference(); } else { CSS_REFERENCE = cssTheme.getResourceReference(); } final ListView<List<LinkVO>> menuView = new ListView<List<LinkVO>>("menuLinkList", listOfMenus) { int itemCount = 0; @Override public void populateItem(final ListItem<List<LinkVO>> item) { final LinkVO linkInfo = (item.getModelObject()).get(0); item.add(createLink(linkInfo, itemCount, item.getModelObject().size() > 1)); itemCount++; } }; menuView.setReuseItems(true); add(menuView); final ListView<List<LinkVO>> submenuListView = new ListView<List<LinkVO>>("submenuList", listOfMenus) { int submenuCounter = 0; @Override public void populateItem(final ListItem<List<LinkVO>> item) { final List<LinkVO> linkInfoList = item.getModelObject(); final List<LinkVO> topMenuRemovedList = linkInfoList.subList(1, linkInfoList.size()); final WebMarkupContainer submenuDiv = new WebMarkupContainer("submenuDiv"); submenuDiv.add(new AttributeModifier("id", true, new Model("dropmenu" + submenuCounter))); final ListView<LinkVO> submenuItem = new ListView<LinkVO>("submenuItem", topMenuRemovedList) { @Override public void populateItem(final ListItem<LinkVO> item) { final LinkVO linkInfo = item.getModelObject(); item.add(createLink(linkInfo, submenuCounter, true)); item.setRenderBodyOnly(true); } }; submenuDiv.add(submenuItem); item.add(submenuDiv); item.setRenderBodyOnly(true); submenuCounter++; } }; submenuListView.setReuseItems(true); add(submenuListView); setRenderBodyOnly(true); } private AbstractLink createLink(final LinkVO linkInfo, final int itemCount, final boolean hasOrIsChildren) { AbstractLink link = null; if (linkInfo.getExternalUrl() != null) { link = new ExternalLink("menuLink", Model.of(linkInfo.getExternalUrl())); } else { link = new Link("menuLink") { @Override public void onClick() { if (linkInfo.getResponsePage() != null) { setResponsePage(linkInfo.getResponsePage()); } else { setResponsePage(linkInfo.getResponsePageClass()); } } }; } if (hasOrIsChildren) { link.add(new AttributeModifier("rel", true, Model.of("dropmenu" + itemCount))); } if (linkInfo.getResponsePageClass() == getPage().getClass()) { link.add(new AttributeAppender("class", true, Model.of("activeTab"), " ")); } final Label linkLabel = new Label("linkText", linkInfo.getLinkText()); linkLabel.setRenderBodyOnly(true); link.add(linkLabel); return link; } /* * (non-Javadoc) * * @see org.apache.wicket.markup.html.IHeaderContributor#renderHead(org.apache .wicket.markup.html.IHeaderResponse) */ public void renderHead(final IHeaderResponse response) { response.renderJavaScriptReference(new JavaScriptResourceReference(ChromeMenu.class, "js/chrome.js")); response.renderCSSReference(CSS_REFERENCE); } }