package fr.openwide.core.wicket.more.markup.repeater.sequence;
import java.util.Iterator;
import org.apache.wicket.markup.repeater.AbstractPageableView;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.IModel;
import fr.openwide.core.wicket.more.markup.repeater.IRefreshableOnDemandRepeater;
import fr.openwide.core.wicket.more.util.model.SequenceProviders;
public abstract class SequenceView<T> extends AbstractPageableView<T> implements IRefreshableOnDemandRepeater {
private static final long serialVersionUID = 1L;
private final ISequenceProvider<T> sequenceProvider;
public SequenceView(String id, IDataProvider<T> dataProvider) {
this(id, SequenceProviders.forDataProvider(dataProvider));
}
public SequenceView(String id, ISequenceProvider<T> sequenceProvider) {
super(id);
this.sequenceProvider = sequenceProvider;
}
@Override
public void refreshItems() {
onPopulate();
}
@Override
protected void onDetach() {
super.onDetach();
sequenceProvider.detach();
}
@Override
protected Iterator<IModel<T>> getItemModels(long offset, long size) {
return new ExactTypeIterator<IModel<T>>(sequenceProvider.iterator(offset, size));
}
private static class ExactTypeIterator<T> implements Iterator<T> {
private final Iterator<? extends T> delegate;
public ExactTypeIterator(Iterator<? extends T> delegate) {
super();
this.delegate = delegate;
}
@Override
public boolean hasNext() {
return delegate.hasNext();
}
@Override
public T next() {
return delegate.next();
}
@Override
public void remove() {
delegate.remove();
}
}
@Override
protected long internalGetItemCount() {
return sequenceProvider.size();
}
public ISequenceProvider<T> getSequenceProvider() {
return sequenceProvider;
}
}