[
http://issues.apache.org/click/browse/CLK-497?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=11706#action_11706
]
James P Brown commented on CLK-497:
-----------------------------------
Thank you for you prompt reply to my issue. Your way is clearly the right way
to solve this particular issue.
However, since you've opened the door to considering how this is implemented, I
would like to make a couple of observations that might improve the current
design.
I thought that the Field class use of instanceof to determine whether the
parent was of type Form of FieldSet to be limiting in the long-term. If someone
were to create a component that required this behaviour, but was not of either
of those types, they would be unable to take advantage of the code in Field. I
believe FieldSet and Form to be too specific a set of types to model this
behaviour.
My second point, which may solve the previous one, is that I think there would
be value in modifying the design to treat the container behaviour to "push"
down its disabled/readonly state as configurable, AND allow components to block
the push. Perhaps container-like components implement an interface supporting a
method called "cascade" and all components support a method called "block".
The Field class (or any other applicable class) would check the parent
component for the cascade state, and if it is true then check the applicable
disabled/readonly flag. However, if the component has it's block state set to
true, it would never check the parent component.
By default I would make Form and FieldSet casade true and all Fields (or
similar) block false. This would produce the current implementation behaviours.
I believe the advantage of an approach such as this is that if I never want the
container to push its state to its children, I can turn it off. More
importantly, if I want some, but not all, elements of the container to be
disabled/readonly, the components will be able to block the parent behaviour.
For example, If one has a two FieldSets, and a Form all contained in one Parent
FieldSet, but the Form should not be disabled, one could enable the block flag
to true, while setting the parent state dsiabled to true. Since the default
behaviour would be to cascade, the two child FieldSets would be disabled, but
the Form would be enabled.
I think it addresses some of my concerns in the first point because the parent
cascade behaviour could be tied to a new interface, or base type, which any
component could implement or inherit from. However, there would also need to be
some consideration for the isDisabled/isReadonly methods to ensure that a
suitable downcast from Control could be done in all circumstances.
Regards,
James
> FieldSet isDisabled and isReadonly methods broken
> -------------------------------------------------
>
> Key: CLK-497
> URL: http://issues.apache.org/click/browse/CLK-497
> Project: Click
> Issue Type: Bug
> Components: core
> Affects Versions: 2.0.1
> Environment: Windows XP, Java 6
> Reporter: James P Brown
> Attachments: FieldSet_isDisabled_isReadonly_bug.zip
>
>
> The FieldSet is supposed to force its child components to be
> disabled/readonly when it is set to disabled/readonly. I did not observe this
> when I attempted to create a FieldSet with a child component.
> I believe the code to support this is not working as anticipated. The Field
> class has modified methods for isDisabled/isReadonly that specifically check
> if the parent component (i.e. container) is an instanceof FieldSet (or Form,
> which is working AFAIK). The problem is that the design of FieldSet relies on
> an instance of its private inner class FieldSet.InnerContainerField for
> managing those child elements. When I step through the code in debug mode,
> the class instance is of this inner class type (InnerContainerField) not
> FieldSet. Since InnerContainerField is not a type of FieldSet, the subsequent
> logic is ignored.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.