Mhh, this approach is giving me a headache. Sometimes the inner
formcomponent models are not wrapped around the outer formcomponent
compound model returned by the overridden getModel(), but directly
around the parent model instead (which is also a compound one). It's
as if the model is accessed directly from its field instead of via the
overridden property. Can I reliably assume that getModel() is
overridable? Otherwise I should do something in the venue of:

    public DateComponent(String id, IModel model) {
        super(id, model == null ? model : new
CompoundPropertyModel(model));
    }

    protected IModel initModel() {
        return new CompoundPropertyModel(new
PropertyModel(getParent().getModel(), getId()));
    }

TIA.
Cheers,
Carlos

On 4/11/07, Carlos Pita <[EMAIL PROTECTED]> wrote:
> I worked out this easier and cleanse way to wrap the model of the
> outer component:
>
>     public DateComponent(String id) {
>         this(id, null);
>     }
>
>     public DateComponent(String id, IModel model) {
>        super(id, model);
>     }
>
>     public IModel getModel() {
>         return new CompoundPropertyModel(super.getModel());
>     }
>
>     protected IModel initModel() {
>         return new PropertyModel(getParent().getModel(), getId());
>     }
>
> Namely, initModel and getModel work in tandem. If model is initialized
> with null, initModel() will lazy-initialize it as the parent's model
> evaluated in the DateComponent id. In any case (model null initialized
> or not) getModel will wrap the resultant model into a
> CompoundPropertyModel. So inside DateComponent you could create, say,
> a year field simply as new TextField("year").
>
> Cheers,
> Carlos
>
>
>
> On 4/10/07, Igor Vaynberg <[EMAIL PROTECTED]> wrote:
> > looks good without actually running the code :)
> >
> > -igor
> >
> >
> > On 4/9/07, Carlos Pita <[EMAIL PROTECTED] > wrote:
> > >
> > > Well, here is what I've done based on your suggestions. Please review
> > > this and tell me if it can be improved, if you are so kind:
> > >
> > > 1)  An inherited model that looks into the passed model. If it's not
> > > null it returns a propertymodel for the component id a la
> > > CompoundPropertyModel. If it's null it returns a propertymodel for the
> > > parent's model with the full path of the component. So inside my panel
> > > I can add form components as add(new TextField("month",
> > > Integer.class)) independently of the model passed (null or a real
> > > date)
> > >
> > > private class MyModel extends Model implements IComponentInheritedModel {
> > >      ....
> > >         public IWrapModel wrapOnInheritance(Component component) {
> > >             final IModel wrappedModel;
> > >             if (model == null) {
> > >                 IModel parentModel =
> > DatePanel.this.getParent().getModel();
> > >                 String path = DatePanel.this.getParent().getId() + "."
> > > + component.getId();
> > >                 wrappedModel = new PropertyModel(parentModel, path);
> > >             } else {
> > >                 wrappedModel = new PropertyModel(model,
> > component.getId());
> > >             }
> > >             return new AbstractWrapModel() {
> > >                 public IModel getWrappedModel() { return wrappedModel;
> > > }
> > >             };
> > >         }
> > > }
> > >
> > > 2) To have control on when children are really validated and their
> > > models updated:
> > >
> > > public boolean processChildren() { return false; }
> > >
> > > 3) A DatePanel validator that first validate its fields (so they are
> > > converted too) and finally do global validation (validateDate()). Note
> > > that individual validators can do global validation do, depending on
> > > whether the validation was ajax-triggered or not, so validateDate()
> > > will occur depending on the value of the validateDate flag (true for
> > > ajax-validation, false for individual validators during submit
> > > validation). Notice that validateOnNullValue() must return true or
> > > this validator won't be invoked.
> > >
> > >   add(new AbstractValidator() {
> > >             protected void onValidate(IValidatable validatable) {
> > >                 validateDate = false;
> > >                 yearField.validate();
> > >                 monthField.validate ();
> > >                 dayField.validate();
> > >                 validateDate = true;
> > >                 if (!(yearField.hasErrorMessage() ||
> > > monthField.hasErrorMessage() || dayField.hasErrorMessage())) {
> > >                     validateDate();
> > >                 }
> > >             }
> > >             public boolean validateOnNullValue() { return true; }
> > >         });
> > >
> > > 4) updateModel. Just delegate to fields.
> > >
> > >     public void updateModel() {
> > >          dayField.updateModel();
> > >         monthField.updateModel();
> > >         yearField.updateModel();
> > >     }
> > >
> > > Thank you in advance.
> > > Best regards,
> > > Carlos
> > >
> > >
> > -------------------------------------------------------------------------
> > > 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
> > > [EMAIL PROTECTED]
> > > 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-user mailing list
> > [EMAIL PROTECTED]
> > 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-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to