That's how I originally approached the issue. However, there's two
problems.

If I return false from isEnabled, the text fields etc. are disabled when
they are rendered. Thus preventing the user from entering any input. By
default, the checkboxes are not checked.

The second issue is that isEnabled is not recursive. That is, disabling
of parent component does not disable child components. Some of the
FormComponents in our form are very complex components. 

I guess that these issues could be solved by making a checkbox to send
onSelectionChanged event (or perhaps by using AjaxCheckbox) and
disabling/enabling the target component (ant its child components):

public class CheckboxController extends CheckBox {
    @Override
    protected void onSelectionChanged(Object newSelection) {
        if ((Boolean) newSelection) {
            toggleChildren(true);
        } else {
            toggleChildren(false);
        }
    }
    
    private void toggleChildren(final boolean b) {
        target.visitChildren(new wicket.Component.IVisitor() {
            public Object component(final Component component) {
                component.setEnabled(b);
                return wicket.Component.IVisitor.CONTINUE_TRAVERSAL;
            }
        });
    }
}

BTW. Wouldn't it be logical if isEnabled were recursive? Or is there
situations where parent component is disabled but some of its children
are enabled?

Joni

On Mon, 2006-07-03 at 09:59 -0700, Eelco Hillenius wrote:
> That all works only for validation - it doesn't prevent components'
> models from being updated, and it is quite a lot of work. An easier
> and better way is to override isEnabled (or isVisible, but isEnabled
> seems better here) and return false if they shouldn't be validated and
> updated. The only catch there is that your checkboxes are not yet
> updated either, so you'll need to call getInput (or getInputAsArray)
> on those checkboxes to get the posted value.
> 
> Eelco
> 
> 
> On 7/3/06, Martijn Dashorst <[EMAIL PROTECTED]> wrote:
> > Why not something like:
> >
> > class MyCustomValidator extends AbstractFormValidator {
> >     private List<StringValidator> validators;
> >     private CheckBox checkbox;
> >     private FormComponent formComponent;
> >
> >     public MyCustomValidator(cb, fc, StringValidator... vs) {
> >         this.checkbox = cb;
> >         this.formComponent = fc;
> >         this.validators = Arrays.asList(vs);
> >     }
> >     public boolean validate(Form form) {
> >         if(checkbox.isChecked) {
> >             for(StringValidator sv : validators) {
> >                 sv.onValidate(formComponent, formComponent.getInput());
> >             }
> >         }
> >     }
> > }
> >
> > Martijn
> >
> > On 7/3/06, Joni Freeman <[EMAIL PROTECTED]> wrote:
> > > The problem with FormValidator is that the individual components
> > > (checkbox + textfields) are still validated with validators
> > > (FormComponent.validateValidators()). My client wants the form to work
> > > so that if the checkbox is not checked, the textfields can contain
> > > invalid data.
> > >
> > > One way to implement this could be by changing the execution order of
> > > validators so that FormValidators are executed before component
> > > validators:
> > >
> > > class MyForm extends Form {
> > >         protected void validate()
> > >         {
> > >                 validateRequired();
> > >                 validateConversion();
> > >                 validateFormValidators();
> > >                 validateValidators();
> > >         }
> > > }
> > >
> > > And then somehow disable the component at special FormValidator if
> > > checkbox is not checked. Maybe this can be done by calling
> > > setEnabled(false) ?
> > >
> > > Joni
> > >
> > > On Mon, 2006-07-03 at 13:33 +0200, Martijn Dashorst wrote:
> > > > You can add form level validation, creating composite validators, and
> > > > add both the checkbox and the field, and the validators for the field
> > > > to your composite validator.
> > > >
> > > > See EqualInputValidator for an example implementation.
> > > >
> > > > Martijn
> > > >
> > > > On 7/3/06, Joni Freeman <[EMAIL PROTECTED]> wrote:
> > > > > I have a curious requirement for a form. When a user submits a form,
> > > > > some of the FormComponents should not be processed at all (for 
> > > > > example,
> > > > > validation should not be done). Each FormComponent has an accompanying
> > > > > checkbox control which determines whether the actual control is
> > > > > activated or not.
> > > > >
> > > > > [ ]    _______ (this text field should not be processed)
> > > > > [X]    _______ (this should be)
> > > > >
> > > > > etc.
> > > > >
> > > > > One way to implement this could be by overriding Form.validate().
> > > > > However, it seems tedious and not very elegant, so maybe i'm missing
> > > > > something obvious?
> > > > >
> > > > > Joni
> > > > >
> > > > >
> > > > >
> > > > > Using Tomcat but need to do more? Need to support web services, 
> > > > > security?
> > > > > Get stuff done quickly with pre-integrated technology to make your 
> > > > > job easier
> > > > > Download IBM WebSphere Application Server v.1.0.1 based on Apache 
> > > > > Geronimo
> > > > > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> > > > > _______________________________________________
> > > > > Wicket-user mailing list
> > > > > [email protected]
> > > > > https://lists.sourceforge.net/lists/listinfo/wicket-user
> > > > >
> > > >
> > > >
> > >
> > >
> > >
> > > Using Tomcat but need to do more? Need to support web services, security?
> > > Get stuff done quickly with pre-integrated technology to make your job 
> > > easier
> > > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> > > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> > > _______________________________________________
> > > Wicket-user mailing list
> > > [email protected]
> > > https://lists.sourceforge.net/lists/listinfo/wicket-user
> > >
> >
> >
> > --
> > Download Wicket 1.2 now! Write Ajax applications without touching 
> > JavaScript!
> > -- http://wicketframework.org
> >
> > Using Tomcat but need to do more? Need to support web services, security?
> > Get stuff done quickly with pre-integrated technology to make your job 
> > easier
> > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> > _______________________________________________
> > Wicket-user mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/wicket-user
> >
> 
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Wicket-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/wicket-user



Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Wicket-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to