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 <[email protected]> wrote: > On Tue, Nov 23, 2010 at 11:02 AM, Johan Compagner <[email protected]>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 <[email protected]> >> 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 >> > >> >
