[ https://issues.apache.org/jira/browse/WICKET-2443?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Martin Grigorov resolved WICKET-2443. ------------------------------------- Resolution: Won't Fix > Add specialized components MapDropDownChoice and BeanDropDownChoice, for use > when the values of a drop down choice is backed by a java.util.Map or a > Collection<?> > ------------------------------------------------------------------------------------------------------------------------------------------------------------------ > > Key: WICKET-2443 > URL: https://issues.apache.org/jira/browse/WICKET-2443 > Project: Wicket > Issue Type: New Feature > Components: wicket, wicket-extensions > Affects Versions: 1.4.1 > Reporter: Eirik Lygre > > In working with out first wicket applications, there were two very related > things that turned out to be a lot harder than expected: > 1) We had a business object with a String property, where we needed to create > a drop-down list selecting from a Map<String, String>. > 2) We had a business object with a String property, with a similar drop down > backed by a Bean with "String getKey()" and "String getValue()" > After much googling and many trials, we ended up writing the following > utility classes which I think would be a very useful new feature. > I'm guessing it belongs in either "org.apache.wicket.markup.html.form" or > "org.apache.wicket.extensions.markup.html.form", but will leave that up to > the existing maintainers. > Code for the MapDropDownChoice: > import java.util.ArrayList; > import java.util.Map; > import org.apache.wicket.markup.html.form.ChoiceRenderer; > import org.apache.wicket.markup.html.form.DropDownChoice; > import org.apache.wicket.model.IModel; > /** > * A specialized DropDownChoice that uses a java.util.Map as the source > * of choices (both id and display value). > * > * The type of the model should match the type of the key in the map, > * such that an Integer model would use a Map<Integer,?>. > * > * <p> > * Java: > * > * <pre> > * Map<String,String> countries = new HashMap<String,String>(); > * countries.put ("US", "United States"); > * countries.put ("KG", "Kyrgyzstan"); > * countries.put ("NO", "Norway"); > * countries.put ("VU", "Vanuatu"); > * > * // Expect a form model property of name "country" and type String > * form.add(new MapDropDownChoice<String>("country", countries)); > * </p> > * > * @param <T> Type of model object to bind to. > */ > public class MapDropDownChoice<T> extends DropDownChoice<T> { > public MapDropDownChoice(String id, Map<T, ?> choices) { > super(id, new ArrayList<T>(choices.keySet()), new > MapChoiceRenderer(choices)); > } > public MapDropDownChoice(String id, IModel<T> model, Map<T, ?> choices) { > super(id, model, new ArrayList<T>(choices.keySet()), new > MapChoiceRenderer(choices)); > } > private static class MapChoiceRenderer extends ChoiceRenderer { > private final Map map; > public MapChoiceRenderer(Map map) { > super("value", "key"); > this.map = map; > } > public Object getDisplayValue(Object object) { > Object value = map.get(object); > return value == null ? "" : value.toString(); > } > public String getIdValue(Object object, int index) { > return object == null ? "" : object.toString(); > } > } > } > Code for the BeanDropDownChoice: > import java.util.Collection; > import java.util.HashMap; > import java.util.Map; > import org.apache.wicket.markup.html.form.IChoiceRenderer; > import org.apache.wicket.model.IModel; > /** > * A specialized DropDownChoice that uses a collection of Beans > * as the source of choices (both id and display value). > * > * <p> > * Java: > * > * <pre> > * interface Country { > * String getId(); > * String getName(); > * } > * Collection<Country> countries; > * > * IChoiceRenderer renderer = new ChoiceRenderer<Country>("id", "name"); > * > * // Expect a form model property of name "country" and type String > * form.add(new BeanDropDownChoice<String>("country", countries, renderer)); > * </p> > * > * @param <T> Type of model object to bind to. > */ > public class BeanDropDownChoice<T> extends MapDropDownChoice<T> { > public BeanDropDownChoice(String id, Collection choices, IChoiceRenderer > renderer) { > super(id, createMap(choices, renderer)); > } > public BeanDropDownChoice(String id, IModel<T> model, Collection choices, > IChoiceRenderer renderer) { > super(id, model, createMap(choices, renderer)); > } > static Map createMap(Collection choices, IChoiceRenderer renderer) { > Map map = new HashMap(); > for (Object choice : choices) { > map.put(renderer.getIdValue(choice, -1), > renderer.getDisplayValue(choice)); > } > return map; > } > } -- This message was sent by Atlassian JIRA (v6.1.4#6159)