You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Eirik Lygre (JIRA)" <ji...@apache.org> on 2009/08/30 20:27:32 UTC

[jira] Created: (WICKET-2443) Specialized components MapDropDownChoice, for use when the values of a drop down choice is backed by a java.util.Map or a Collection

Specialized components MapDropDownChoice, 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
    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<T, ?> createMap(Collection choices, IChoiceRenderer renderer) {
        Map<T, ?> map = new HashMap<T, ?>();
        for (Object choice : choices) {
            map.put(renderer.getIdValue(choice, -1), renderer.getDisplayValue(choice));
        }
        return map;
    }
}


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WICKET-2443) 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

Posted by "Eirik Lygre (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-2443?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eirik Lygre updated WICKET-2443:
--------------------------------

    Description: 
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;
    }
}


  was:
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<T, ?> createMap(Collection choices, IChoiceRenderer renderer) {
        Map<T, ?> map = new HashMap<T, ?>();
        for (Object choice : choices) {
            map.put(renderer.getIdValue(choice, -1), renderer.getDisplayValue(choice));
        }
        return map;
    }
}



> 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 is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WICKET-2443) 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

Posted by "Eirik Lygre (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-2443?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eirik Lygre updated WICKET-2443:
--------------------------------

    Comment: was deleted

(was: Issue summary was imprecise. Great start. Fixed. Also set component to both "wicket" and "wicket-extension", even though it surely must be only of them.)

> 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<T, ?> createMap(Collection choices, IChoiceRenderer renderer) {
>         Map<T, ?> map = new HashMap<T, ?>();
>         for (Object choice : choices) {
>             map.put(renderer.getIdValue(choice, -1), renderer.getDisplayValue(choice));
>         }
>         return map;
>     }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WICKET-2443) 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

Posted by "Eirik Lygre (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-2443?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eirik Lygre updated WICKET-2443:
--------------------------------

    Component/s: wicket-extensions
                 wicket
        Summary: 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<?>  (was: Specialized components MapDropDownChoice, for use when the values of a drop down choice is backed by a java.util.Map or a Collection<?>)

Issue summary was imprecise. Great start. Fixed. Also set component to both "wicket" and "wicket-extension", even though it surely must be only of them.

> 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<T, ?> createMap(Collection choices, IChoiceRenderer renderer) {
>         Map<T, ?> map = new HashMap<T, ?>();
>         for (Object choice : choices) {
>             map.put(renderer.getIdValue(choice, -1), renderer.getDisplayValue(choice));
>         }
>         return map;
>     }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.