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

Reply via email to