On 2013-11-20 09:28, Martin Grigorov wrote: > Hi, > > On Wed, Nov 20, 2013 at 1:30 AM, Marcin Zajączkowski <msz...@wp.pl> wrote: > >> On 2013-11-19 08:44, Martin Grigorov wrote: >>> Hi, >>> >>> I think you can use IModel<String> for the dropdown. This will be the >>> country code. >>> The transformation from id to name and back (if needed) can be moved to a >>> custom IChoiceRenderer. There you have access to the current locale for >>> each rendering. >>> CountryChoiceRenderer can delegate the actual work to >>> CountryDatabase/CountryProvider/... >> >> Thanks Martin for your reply! >> >> Using your suggestions I was able to simplify the Wicket code to two >> classes: a custom DropDownChoice and a renderer. As a drawback I had to >> optimize/cache query in my service returning country name by ID/code. >> >> One thing is not clear for me. How can I get a current locale in >> CountryChoiceRenderer (without pass it from my DropDownChoice component)? >> > > To have the locale passed to you you can use custom IConverter. > 1) DropDownChoice<Country> > 2) CountryChoiceRenderer that returns the country id for #getIdValue() and > the country name for #getDisplayValue() > 3) override DropDownChoice#getConverter (or register a global converter) > that looks up a Country by its id
Thanks Martin for your explanation. Marcin >>> On Tue, Nov 19, 2013 at 12:51 AM, Marcin Zajączkowski <msz...@wp.pl> >> wrote: >>> >>>> Hi, >>>> >>>> Working on Wicket frontend for AppFuse I had to implement a drop down >>>> choice of countries. I did it, but don't like the solution and I wonder >>>> if it could be done easier/prettier? >>>> >>>> Issues: >>>> 1. In domain model there is a country represented as a String field (a >>>> country code) in an address class. In my Wicket component I wanted to >>>> use a Country class with a code and name. It forced me to create >>>> CountryDropDownChoice component which embed String model into Country >>>> model(with EmbeddedCountryModel): >>>> >>>> public class CountryDropDownChoice extends DropDownChoice<Country> { >>>> public CountryDropDownChoice(String id, PropertyModel<String> >>>> country, Locale locale) { >>>> super(id, new EmbeddedCountryModel(country, locale), new >>>> CountriesModel(locale), new ChoiceRenderer<>("name", "locale")); >>>> } >>>> } >>>> >>>> with a call in my panel/fragment: >>>> add(new CountryDropDownChoice("country", new >>>> PropertyModel<String>(getDefaultModel(), "country"), getLocale())); >>>> >>>> 2. I would like to have country names depending on current user locales. >>>> I don't have access to Session in a model and there for I needed to pass >>>> current locale to both models (they call CountryService implemented as >>>> String bean using given locale). Could it be simplified? >>>> >>>> My files: >>>> >>>> >> https://gist.github.com/szpak/b5c5ae36e7d170f3676c#file-countrydropdownchoice-java >>>> >> https://gist.github.com/szpak/b5c5ae36e7d170f3676c#file-countriesmodel-java >>>> >>>> >> https://gist.github.com/szpak/b5c5ae36e7d170f3676c#file-embeddedcountrymodel-java >>>> https://gist.github.com/szpak/b5c5ae36e7d170f3676c#file-country-java >>>> >>>> >> https://gist.github.com/szpak/b5c5ae36e7d170f3676c#file-usereditpanel-java-L19 >>>> >>>> >> https://gist.github.com/szpak/b5c5ae36e7d170f3676c#file-javalocalecountryservice-java >>>> >>>> Thanks in advance >>>> Marcin >> >> -- >> http://blog.solidsoft.info/ - Working code is not enough >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org >> For additional commands, e-mail: users-h...@wicket.apache.org >> >> > -- http://blog.solidsoft.info/ - Working code is not enough --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org