package org.orienteer.core.component; import com.google.common.collect.Lists; import com.orientechnologies.orient.core.index.OIndex; import com.orientechnologies.orient.core.metadata.schema.OClass; import com.orientechnologies.orient.core.metadata.schema.OProperty; import org.apache.wicket.Component; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.link.AbstractLink; 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.GenericPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.ResourceModel; import org.orienteer.core.behavior.UpdateOnActionPerformedEventBehavior; import org.orienteer.core.component.property.AbstractLinkViewPanel; import org.orienteer.core.component.property.OClassViewPanel; import org.orienteer.core.web.schema.SchemaPage; import ru.ydn.wicket.wicketorientdb.model.OClassModel; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * Page header for schema specific entities: {@link OClass}, {@link OProperty}, {@link OIndex} */ public class SchemaPageHeader extends GenericPanel<OClass> { private RepeatingView childRepeatingView; private IModel<List<OClass>> classPathModel = new LoadableDetachableModel<List<OClass>>() { @Override protected List<OClass> load() { OClass currentClass = SchemaPageHeader.this.getModelObject(); List<OClass> superClasses; List<OClass> breadCrumbs = new ArrayList<OClass>(); if (currentClass != null) { while ((superClasses = currentClass.getSuperClasses()) != null && !superClasses.isEmpty()) { currentClass = superClasses.get(0); breadCrumbs.add(currentClass); } breadCrumbs = Lists.reverse(breadCrumbs); } return breadCrumbs; } }; public SchemaPageHeader(String id, IModel<OClass> oClassModel) { super(id, oClassModel); add(new BookmarkablePageLink<Object>("schema", SchemaPage.class) .setBody(new ResourceModel("menu.list.schema"))); add(new ListView<OClass>("classes", classPathModel) { @Override protected void populateItem(ListItem<OClass> item) { item.add(new OClassPageLink("link", item.getModel()).setClassNameAsBody(false)); } }); childRepeatingView = new RepeatingView("child"); add(childRepeatingView); add(UpdateOnActionPerformedEventBehavior.INSTANCE_CHANGING_CONTINUE); } public SchemaPageHeader addChild(Component component) { childRepeatingView.add(component); return this; } public String newChildId() { return childRepeatingView.newChildId(); } }