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 > > >