package org.nocket.component.table.ajax;
import java.util.List;
import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxNavigationToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
import org.apache.wicket.extensions.markup.html.repeater.data.table.NoRecordsToolbar;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.OddEvenItem;
import org.apache.wicket.model.IModel;
import org.nocket.component.table.IRowItemSettable;
import org.nocket.component.table.ReflectionUtil;
import org.nocket.component.table.TableItemPosition;
import org.nocket.component.table.behavior.ClickAjaxEventBehavior;
import org.nocket.component.table.behavior.DblClickAjaxEventBehavior;
import org.nocket.component.table.behavior.IRowClickEventAware;
/**
* Table with sort capability realized with the Ajax links.
*
* @author blaz02
*
* @param <T>
* Model object type following Java-Bean convention.
*/
public class DMDAjaxDataTable<T> extends DataTable<T, String> implements IRowClickEventAware<T>,
IRowItemSettable {
private static final long serialVersionUID = 1L;
private IRowClickEventAware<T> rowClickDelegate;
private Class rowItemClass;
public DMDAjaxDataTable(String id, List<IColumn<T, String>> columns, ISortableDataProvider<T, String> dataProvider,
int rowsPerPage, TableItemPosition navigationbarPosition) {
super(id, columns, dataProvider, rowsPerPage);
setOutputMarkupId(true);
setVersioned(false);
addToolbar(navigationbarPosition, new AjaxNavigationToolbar(this));
addToolbar(TableItemPosition.top, new DMDAjaxHeadersToolbar(this, dataProvider));
addToolbar(TableItemPosition.bottom, new NoRecordsToolbar(this));
}
protected void addToolbar(TableItemPosition position, AbstractToolbar abstractToolbar) {
if (TableItemPosition.bottom.equals(position)) {
addBottomToolbar(abstractToolbar);
} else {
addTopToolbar(abstractToolbar);
}
}
@Override
@SuppressWarnings( { "rawtypes", "unchecked" })
protected Item<T> newRowItem(String id, int index, final IModel<T> model) {
Class clazz = rowItemClass != null ? rowItemClass : OddEvenItem.class;
Item<T> item = (Item<T>) ReflectionUtil.newInstance(clazz,
new Class[] { String.class, int.class, IModel.class }, new Object[] { id, index, model });
// Add event listeners to each row
// Doubleclick listener
DblClickAjaxEventBehavior<T> newOnDblClicktEvent = this.newOnDblClickEvent(model);
if (newOnDblClicktEvent != null)
item.add(newOnDblClicktEvent);
// Singleclick listener
ClickAjaxEventBehavior<T> newOnClickEvent = this.newOnClickEvent(model);
if (newOnClickEvent != null)
item.add(newOnClickEvent);
return item;
}
public void setRowClickDelegate(IRowClickEventAware<T> rowClickDelegate) {
this.rowClickDelegate = rowClickDelegate;
}
public DblClickAjaxEventBehavior<T> newOnDblClickEvent(IModel<T> model) {
return rowClickDelegate == null ? null : rowClickDelegate.newOnDblClickEvent(model);
}
public ClickAjaxEventBehavior<T> newOnClickEvent(IModel<T> model) {
return rowClickDelegate == null ? null : rowClickDelegate.newOnClickEvent(model);
}
public void setRowItemClass(Class rowItemClass) {
this.rowItemClass = rowItemClass;
}
}