/**
* Called when a null model is about to be retrieved in order to allow a subclass to provide an
* initial model.
* <p>
* By default this implementation looks components in the parent chain owning a
* {@link IComponentInheritedModel} to provide a model for this component via
* {@link IComponentInheritedModel#wrapOnInheritance(Component)}.
* <p>
* For example a {@link FormComponent} has the opportunity to instantiate a model on the fly
* using its {@code id} and the containing {@link Form}'s model, if the form holds a
* {@link CompoundPropertyModel}.
*
* @return The model
*/
protected IModel<?> initModel()
{
IModel<?> foundModel = null;
// Search parents for IComponentInheritedModel (i.e. CompoundPropertyModel)
for (Component current = getParent(); current != null; current = current.getParent())
{
// Get model
// Don't call the getModel() that could initialize many in between
// completely useless models.
// IModel model = current.getDefaultModel();
IModel<?> model = current.getModelImpl();
if (model instanceof IWrapModel && !(model instanceof IComponentInheritedModel))
{
model = ((IWrapModel<?>)model).getWrappedModel();
}
if (model instanceof IComponentInheritedModel)
{
// return the shared inherited
foundModel = ((IComponentInheritedModel<?>)model).wrapOnInheritance(this);
setFlag(FLAG_INHERITABLE_MODEL, true);
break;
}
}
// No model for this component!
return foundModel;
}
public class LazyLoad extends WebPage {
public LazyLoad() {
IColumn[] columns = new IColumn[] {
new PropertyColumn(new Model("col1"), "intValue"),
new PropertyColumn(new Model("col2"), "class") };
ISortableDataProvider dataProvider = new SortableDataProvider() {
public int size() {
return 300000;
}
public IModel model(Object object) {
return new Model((Integer) object);
}
public Iterator iterator(int first, int count) {
return loadEntriesFromDatabase(first, count).iterator();
}
private List<Integer> loadEntriesFromDatabase(int first, int count) {
List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < count; i++) {
items.add(new Integer(first + i));
}
return items;
}
};
DefaultDataTable t = new DefaultDataTable("t", columns, dataProvider, 3);
add(t);
}
}