package org.orienteer.core.component.table;
import com.orientechnologies.orient.core.metadata.schema.OProperty;
import org.apache.wicket.Component;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.FilterForm;
import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.FilteredAbstractColumn;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.orienteer.core.CustomAttribute;
import org.orienteer.core.OrienteerWebApplication;
import org.orienteer.core.component.meta.AbstractMetaPanel;
import org.orienteer.core.component.visualizer.IVisualizer;
import org.orienteer.core.component.visualizer.UIVisualizersRegistry;
/**
* {@link IColumn} to display meta components ( {@link AbstractMetaPanel} )
*
* @param <T> the type of the object that will be rendered in this column's cells
* @param <C> the type of criteria for this column
* @param <S> the type of the sort property
*/
public abstract class AbstractMetaColumn<T, C, S> extends FilteredAbstractColumn<T, S> implements IExportableColumn<T, S>
{
private static final long serialVersionUID = 1L;
private IModel<C> criteryModel;
private IModel<String> labelModel;
public AbstractMetaColumn(IModel<C> criteryModel) {
super(null);
this.criteryModel = criteryModel;
}
public AbstractMetaColumn(final S sortProperty, IModel<C> criteryModel) {
super(null, sortProperty);
this.criteryModel = criteryModel;
}
@SuppressWarnings("unchecked")
@Override
public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) {
cellItem.add(newMetaPanel(componentId, criteryModel, rowModel));
}
public IModel<C> getCriteryModel() {
return criteryModel;
}
protected abstract <V> AbstractMetaPanel<T, C, V> newMetaPanel(String componentId, IModel<C> criteryModel, IModel<T> rowModel);
protected abstract IModel<String> newLabelModel();
public IModel<String> getLabelModel(){
if(labelModel==null)
{
labelModel = newLabelModel();
}
return labelModel;
}
public AbstractMetaColumn<T, C, S> setLabelModel(IModel<String> labelModel)
{
this.labelModel = labelModel;
return this;
}
@Override
public final IModel<String> getDisplayModel() {
return getLabelModel();
}
@Override
public IModel<?> getDataModel(IModel<T> rowModel) {
return newMetaPanel("exporting", criteryModel, rowModel).getExportableDataModel();
}
@Override
public void detach() {
super.detach();
if(criteryModel!=null)criteryModel.detach();
if(labelModel!=null) labelModel.detach();
}
@Override
public Component getFilter(String componentId, FilterForm<?> form) {
return null;
}
/**
* Get component for supported filtering column
* @param id - component id
* @param propertyModel - property model for view
* @param valueModel - value for view
* @return component which support filtering
*/
protected Component getComponentForFiltering(String id, IModel<OProperty> propertyModel, Form form, IModel<?> valueModel) {
UIVisualizersRegistry registry = OrienteerWebApplication.lookupApplication().getUIVisualizersRegistry();
String visualizerName = CustomAttribute.VISUALIZATION_TYPE.getValue(propertyModel.getObject());
if (visualizerName == null) {
visualizerName = "default";
}
IVisualizer visualizer = registry.getComponentFactory(propertyModel.getObject().getType(), visualizerName);
if (visualizer == null) {
visualizer = registry.getComponentFactory(propertyModel.getObject().getType(), "default");
}
Component component = visualizer.createFilterComponent(id, propertyModel, form, valueModel);
if (component == null) {
visualizer = registry.getComponentFactory(propertyModel.getObject().getType(), "default");
component = visualizer.createFilterComponent(id, propertyModel, form, valueModel);
}
return component;
}
}