package fr.openwide.core.wicket.more.markup.repeater.collection;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
/**
* A collection view whose items provide access to their model through a more precise form than just
* {@code IModel<T>}.
*
* <p>Useful when using models with additional capabilities (i.e. additional methods).
*
* @author yrodiere
*
* @param <T> The item type
* @param <M> The item model type
*/
public abstract class SpecificModelCollectionView<T, M extends IModel<T>> extends CollectionView<T> {
private static final long serialVersionUID = 1L;
public SpecificModelCollectionView(String id, IItemModelAwareCollectionModel<T, ?, ? extends M> collectionModel) {
super(id, collectionModel);
}
@Override
protected final void populateItem(Item<T> item) {
populateItem((SpecificModelItem)item);
}
protected abstract void populateItem(SpecificModelItem item);
@Override
@SuppressWarnings("unchecked") // The model is known to be a IItemModelAwareCollectionModel, see constructor
public IItemModelAwareCollectionModel<T, ?, ? extends M> getModel() {
return (IItemModelAwareCollectionModel<T, ?, ? extends M>)super.getModel();
}
@Override
@SuppressWarnings("unchecked") // The type of "model" is enforced by the collectionModel
protected SpecificModelItem newItem(String id, int index, IModel<T> model) {
return new SpecificModelItem(id, index, (M) model);
}
public class SpecificModelItem extends Item<T> {
private static final long serialVersionUID = 1L;
public SpecificModelItem(String id, int index, M model) {
super(id, index, model);
}
@SuppressWarnings("unchecked")
public M getSpecificModel() {
return (M)getModel();
}
}
}