package fr.openwide.core.wicket.more.markup.html.form; import java.util.List; import org.apache.commons.lang3.EnumUtils; import org.apache.wicket.Session; import org.apache.wicket.markup.html.form.EnumChoiceRenderer; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.retzlaff.select2.Select2Settings; import fr.openwide.core.wicket.more.markup.html.select2.GenericSelect2DropDownSingleChoice; import fr.openwide.core.wicket.more.markup.html.select2.util.Select2Utils; import fr.openwide.core.wicket.more.rendering.EnumRenderer; public class EnumDropDownSingleChoice<E extends Enum<E>> extends GenericSelect2DropDownSingleChoice<E> { private static final long serialVersionUID = 6244269987751271782L; public EnumDropDownSingleChoice(String id, IModel<E> model, Class<E> clazz) { this(id, model, Model.ofList(EnumUtils.getEnumList(clazz))); } public EnumDropDownSingleChoice(String id, IModel<E> model, IModel<? extends List<? extends E>> choicesModel) { this(id, model, choicesModel, new ResourceKeyWithParameterEnumChoiceRenderer<E>()); } public EnumDropDownSingleChoice(String id, IModel<E> model, IModel<? extends List<? extends E>> choicesModel, IChoiceRenderer<? super E> renderer) { super(id, model, choicesModel, renderer); } public EnumDropDownSingleChoice(String id, IModel<E> model, Class<E> clazz, IChoiceRenderer<? super E> renderer) { super(id, model, Model.ofList(EnumUtils.getEnumList(clazz)), renderer); } @Override protected void fillSelect2Settings(Select2Settings settings) { super.fillSelect2Settings(settings); Select2Utils.disableSearch(settings); } private static class ResourceKeyWithParameterEnumChoiceRenderer<E extends Enum<E>> extends EnumChoiceRenderer<E> { private static final long serialVersionUID = -5914319140045008140L; @Override public Object getDisplayValue(E object) { // This converter adds the enum value as a model parameter when rendering the resource key, which // enables the rendering of properties of the enum value // (DateEnum.TOMORROW being rendered as "Tomorrow (${date})" with DateEnum implementing getDate(), for instance). return EnumRenderer.get().render(object, Session.get().getLocale()); } } }