package org.nocket.gen.domain.visitor.html.styling.bootstrap2.components;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
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.request.resource.PackageResourceReference;
import org.nocket.NocketSession;
import org.nocket.component.header.jquery.JQueryHelper;
import org.nocket.component.menu.MenuItem;
@SuppressWarnings({ "serial" })
public class DefaultMenuPanel extends Panel {
public DefaultMenuPanel(String id, List<MenuItem> list) {
super(id);
add(new ItemList("menuList", list));
}
@Override
public void renderHead(IHeaderResponse response) {
JQueryHelper.initJQuery(response);
response.render(JavaScriptHeaderItem
.forReference(new PackageResourceReference(DefaultMenuPanel.class, "DefaultMenuPanel.js")));
response.render(CssHeaderItem.forReference(new PackageResourceReference(DefaultMenuPanel.class, "DefaultMenuPanel.css")));
}
private static class ItemList extends ListView<MenuItem> {
private static final String CSS_CLASS_UL = "nav nav-tabs nav-stacked";
private static final String ACTIVE = "active";
public ItemList(String name, List<MenuItem> list) {
super(name, list);
}
@Override
protected void populateItem(ListItem<MenuItem> item) {
MenuItem menuEntry = item.getModelObject();
BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>("link", menuEntry.getTargetPage());
link.add(new Label("linklabel", menuEntry.getLabel()));
item.add(link);
final WebMarkupContainer container = new WebMarkupContainer("nestedContainer");
container.add(new AttributeModifier("class", CSS_CLASS_UL));
ListView<MenuItem> menuList = new ListView<MenuItem>("nested", menuEntry.getSubItems()) {
@Override
protected void populateItem(ListItem<MenuItem> item) {
MenuItem menuEntry = item.getModelObject();
Label label = new Label("nestedLinkLabel", menuEntry.getLabel());
AjaxLink<MenuItem> link = new AjaxLink<MenuItem>("nestedLink", item.getModel()) {
@Override
public void onClick(AjaxRequestTarget target) {
MenuItem item = getModelObject();
boolean itemSuccessfullySelected = item.onClick(this, target);
if (itemSuccessfullySelected) {
NocketSession.get().setLastSelectedMenuItem(item);
}
}
};
link.add(label);
item.add(link);
if (displayMenuOpenedForItem(menuEntry)) {
item.add(new AttributeModifier("class", ACTIVE));
container.add(new AttributeModifier("class", CSS_CLASS_UL + " " + ACTIVE));
}
}
};
container.add(menuList);
container.setVisible(menuEntry.getSubItems().size() > 0);
item.add(container);
}
protected boolean displayMenuOpenedForItem(MenuItem menuEntry) {
return menuEntry.equals(NocketSession.get().getLastSelectedMenuItem());
// This was the original logic but it causes problems when navigating from one page to another
// We keep it here for a while until we are sure that the new logic is suitable. It may cause trouble
// with derived MenuItem classes which don't properly care for registering themself in the session
// as being the last selected item
//return this.getPage().getClass() == menuEntry.getTargetPage();
}
}
}