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