package org.orienteer.core.web; import com.orientechnologies.orient.core.record.impl.ODocument; import org.apache.wicket.AttributeModifier; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.html.panel.GenericPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.util.visit.IVisit; import org.apache.wicket.util.visit.IVisitor; import org.orienteer.core.component.FAIcon; import org.orienteer.core.model.ODocumentNameModel; import org.orienteer.core.module.PerspectivesModule; import ru.ydn.wicket.wicketorientdb.model.ODocumentPropertyModel; import java.util.Collections; import java.util.List; /** * Panel to display recursive tree menu. */ public class RecursiveMenuPanel extends GenericPanel<ODocument> { private int level = -1; @Override public void renderHead(IHeaderResponse response) { if(level<=1) { response.render(OnDomReadyHeaderItem.forScript( "var cur = $(\"#"+getMarkupId()+" li.active\");" + "cur.parents('ul').collapse('show');" + "cur.parents('li').addClass(\"active\");")); } } public RecursiveMenuPanel(String id, IModel<ODocument> itemModel) { super(id, itemModel); setOutputMarkupId(true); add(new ListView<ODocument>("items", new PropertyModel<List<ODocument>>(this, "items")) { @Override protected void populateItem(ListItem<ODocument> item) { IModel<ODocument> itemModel = item.getModel(); ODocumentPropertyModel<String> urlModel = new ODocumentPropertyModel<String>(itemModel, "url"); ODocumentPropertyModel<List<ODocument>> subItems = new ODocumentPropertyModel<List<ODocument>>(itemModel, "subItems"); final boolean hasSubItems = subItems.getObject() != null && !subItems.getObject().isEmpty(); ExternalLink link = new ExternalLink("link", urlModel) .setContextRelative(true); link.add(new FAIcon("icon", new ODocumentPropertyModel<String>(itemModel, "icon")), new Label("name", new ODocumentNameModel(item.getModel())).setRenderBodyOnly(true), new WebMarkupContainer("menuLevelGlyph").setVisibilityAllowed(hasSubItems)); item.add(link); if (isActiveItem(urlModel)) { item.add(new AttributeModifier("class", "active")); } item.add(new RecursiveMenuPanel("subItems", itemModel)); } }); } public List<ODocument> getItems() { return getItems(getModelObject()); } public List<ODocument> getItems(ODocument doc) { List<ODocument> items = null; if(doc!=null) { if(doc.getSchemaClass().isSubClassOf(PerspectivesModule.OCLASS_PERSPECTIVE)) { items = (List<ODocument>)doc.field("menu"); } else if(doc.getSchemaClass().isSubClassOf(PerspectivesModule.OCLASS_ITEM)) { items = (List<ODocument>)doc.field("subItems"); } } if(items!=null) items.remove(null); //Remove deleted records return items; } @Override protected void onConfigure() { super.onConfigure(); List<ODocument> subItems = getItems(); setVisible(subItems!=null && !subItems.isEmpty()); } @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); String addClass = level==1?"nav-first-level": (level==2?"nav-second-level": (level==3?"nav-third-level":"nav-"+level+"-level")); tag.append("class", addClass, " "); } @Override protected void onReAdd() { super.onReAdd(); initLevel(); } @Override protected void onInitialize() { super.onInitialize(); initLevel(); } protected int getLevel() { if(level<0) initLevel(); return level; } private void initLevel() { RecursiveMenuPanel parentMenuPanel = findParent(RecursiveMenuPanel.class); level = parentMenuPanel==null?1:parentMenuPanel.getLevel()+1; } private boolean isActiveItem(ODocumentPropertyModel<String> urlModel) { String currentUrl = RequestCycle.get().getRequest().getUrl().getPath(); String url = urlModel.getObject(); return url!=null && currentUrl.equals(url.replaceFirst("^/", "")); } }