IWontDoAnythingWhenTheComponentIsDisabledBehavior IMASlackerBehavior Martijn
On Wed, Nov 24, 2010 at 5:12 PM, Johan Compagner <jcompag...@gmail.com> wrote: > yes that i did see in 1.5 > but in 1.4 i guess the only thing we can do is just introduce that > IIgnoreDisabledComponentBehavior interface (that doesnt have any > method) > > (or something the same with a different name, any recomendations?) > > johan > > > On Wed, Nov 24, 2010 at 16:57, Igor Vaynberg <igor.vaynb...@gmail.com> wrote: >> i added boolean canCallListenerInterface(Component component) to ibehavior >> >> -igor >> >> On Wed, Nov 24, 2010 at 12:54 AM, Johan Compagner <jcompag...@gmail.com> >> wrote: >>> which method name? >>> >>> I currently only have a tagging interface that tags this behavior... >>> >>> On Wed, Nov 24, 2010 at 03:00, Igor Vaynberg <igor.vaynb...@gmail.com> >>> wrote: >>>> i just fixed it in trunk. in 1.4 we dont really have a choice but to >>>> add the mixin interface, but can you at least make the method name >>>> match? >>>> >>>> cheers, >>>> -igor >>>> >>>> On Tue, Nov 23, 2010 at 1:04 PM, Johan Compagner <jcompag...@gmail.com> >>>> wrote: >>>>> that i find a big hack >>>>> then i need to have some none visible (in html not in java) label or >>>>> something.. thats horrible then i need to add all kinds of stuff. >>>>> >>>>> I just want that behavior is executed. by a call. that call is not a >>>>> user event (at least not directly) >>>>> it is just (in this example) a resize event that is unrelated to the >>>>> component being disabled. Disabled is just the look in the ui it >>>>> doesnt mean that resizing shouldnt happen >>>>> >>>>> I get that disabled behaviors shouldnt work, i also get that behaviors >>>>> shouldnt work on none visible components (there is no ui) >>>>> but disabled components is just a visual thing. that doesnt mean that >>>>> really all events are also disabled. >>>>> >>>>> for example in Swing on a button yes the click event (ActionListenter) >>>>> is disabled but a ComponentListener (add/remove) still will work >>>>> fine.. >>>>> >>>>> johan >>>>> >>>>> >>>>> On Tue, Nov 23, 2010 at 21:52, Martin Grigorov <mgrigo...@apache.org> >>>>> wrote: >>>>>> On Tue, Nov 23, 2010 at 11:02 AM, Johan Compagner >>>>>> <jcompag...@gmail.com>wrote: >>>>>> >>>>>>> i am currently using this patch for our wicket code so that we can move >>>>>>> on.. >>>>>>> >>>>>>> >>>>>>> First check is that if it is an ajax request for that behavior then >>>>>>> just throw an abort exception.. >>>>>>> Dont just return null because the constantly a full page render is >>>>>>> done instead of the ajax behavior request. >>>>>>> >>>>>>> Second is that i introduced an tagging interface so that behaviors can >>>>>>> make them self work for disabled components if they want to. >>>>>>> >>>>>>> anybody a better idea? >>>>>>> >>>>>> What about adding a companion component for the resize logic ? I.e. the >>>>>> ListView will be disabled, but the companion component will fire and >>>>>> repaint >>>>>> the ListView if necessary. This way you explicitly say that you want to >>>>>> modify disabled component. >>>>>> >>>>>>> >>>>>>> johan >>>>>>> >>>>>>> ### Eclipse Workspace Patch 1.0 >>>>>>> #P wicket >>>>>>> Index: >>>>>>> src/main/java/org/apache/wicket/behavior/IIgnoreDisabledComponentBehavior.java >>>>>>> =================================================================== >>>>>>> --- >>>>>>> src/main/java/org/apache/wicket/behavior/IIgnoreDisabledComponentBehavior.java >>>>>>> (revision >>>>>>> 0) >>>>>>> +++ >>>>>>> src/main/java/org/apache/wicket/behavior/IIgnoreDisabledComponentBehavior.java >>>>>>> (revision >>>>>>> 0) >>>>>>> @@ -0,0 +1,28 @@ >>>>>>> +/* >>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more >>>>>>> + * contributor license agreements. See the NOTICE file distributed >>>>>>> with >>>>>>> + * this work for additional information regarding copyright ownership. >>>>>>> + * The ASF licenses this file to You under the Apache License, Version >>>>>>> 2.0 >>>>>>> + * (the "License"); you may not use this file except in compliance with >>>>>>> + * the License. You may obtain a copy of the License at >>>>>>> + * >>>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 >>>>>>> + * >>>>>>> + * Unless required by applicable law or agreed to in writing, software >>>>>>> + * distributed under the License is distributed on an "AS IS" BASIS, >>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>>>>> implied. >>>>>>> + * See the License for the specific language governing permissions and >>>>>>> + * limitations under the License. >>>>>>> + */ >>>>>>> +package org.apache.wicket.behavior; >>>>>>> + >>>>>>> +/** >>>>>>> + * Interface that can be used to tag behaviors where response should >>>>>>> be called on even if the >>>>>>> + * component is disabled. >>>>>>> + * >>>>>>> + * @author jcompagner >>>>>>> + */ >>>>>>> +public interface IIgnoreDisabledComponentBehavior extends IBehavior >>>>>>> +{ >>>>>>> + >>>>>>> +} >>>>>>> Index: >>>>>>> src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java >>>>>>> =================================================================== >>>>>>> --- >>>>>>> src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java >>>>>>> (revision >>>>>>> 1033481) >>>>>>> +++ >>>>>>> src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java >>>>>>> (working >>>>>>> copy) >>>>>>> @@ -18,13 +18,16 @@ >>>>>>> >>>>>>> import java.util.List; >>>>>>> >>>>>>> +import org.apache.wicket.AbortException; >>>>>>> import org.apache.wicket.Component; >>>>>>> import org.apache.wicket.Page; >>>>>>> import org.apache.wicket.RequestCycle; >>>>>>> import org.apache.wicket.RequestListenerInterface; >>>>>>> import org.apache.wicket.behavior.IBehavior; >>>>>>> import org.apache.wicket.behavior.IBehaviorListener; >>>>>>> +import org.apache.wicket.behavior.IIgnoreDisabledComponentBehavior; >>>>>>> import org.apache.wicket.protocol.http.PageExpiredException; >>>>>>> +import org.apache.wicket.protocol.http.WebRequest; >>>>>>> import org.apache.wicket.request.RequestParameters; >>>>>>> import org.slf4j.Logger; >>>>>>> import org.slf4j.LoggerFactory; >>>>>>> @@ -85,13 +88,6 @@ >>>>>>> // Get the IBehavior for the component based on the >>>>>>> request >>>>>>> parameters >>>>>>> final Component component = getTarget(); >>>>>>> >>>>>>> - if (!component.isVisibleInHierarchy() || >>>>>>> !component.isEnabledInHierarchy()) >>>>>>> - { >>>>>>> - // ignore this request >>>>>>> - logger.warn("component not enabled or visible; >>>>>>> ignoring call. >>>>>>> Component: {}", component); >>>>>>> - return; >>>>>>> - } >>>>>>> - >>>>>>> final String id = getRequestParameters().getBehaviorId(); >>>>>>> if (id == null) >>>>>>> { >>>>>>> @@ -124,6 +120,11 @@ >>>>>>> logger.warn( >>>>>>> "behavior not enabled; >>>>>>> ignoring call. behavior: {} at index: {} >>>>>>> on component: {}", >>>>>>> new Object[] { behavior, >>>>>>> idAsInt, component }); >>>>>>> + if (requestCycle.getRequest() >>>>>>> instanceof WebRequest && >>>>>>> + >>>>>>> ((WebRequest)requestCycle.getRequest()).isAjax()) >>>>>>> + { >>>>>>> + throw new >>>>>>> AbortException(); >>>>>>> + } >>>>>>> return; >>>>>>> } >>>>>>> >>>>>>> @@ -138,6 +139,20 @@ >>>>>>> "; Component: " + component.toString()); >>>>>>> } >>>>>>> >>>>>>> + if (!component.isVisibleInHierarchy() || >>>>>>> + (!(behaviorListener instanceof >>>>>>> IIgnoreDisabledComponentBehavior) >>>>>>> && !component.isEnabledInHierarchy())) >>>>>>> + { >>>>>>> + // ignore this request >>>>>>> + logger.warn("component not enabled or visible; >>>>>>> ignoring call. >>>>>>> Component: {}", component); >>>>>>> + if (requestCycle.getRequest() instanceof >>>>>>> WebRequest >>>>>>> && >>>>>>> + >>>>>>> ((WebRequest)requestCycle.getRequest()).isAjax()) >>>>>>> + { >>>>>>> + throw new AbortException(); >>>>>>> + } >>>>>>> + return; >>>>>>> + } >>>>>>> + >>>>>>> + >>>>>>> // Invoke the interface method >>>>>>> behaviorListener.onRequest(); >>>>>>> } >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Tue, Nov 23, 2010 at 09:42, Johan Compagner <jcompag...@gmail.com> >>>>>>> wrote: >>>>>>> > hi, >>>>>>> > >>>>>>> > i suddenly bump big time into this issue that is fixed. >>>>>>> > ( https://issues.apache.org/jira/browse/WICKET-3098 ) >>>>>>> > >>>>>>> > I get that disabled behaviors can't be used to do respond, because >>>>>>> > that behavior shouldnt be rendered in the first place. >>>>>>> > >>>>>>> > But the fix also goes one step deeper... It also blocks if the >>>>>>> > component is disabled.. That is a big problem >>>>>>> > >>>>>>> > Because a disabled component is rendered, and all the behaviors are >>>>>>> > accepted and rendered also so now suddenly a behavior is rendered >>>>>>> > (because the behavior is not disabled) >>>>>>> > but a callback will fail... >>>>>>> > >>>>>>> > thats something i dont like...because now i get loads of these in the >>>>>>> log: >>>>>>> > >>>>>>> > 2010-11-23 09:10:57,934 WARN [http-8080-1] >>>>>>> > org.apache.wicket.request.target.component.listener.BehaviorRequestTarget >>>>>>> > - component not enabled or visible; ignoring call. Component: >>>>>>> > [MarkupContainer [Component id = View]] >>>>>>> > >>>>>>> > >>>>>>> > and the worse thing is if the behavior blocks like that it fall backs >>>>>>> > to a IRedirectListener so it rerenders the whole page and that again >>>>>>> > renders the disabled component with its behavior and it starts all >>>>>>> > over again and again and again. >>>>>>> > >>>>>>> > the example i have here is that we have a ListView/Repeater with some >>>>>>> > paging component and that listview has a behavior attached that does a >>>>>>> > call back when it got first rendered to give us back the sizes it has >>>>>>> > in the browser >>>>>>> > and if we see that it has way more space then it currently shows (if >>>>>>> > it now shows 10 rows and it has space for 20) we rerender the ListView >>>>>>> > again but then with a bigger visible row count. >>>>>>> > that is a behavior of the ListView, but the listview can be in a >>>>>>> > disabled state (because a user first have to press a button of "edit" >>>>>>> > or something like that) but that resizing i still want to happen if if >>>>>>> > the ListView is disabled... >>>>>>> > >>>>>>> > So i like to some how tell that that this behavior should be called. >>>>>>> > Now we do this: >>>>>>> > >>>>>>> > >>>>>>> > test component enablement >>>>>>> > test behavior id >>>>>>> > test behaviors >>>>>>> > test behaviors enabledment. >>>>>>> > call behavior >>>>>>> > >>>>>>> > i like to turn that around >>>>>>> > >>>>>>> > test behavior id >>>>>>> > test behaviors >>>>>>> > test behaviors enabledment. >>>>>>> > test component enablement IF behavior doesnt implement >>>>>>> IWorkForDisabledComponent >>>>>>> > call behavior >>>>>>> > >>>>>>> > So that a developer can be explicit in that check.. >>>>>>> > >>>>>>> > We could also introduce a public method on Component: >>>>>>> > isEnabledFor(IBehavior) which returns defaults its own enable state. >>>>>>> > >>>>>>> > johan >>>>>>> > >>>>>>> >>>>>> >>>>> >>>> >>> >> > -- Become a Wicket expert, learn from the best: http://wicketinaction.com