package fr.openwide.core.wicket.more.markup.repeater.map;
import java.util.Map;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import com.google.common.base.Function;
import fr.openwide.core.wicket.more.markup.repeater.sequence.SequenceView;
import fr.openwide.core.wicket.more.model.ReadOnlyMapModel;
public abstract class MapView<K, V> extends SequenceView<K> {
private static final long serialVersionUID = 1L;
public MapView(String id, IMapModel<K, V, ?> mapModel) {
super(id, mapModel);
setDefaultModel(mapModel);
}
/**
* Creates a {@link ReadOnlyMapModel read-only} view on the given model, using the given factory for generating
* key models.
*/
@SuppressWarnings("unchecked")
public MapView(String id, IModel<? extends Map<K, V>> mapModel,
Function<? super K, ? extends IModel<K>> keyModelFactory) {
this(id, mapModel instanceof IMapModel ?
(IMapModel<K, V, ?>) mapModel : ReadOnlyMapModel.of(mapModel, keyModelFactory));
}
@Override
@SuppressWarnings("unchecked")
protected final void populateItem(Item<K> item) {
populateItem((MapItem<K, V>)item);
}
protected abstract void populateItem(MapItem<K, V> item);
@SuppressWarnings("unchecked") // The sequence provider is known to be a IMapModel, see constructor
public IMapModel<K, V, ?> getModel() {
return (IMapModel<K, V, ?>) getSequenceProvider();
}
@Override
protected MapItem<K, V> newItem(String id, int index, IModel<K> model) {
return new MapItem<K, V>(id, index, model, getModel().valueModelForProvidedKeyModel(model));
}
}