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 MultipleChoicesWrapperModel<T> extends AbstractReadOnlyModel<List<T>> {
private static final long serialVersionUID = -8579290778036203349L;
private boolean selectedObjectForcedInChoices = false;
private IModel<? extends Collection<? extends T>> selectedObjectCollectionModel;
private IModel<? extends Collection<? extends T>> baseChoicesModel;
public MultipleChoicesWrapperModel(IModel<? extends Collection<? extends T>> selectedObjectCollectionModel, IModel<? extends Collection<? extends T>> baseChoicesModel) {
Args.notNull(selectedObjectCollectionModel, "selectedObjectCollectionModel");
Args.notNull(baseChoicesModel, "baseChoicesModel");
this.selectedObjectCollectionModel = selectedObjectCollectionModel;
this.baseChoicesModel = baseChoicesModel;
}
@Override
public List<T> getObject() {
List<T> choices = Lists.newArrayList();
Collection<? extends T> baseChoices = baseChoicesModel.getObject();
Collection<? extends T> selectedObjectCollection = selectedObjectCollectionModel.getObject();
// Si on force à inclure les objets sélectionnés et qu'ils ne sont pas dans la liste de choix,
// on les inclut en premiers dans la liste.
if (selectedObjectForcedInChoices && selectedObjectCollection != null && baseChoices != null) {
for (T selectedObject : selectedObjectCollection) {
if (!baseChoices.contains(selectedObject)) {
choices.add(selectedObject);
}
}
}
if (baseChoices != null) {
choices.addAll(baseChoices);
}
return choices;
}
public boolean isSelectedObjectForcedInChoices() {
return selectedObjectForcedInChoices;
}
public void setSelectedObjectForcedInChoices(boolean selectedObjectForcedInChoices) {
this.selectedObjectForcedInChoices = selectedObjectForcedInChoices;
}
@Override
public void detach() {
super.detach();
selectedObjectCollectionModel.detach();
baseChoicesModel.detach();
}
}