package fr.openwide.core.wicket.more.markup.repeater.table.toolbar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IStyledColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.RefreshingView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import fr.openwide.core.jpa.more.business.sort.ISort;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.more.markup.html.sort.model.CompositeSortModel;
import fr.openwide.core.wicket.more.markup.repeater.table.AbstractCoreToolbar;
import fr.openwide.core.wicket.more.markup.repeater.table.CoreDataTable;
import fr.openwide.core.wicket.more.markup.repeater.table.column.ICoreColumn;
public class CoreHeadersToolbar<S extends ISort<?>> extends AbstractCoreToolbar {
private static final long serialVersionUID = 5382092664865344556L;
private final CoreDataTable<?, S> table;
private final CompositeSortModel<S> sortModel;
public <T> CoreHeadersToolbar(final CoreDataTable<T, S> table, CompositeSortModel<S> sortModel) {
super(table);
this.table = table;
this.sortModel = sortModel;
RefreshingView<IColumn<T, S>> headers = new RefreshingView<IColumn<T, S>>("headers") {
private static final long serialVersionUID = 1L;
@Override
protected Iterator<IModel<IColumn<T, S>>> getItemModels() {
List<IModel<IColumn<T, S>>> columnsModels = new LinkedList<IModel<IColumn<T, S>>>();
for (IColumn<T, S> column : table.getDisplayedColumns()) {
columnsModels.add(Model.of(column));
}
return columnsModels.iterator();
}
@Override
protected void populateItem(Item<IColumn<T, S>> item) {
final IColumn<T, S> column = item.getModelObject();
WebMarkupContainer header = null;
if (column.isSortable()) {
header = newSortableHeader("header", (ICoreColumn<?, S>) column);
} else {
header = new WebMarkupContainer("header");
}
if (column instanceof IStyledColumn) {
header.add(new ClassAttributeAppender(new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return ((IStyledColumn<?, ?>) column).getCssClass();
}
@Override
public void detach() {
column.detach();
}
}));
}
item.add(header);
item.setRenderBodyOnly(true);
header.add(column.getHeader("label"));
}
};
add(headers);
}
/**
* Factory method for sortable header components. A sortable header component must have id of
* <code>headerId</code> and conform to markup specified in <code>HeadersToolbar.html</code>
*
* @param headerId
* header component id
* @param sortableColumn
* column this header represents
* @return created header component
*/
protected WebMarkupContainer newSortableHeader(String headerId, IColumn<?, S> sortableColumn) {
if (sortableColumn instanceof ICoreColumn) {
return new CoreSortBorder<S>(headerId, table, sortModel, (ICoreColumn<?, S>) sortableColumn);
} else {
return new CoreSortBorder<S>(headerId, table, sortModel, sortableColumn);
}
}
}