Does this feel right?
new Model(defaultMinimumValue())

What happens if the model object changes? How do you propagate the new 
value to form components?

-Matej

Janne Hietamäki wrote:
> This mail is originally from wicket-user, but I reply here to get  
> more attention.
> 
> This looks pretty elegant way to do the thing. Any objections before  
> I commit this into the trunk?
> 
> Janne
> 
> On Sep 23, 2006, at 4:50 PM, Joni Freeman wrote:
> 
>> Some months ago there were discussion about how to use immutable value
>> objects in wicket. See:
>> http://thread.gmane.org/gmane.comp.java.wicket.user/12887/focus=12887
>>
>> The conclusion was that wicket does not support well such a case
>> currently (http://article.gmane.org/gmane.comp.java.wicket.user/ 
>> 12911).
>> However, I think there may be pretty easy way to solve the issue.
>> Provide a FormComponent which can use associated markup file, just  
>> like
>> a Panel:
>>
>> public abstract class CompoundFormComponent extends FormComponent
>> {
>>     private boolean wasOpenCloseTag = false;
>>
>>     public CompoundFormComponent(String id)
>>     {
>>         super(id);
>>     }
>>
>>     public CompoundFormComponent(String id, IModel model)
>>     {
>>         super(id, model);
>>     }
>>
>>     @Override
>>     public abstract void updateModel();
>>
>>     @Override
>>     protected void onComponentTag(final ComponentTag tag)
>>     {
>>         if (tag.isOpenClose())
>>         {
>>             this.wasOpenCloseTag = true;
>>
>>             // Convert <span wicket:id="myPanel" /> into
>>             // <span wicket:id="myPanel">...</span>
>>             tag.setType(XmlTag.OPEN);
>>         }
>>         super.onComponentTag(tag);
>>     }
>>
>>     @Override
>>     protected void onComponentTagBody(final MarkupStream markupStream,
>> final ComponentTag openTag)
>>     {
>>         // Render the associated markup
>>         renderAssociatedMarkup("panel",
>>                 "Markup for a panel component has to contain part
>> '<wicket:panel>'");
>>
>>         if (this.wasOpenCloseTag == false)
>>         {
>>             // Skip any raw markup in the body
>>             markupStream.skipRawMarkup();
>>         }
>>     }
>> }
>>
>> Note, the methods onComponentTag and onComponentTagBody are copy  
>> pasted
>> from Panel. The method updateModel() is made abstract, this is the  
>> place
>> where the immutable value object is created from convertedInputs of
>> FormComponents. Now, the IntegerRangeField (see the original  
>> thread) can
>> be written simply as:
>>
>> IntegerRangeField.java:
>>
>> public class IntegerRangeField extends CompoundFormComponent {
>>     private final TextField minimum;
>>     private final TextField maximum;
>>
>>     public IntegerRangeField(Form parent, String id,
>> IModel/*<IntegerRange>*/model) {
>>         super(id, model);
>>         minimum = new RequiredTextField("minimum", new
>> Model(defaultMinimumValue()), Integer.class);
>>         maximum = new RequiredTextField("maximum", new
>> Model(defaultMaximumValue()), Integer.class);
>>         add(minimum);
>>         add(maximum);
>>         parent.add(new Validator(this));
>>     }
>>
>>     @Override
>>     public void updateModel() {
>>         setModelObject(new IntegerRange(
>>                 (Integer) minimum.getConvertedInput(),
>>                 (Integer) maximum.getConvertedInput()));
>>     }
>>
>>     private Integer defaultMinimumValue() {
>>         if (rangeValue() == null) {
>>             return null;
>>         }
>>         return rangeValue().getMinimum();
>>     }
>>
>>     private Integer defaultMaximumValue() {
>>         if (rangeValue() == null) {
>>             return null;
>>         }
>>         return rangeValue().getMaximum();
>>     }
>>
>>     private IntegerRange rangeValue() {
>>         return (IntegerRange) getModelObject();
>>     }
>>
>>     public static class Validator extends AbstractFormValidator {
>>         ...
>>     }
>> }
>>
>> IntegerRangeField.html:
>>
>> <?xml version="1.0" encoding="utf-8"?>
>> <wicket:panel>
>> <table cellpadding="0" cellspacing="0" border="0">
>>   <tr>
>>     <td>
>>       <input wicket:id="minimum" type="text" class="text numeric"
>> size="8" />
>>     </td>
>>     <td>&nbsp;-&nbsp;</td>
>>     <td>
>>       <input wicket:id="maximum" type="text" class="text numeric"
>> size="8" />
>>     </td>
>>   </tr>
>> </table>
>> </wicket:panel>
>>
>> I tried this with other immutables too, like DateRanges etc. and the
>> implementation was always straight forward. The original  
>> implementations
>> were much more complex and required deep knowledge of wicket's form
>> processing. It would be great to see something like this in core since
>> the abstract CompoundFormComponent contains copy pasted code from  
>> Panel.
>>
>> Joni
>>
>>
>>
>> ---------------------------------------------------------------------- 
>> ---
>> Take Surveys. Earn Cash. Influence the Future of IT
>> Join SourceForge.net's Techsay panel and you'll get the chance to  
>> share your
>> opinions on IT & business topics through brief surveys -- and earn  
>> cash
>> http://www.techsay.com/default.php? 
>> page=join.php&p=sourceforge&CID=DEVDEV
>> _______________________________________________
>> Wicket-user mailing list
>> Wicket-user@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/wicket-user
> 
> 
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys -- and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Wicket-develop mailing list
> Wicket-develop@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wicket-develop
> 


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Wicket-develop mailing list
Wicket-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-develop

Reply via email to