Hello, Wicket team and Wicket users. We broke our mind this week while trying to understand onBeforeRender behavior.
Scenario #1: Parent component A overrides onBeforeRender (and sets visibility there) and returns true from callOnBeforeRenderIfNotVisible. Child component B does the same. Then, onBeforeRender always happens on both components regardless any of them is visible or not. Good, but if A calculates isVisible = true then there it is impossible for component B to become visible (well, actually B could set visibility on A but this is very error-prone) so there's no point in invoking onBeforeRender because B won't be rendered. Scenario #2: Parent component A overrides isVisible (and sets visibility there). Child component B overrides isVisible too. Then B onBeforeRender will be called only if A is visible and B is visible. Good, no unnecessary job is done (B won't be processed at all when A is not visible). Scenario #3: Parent component A overrides onBeforeRender and callOnBeforeRenderIfNotVisible (and sets visibility there to FALSE). Child B doesn't override callOnBeforeRenderIfNotVisible and doesn't override isVisible. Then B's onBeforeRender will be called unless B is not visible. Scenario #4: Parent component A overrides isVisible and doesn't use callOnBeforeRenderIfNotVisible. Then, if it visible, all its children are recursively processed, otherwise no before/after rendering happens to them at all. Even if they override callOnBeforeRenderIfNotVisible. That's first confusing point. Javadocs on callOnBeforeRenderIfNotVisible promise us that onBeforeRender will be called even if component is not visible, but it is a lie. onBeforeRender will be called only if (component is visible OR callOnBeforeRenderIfNotVisible returns true) AND onBeforeRender was called on parent. Thoughts: 1) Javadocs on callOnBeforeRenderIfNotVisible are wrong. See above, there are conditions when onBeforeRender on B won't be called even if it returns true from callOnBeforeRenderIfNotVisible. 2) Child behavior depends on parent's. 3) There is no way to set isVisible to FALSE in parent component and avoid processing children (because Wicket requires calling super.onBeforeRender which processes children). I'm thinking about a feature request for this one. This all seems to be very complicated & confusing. I hope my analisys will help to invent better behavior. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
