package org.orienteer.core.component.command.modal;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.orienteer.core.OrienteerWebSession;
import org.orienteer.core.component.BootstrapType;
import org.orienteer.core.component.FAIconType;
import org.orienteer.core.component.command.AjaxCommand;
import org.orienteer.core.component.property.DisplayMode;
import org.orienteer.core.component.table.OClassColumn;
import org.orienteer.core.component.table.OClassMetaColumn;
import org.orienteer.core.component.table.component.GenericTablePanel;
import ru.ydn.wicket.wicketorientdb.model.OClassesDataProvider;
import ru.ydn.wicket.wicketorientdb.proto.OClassPrototyper;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Dialog to show table of {@link OClass}es to select
*/
public abstract class SelectSubOClassDialogPage extends GenericPanel<OClass> {
private static class OClassCanBeInstanciated implements Predicate<OClass>, Serializable {
@Override
public boolean apply(OClass input) {
return !input.isAbstract();
}
}
private final static Predicate<OClass> CAN_BE_INSTANTIATED = new OClassCanBeInstanciated();
private ModalWindow modal;
public SelectSubOClassDialogPage(ModalWindow modal, IModel<OClass> model) {
super(modal.getContentId(), model);
this.modal = modal;
IModel<DisplayMode> displayModeModel = DisplayMode.VIEW.asModel();
List<IColumn<OClass, String>> columns = new ArrayList<IColumn<OClass,String>>();
columns.add(new OClassColumn(OClassPrototyper.NAME, displayModeModel));
columns.add(new OClassMetaColumn(OClassPrototyper.SUPER_CLASSES, displayModeModel));
columns.add(new AbstractColumn<OClass, String>(new ResourceModel("command.select")) {
private static final long serialVersionUID = 1L;
@Override
public void populateItem(Item<ICellPopulator<OClass>> cellItem,
String componentId, final IModel<OClass> rowModel) {
cellItem.add(new AjaxCommand<OClass>(componentId, new ResourceModel("command.select") ,rowModel) {
@Override
public void onClick(AjaxRequestTarget target) {
SelectSubOClassDialogPage.this.modal.close(target);
SelectSubOClassDialogPage.this.modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
@Override
public void onClose(AjaxRequestTarget target) {
onSelect(target, getModelObject());
}
});
}
}.setIcon(FAIconType.plus).setBootstrapType(BootstrapType.INFO));
}
});
SortableDataProvider<OClass, String> provider = new OClassesDataProvider(new PropertyModel<Collection<OClass>>(this, "classesList"));
GenericTablePanel<OClass> tablePanel = new GenericTablePanel<OClass>("tablePanel", columns, provider, 20);
add(tablePanel);
}
public List<OClass> getClassesList() {
List<OClass> ret = new ArrayList<OClass>();
OClass oClass = getModelObject();
if(oClass!=null) {
if(CAN_BE_INSTANTIATED.apply(oClass)) ret.add(oClass);
ret.addAll(Collections2.filter(oClass.getAllSubclasses(), CAN_BE_INSTANTIATED));
} else {
ret.addAll(Collections2.filter(OrienteerWebSession.get().getDatabase().getMetadata().getSchema().getClasses(), CAN_BE_INSTANTIATED));
}
return ret;
}
protected abstract void onSelect(AjaxRequestTarget target, OClass selectedOClass);
}