wicket-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrea Del Bene <an.delb...@gmail.com>
Subject Re: How to make a Wiket DropDownChoice with complex a model return a simple String
Date Thu, 13 Feb 2014 17:32:17 GMT
Your welcome! I will try to publish this snippet somewhere in the guide.

> Thanks Andrea,
>
> I was trying what you sent in your previous  message and I was having
> trouble figuring out how to get the value set on the target property model.
>
> Your code here, especially this line:
>
>         targetModel.setObject(getChoiceRenderer().getIdValue(newSelection,
> choiceIndex));
>
> was really helpful and I was able to get everything working.
>
> Thanks again. 
> Have you ever consider making this available to the Wicket community? I see
> a lot of questions related to DropDownChoice, but not many answers.
>
> - Bruce
>
>
> -----Original Message-----
> From: Andrea Del Bene [mailto:an.delbene@gmail.com] 
> Sent: Wednesday, February 12, 2014 4:31 AM
> To: users@wicket.apache.org
> Subject: Re: How to make a Wiket DropDownChoice with complex a model return
> a simple String
>
> Here is some code of a possible solution:
>
>
> public class DropDownChoiceForString<T> extends DropDownChoice<T> {
>
>     private IModel<String> targetModel;
>
>     public DropDownChoiceForString(String id, IModel<T> model,
> IModel<String> targetModel, List<? extends T> choices,
>             IChoiceRenderer<? super T> renderer) {
>         super(id, model, choices, renderer);
>         this.targetModel = targetModel;
>     }
>
>     protected DropDownChoiceForString(String id, IModel<T> model,
> IModel<String> targetModel) {
>         this(id, model, targetModel, Collections.<T> emptyList(), null);
>     }
>
>     @Override
>     protected void onInitialize() {
>         super.onInitialize();
>         // load the initial choice.
>         setModelObject(convertChoiceIdToChoice(targetModel.getObject()));
>     }
>
>     @Override
>     protected void onDetach() {
>         super.onDetach();
>
>         targetModel.detach();
>     }
>
>     @Override
>     protected void onModelChanged() {
>         super.onModelChanged();
>
>         T newSelection = getModelObject();
>
>         int choiceIndex = getChoices().indexOf(newSelection);
>         // update the string source with the selected value.
>         targetModel.setObject(getChoiceRenderer().getIdValue(newSelection,
> choiceIndex));
>     }
> }
>
>
>
>> Hi,
>>
>> I needed something similar in a couple of projects. One solution is to 
>> create a custom DropDownChoice which takes also the string model to 
>> update. Then you can override onModelChanged to update the string 
>> model with the new value that can be extracted with the ChoiceRenderer.
>>> To make this easier to understand, let's say that I have a list of 
>>> state abbreviations for example AL, AK, AZ, AR etcetera (the actual 
>>> example has two letter abbreviations also, but much longer names). I 
>>> need a DropDownChoice that shows the abbreviations for selection 
>>> (e.g., AK) but will show the full name as a tooltip whenever the 
>>> mouse hovers over one of the choice (e.g., AK shows Alaska).
>>>
>>>  
>>> I have developed a solution that is based on the example presented here:
>>> http://stackoverflow.com/questions/12234738/wicket-dropdownchoice-tit
>>> les-too
>>>
>>> ltips-for-options
>>>
>>> that develops a subclass of DropDownChoice and overrides 
>>> appendOptionHtml to append a "title" to the buffer. My class takes a 
>>> StateDisplay object as its model, and the model has two fields, an 
>>> "id" that is displayed in the list, and a "fullName" which is added 
>>> as the title by the appendOptionHtml method.
>>>
>>>  
>>> This works fine for displaying thedropdown with the  tooltip, but the 
>>> problem is that the model is a complex object( StateDisplay) with two 
>>> fields, but the underlying domain object needs a simple String with 
>>> the state ID.
>>>
>>>  
>>> Prior to implementing the tooltip, the DrowdownChoice was formed using:
>>>
>>>  
>>> Item.add(new DropDownChoice<String>("state", new
>>> PropertyModel<String>((CompanyDTO) item.getDefaultModelObject(), 
>>> "state"), stateList)));
>>>
>>>  
>>> Note: "item "is there because this is used in the populateItem method 
>>> of a ListView.
>>>
>>>  
>>> Now the code is:
>>>
>>>  
>>> Model< StateDisplay > selectedState = new Model<>();
>>>
>>>  
>>> ChoiceRenderer<StateDisplay> choiceRenderer = new 
>>> ChoiceRenderer<ModifierDisplayDto>("id", "id");
>>>
>>>                            
>>> Item.add(new StateDropDownChoice< StateDisplay >("state", 
>>> selectedState, stateList, choiceRenderer));
>>>
>>>  
>>> After the selection is made the model (selectedState) is set to the 
>>> chosen StateDisplay, but there is no easy way to the simple String 
>>> value set on the CompanyDTO.
>>>
>>>  
>>> How can I make the dropdown selection update the domain model's 
>>> simple String.
>>>
>>>  
>>> Thanks
>>>
>>> Bruce
>>>
>>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Mime
View raw message