[
https://issues.apache.org/jira/browse/WICKET-2443?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13054514#comment-13054514
]
Juergen Donnerstag commented on WICKET-2443:
--------------------------------------------
Why does the following not work for MapDDC?
new DropDownChoice<String>("ddc", new ArrayList<String>(choices.keySet()), new
ChoiceRenderer<String>("key", "value"))
and the following for BeanDDC?
new DropDownChoice<Country>("ddc", countries, new
ChoiceRenderer<String>("name", "id"))
> 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-core, 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 is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira