package fr.openwide.core.wicket.more.markup.html.model;
import java.util.Collection;
import java.util.List;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.lang.Args;
import com.google.common.collect.Lists;
public class ChoicesWrapperModel<T> extends AbstractReadOnlyModel<List<T>> {
private static final long serialVersionUID = -8579290778036203349L;
private boolean selectedObjectForcedInChoices = true;
private IModel<T> selectedObjectModel;
private IModel<? extends Collection<? extends T>> baseChoicesModel;
public ChoicesWrapperModel(IModel<T> selectedObjectModel, IModel<? extends Collection<? extends T>> baseChoicesModel) {
Args.notNull(selectedObjectModel, "selectedObjectModel");
Args.notNull(baseChoicesModel, "baseChoicesModel");
this.selectedObjectModel = selectedObjectModel;
this.baseChoicesModel = baseChoicesModel;
}
@Override
public List<T> getObject() {
List<T> choices = Lists.newArrayList();
Collection<? extends T> baseChoices = baseChoicesModel.getObject();
T selectedObject = selectedObjectModel.getObject();
// Si on force à inclure l'objet sélectionné et qu'il n'est pas dans la liste de choix,
// on l'inclut en premier dans la liste.
if (selectedObjectForcedInChoices && selectedObject != null && !baseChoices.contains(selectedObject)) {
choices.add(selectedObject);
}
choices.addAll(baseChoices);
return choices;
}
public boolean isSelectedObjectForcedInChoices() {
return selectedObjectForcedInChoices;
}
public void setSelectedObjectForcedInChoices(boolean selectedObjectForcedInChoices) {
this.selectedObjectForcedInChoices = selectedObjectForcedInChoices;
}
@Override
public void detach() {
super.detach();
selectedObjectModel.detach();
baseChoicesModel.detach();
}
}