Re: Restarting AjaxLazyLoadingPanel

2009-11-13 Thread Ryan O'Hara

Finally got this working by changing the following line of code:


   newPanel.setOutputMarkupId(true);


to :


newPanel.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true);


Hopefully this helps someone.

Ryan

On Nov 12, 2009, at 2:57 PM, rjohara wrote:



We are after the same behavior, as well.  During the initial page  
load, the
AjaxLazyLoadPanel works great.  However, after hiding/showing the  
image
(using an AjaxLink), the panel no longer loads.  I tried using the  
custom
ReloadingAjaxLazyPanel, too, and the results were the same as  
replacing with

a new panel instance.  Any ideas?  Below is a code snippet:

   final Label gbrowseHideShowLabel = new  
Label(gbrowseHideShowLabel,

new LoadableDetachableModel() {
   protected Object load() {
   return gbrowseHideShowText;
   }
   });
   gbrowseHideShowLabel.setOutputMarkupId(true);
   gbrowseLazyLoaded = getNewGbrowseLazyLoaded();
   add(gbrowseLazyLoaded);
   AjaxLink gbrowseHideShow = new AjaxLink(gbrowseHideShow) {
   public void onClick(AjaxRequestTarget target) {
   if (!gbrowseVisible) {
   gbrowseVisible = true;
   gbrowseHideShowText = Hide image;
   user.setImageViewer(true);
   } else {
   gbrowseVisible = false;
   gbrowseHideShowText = Show image;
   user.setImageViewer(false);
   }
   target.addComponent(gbrowseHideShowLabel);
   AjaxLazyLoadPanel newPanel = getNewGbrowseLazyLoaded();
   newPanel.setOutputMarkupId(true);
   getGbrowseLazyLoaded().replaceWith(newPanel);
   setGbrowseLazyLoaded(newPanel);
   target.addComponent(newPanel);
   }
   };
   gbrowseHideShow.add(gbrowseHideShowLabel);
   add(gbrowseHideShow);

Thanks,
Ryan


igor.vaynberg wrote:


you can just replace the entire panel with a new instance.

-igor

On Sat, May 30, 2009 at 3:11 AM, Antony Stubbs antony.stu...@gmail.com 


wrote:
We use AjaxLazyLoadingPanel, and want to be able to trigger the  
process

of
showing the indicator, and requesting the panels contents with a  
separate
Ajax request, after the first complete render has finished. I.e.  
do the
whole process over and over, without having to reload the entire  
page.


I came up with this, which I was surprised actually worked first  
try :)

gotta love Wicket.

But perhaps there's a better way to do it ? A simpler way?  
Something I'm

missing? I tried simply replacing the lazy loading panel with a new
instance
of one but that didn't seem to have an effect - I think the magic  
is in

the
adding a new AbstractAjaxBehaviour on each request.


import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import  
org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;

import org.apache.wicket.markup.html.IHeaderResponse;

/**
 * An {...@link AjaxLazyLoadPanel} extension which allows it to
 * {...@link #restart(AjaxRequestTarget)} the process of showing the  
loading

 * indicator, then load it's contents using a separate Ajax request.
 *
 * @author Antony Stubbs
 */
abstract public class ReloadingAjaxLazyPanel extends  
AjaxLazyLoadPanel {


   private static final long serialVersionUID = 1L;

   public ReloadingAjaxLazyPanel(String id) {
   super( id );
   }

   /**
* Causes the {...@link AjaxLazyLoadPanel} to re-display the loading
indicator,
* then in a seperate ajax request, get it's contents.
*
* @param target
*/
   public void restart(AjaxRequestTarget target) {
   target.addComponent( this );

   // replace panel contents with loading icon
   Component loadingComponent =  
getLoadingComponent( content );


   this.replace( loadingComponent );

   // add ajax behaviour to install call back
   loadingComponent.add( new AbstractDefaultAjaxBehavior() {

   private static final long serialVersionUID = 1L;

   @Override
   protected void respond(AjaxRequestTarget target) {
   Component component =
ReloadingAjaxLazyPanel.this.getLazyLoadComponent( content );
   ReloadingAjaxLazyPanel.this.replace(
component.setRenderBodyOnly( true ) );
   target.addComponent( ReloadingAjaxLazyPanel.this );
   // setState((byte)2);
   }

   @Override
   public void renderHead(IHeaderResponse response) {
   super.renderHead( response );
   response.renderOnDomReadyJavascript(
getCallbackScript().toString() );
   }

   } );
   }

}

As you can see, there is duplication from AjaxLazyLoadingPanel -  
which

would
need re-factoring in order to remove. - no problem there.
But also, because the setState method is private, I can't use that  
state

Re: Restarting AjaxLazyLoadingPanel

2009-11-12 Thread rjohara

We are after the same behavior, as well.  During the initial page load, the
AjaxLazyLoadPanel works great.  However, after hiding/showing the image
(using an AjaxLink), the panel no longer loads.  I tried using the custom
ReloadingAjaxLazyPanel, too, and the results were the same as replacing with
a new panel instance.  Any ideas?  Below is a code snippet:

final Label gbrowseHideShowLabel = new Label(gbrowseHideShowLabel,
new LoadableDetachableModel() {
protected Object load() {
return gbrowseHideShowText;
}
});
gbrowseHideShowLabel.setOutputMarkupId(true);
gbrowseLazyLoaded = getNewGbrowseLazyLoaded();
add(gbrowseLazyLoaded);
AjaxLink gbrowseHideShow = new AjaxLink(gbrowseHideShow) {
public void onClick(AjaxRequestTarget target) {
if (!gbrowseVisible) {
gbrowseVisible = true;
gbrowseHideShowText = Hide image;
user.setImageViewer(true);
} else {
gbrowseVisible = false;
gbrowseHideShowText = Show image;
user.setImageViewer(false);
}
target.addComponent(gbrowseHideShowLabel);
AjaxLazyLoadPanel newPanel = getNewGbrowseLazyLoaded();
newPanel.setOutputMarkupId(true);
getGbrowseLazyLoaded().replaceWith(newPanel);
setGbrowseLazyLoaded(newPanel);
target.addComponent(newPanel);
}
};
gbrowseHideShow.add(gbrowseHideShowLabel);
add(gbrowseHideShow);

Thanks,
Ryan


igor.vaynberg wrote:
 
 you can just replace the entire panel with a new instance.
 
 -igor
 
 On Sat, May 30, 2009 at 3:11 AM, Antony Stubbs antony.stu...@gmail.com
 wrote:
 We use AjaxLazyLoadingPanel, and want to be able to trigger the process
 of
 showing the indicator, and requesting the panels contents with a separate
 Ajax request, after the first complete render has finished. I.e. do the
 whole process over and over, without having to reload the entire page.

 I came up with this, which I was surprised actually worked first try :)
 gotta love Wicket.

 But perhaps there's a better way to do it ? A simpler way? Something I'm
 missing? I tried simply replacing the lazy loading panel with a new
 instance
 of one but that didn't seem to have an effect - I think the magic is in
 the
 adding a new AbstractAjaxBehaviour on each request.


 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
 import org.apache.wicket.markup.html.IHeaderResponse;

 /**
  * An {...@link AjaxLazyLoadPanel} extension which allows it to
  * {...@link #restart(AjaxRequestTarget)} the process of showing the loading
  * indicator, then load it's contents using a separate Ajax request.
  *
  * @author Antony Stubbs
  */
 abstract public class ReloadingAjaxLazyPanel extends AjaxLazyLoadPanel {

    private static final long serialVersionUID = 1L;

    public ReloadingAjaxLazyPanel(String id) {
        super( id );
    }

    /**
     * Causes the {...@link AjaxLazyLoadPanel} to re-display the loading
 indicator,
     * then in a seperate ajax request, get it's contents.
     *
     * @param target
     */
    public void restart(AjaxRequestTarget target) {
        target.addComponent( this );

        // replace panel contents with loading icon
        Component loadingComponent = getLoadingComponent( content );

        this.replace( loadingComponent );

        // add ajax behaviour to install call back
        loadingComponent.add( new AbstractDefaultAjaxBehavior() {

            private static final long serialVersionUID = 1L;

           �...@override
            protected void respond(AjaxRequestTarget target) {
                Component component =
 ReloadingAjaxLazyPanel.this.getLazyLoadComponent( content );
                ReloadingAjaxLazyPanel.this.replace(
 component.setRenderBodyOnly( true ) );
                target.addComponent( ReloadingAjaxLazyPanel.this );
                // setState((byte)2);
            }

           �...@override
            public void renderHead(IHeaderResponse response) {
                super.renderHead( response );
                response.renderOnDomReadyJavascript(
 getCallbackScript().toString() );
            }

        } );
    }

 }

 As you can see, there is duplication from AjaxLazyLoadingPanel - which
 would
 need re-factoring in order to remove. - no problem there.
 But also, because the setState method is private, I can't use that state
 system.

 Regards,
 Antony Stubbs,
 NZ
 http://friendfeed.com/astubbs


 
 -
 To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
 For additional commands, 

Re: Restarting AjaxLazyLoadingPanel

2009-05-30 Thread Igor Vaynberg
you can just replace the entire panel with a new instance.

-igor

On Sat, May 30, 2009 at 3:11 AM, Antony Stubbs antony.stu...@gmail.com wrote:
 We use AjaxLazyLoadingPanel, and want to be able to trigger the process of
 showing the indicator, and requesting the panels contents with a separate
 Ajax request, after the first complete render has finished. I.e. do the
 whole process over and over, without having to reload the entire page.

 I came up with this, which I was surprised actually worked first try :)
 gotta love Wicket.

 But perhaps there's a better way to do it ? A simpler way? Something I'm
 missing? I tried simply replacing the lazy loading panel with a new instance
 of one but that didn't seem to have an effect - I think the magic is in the
 adding a new AbstractAjaxBehaviour on each request.


 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
 import org.apache.wicket.markup.html.IHeaderResponse;

 /**
  * An {...@link AjaxLazyLoadPanel} extension which allows it to
  * {...@link #restart(AjaxRequestTarget)} the process of showing the loading
  * indicator, then load it's contents using a separate Ajax request.
  *
  * @author Antony Stubbs
  */
 abstract public class ReloadingAjaxLazyPanel extends AjaxLazyLoadPanel {

    private static final long serialVersionUID = 1L;

    public ReloadingAjaxLazyPanel(String id) {
        super( id );
    }

    /**
     * Causes the {...@link AjaxLazyLoadPanel} to re-display the loading
 indicator,
     * then in a seperate ajax request, get it's contents.
     *
     * @param target
     */
    public void restart(AjaxRequestTarget target) {
        target.addComponent( this );

        // replace panel contents with loading icon
        Component loadingComponent = getLoadingComponent( content );

        this.replace( loadingComponent );

        // add ajax behaviour to install call back
        loadingComponent.add( new AbstractDefaultAjaxBehavior() {

            private static final long serialVersionUID = 1L;

           �...@override
            protected void respond(AjaxRequestTarget target) {
                Component component =
 ReloadingAjaxLazyPanel.this.getLazyLoadComponent( content );
                ReloadingAjaxLazyPanel.this.replace(
 component.setRenderBodyOnly( true ) );
                target.addComponent( ReloadingAjaxLazyPanel.this );
                // setState((byte)2);
            }

           �...@override
            public void renderHead(IHeaderResponse response) {
                super.renderHead( response );
                response.renderOnDomReadyJavascript(
 getCallbackScript().toString() );
            }

        } );
    }

 }

 As you can see, there is duplication from AjaxLazyLoadingPanel - which would
 need re-factoring in order to remove. - no problem there.
 But also, because the setState method is private, I can't use that state
 system.

 Regards,
 Antony Stubbs,
 NZ
 http://friendfeed.com/astubbs



-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org



Re: Restarting AjaxLazyLoadingPanel

2009-05-30 Thread Antony Stubbs
Yeah that's what I thought. And I tried it, but visually nothing  
happened. I'll give it another shot.


Sent from my iPhone
http://friendfeed.com/astubbs

On 31/05/2009, at 7:15 AM, Igor Vaynberg igor.vaynb...@gmail.com  
wrote:



you can just replace the entire panel with a new instance.

-igor

On Sat, May 30, 2009 at 3:11 AM, Antony Stubbs antony.stu...@gmail.com 
 wrote:
We use AjaxLazyLoadingPanel, and want to be able to trigger the  
process of
showing the indicator, and requesting the panels contents with a  
separate
Ajax request, after the first complete render has finished. I.e. do  
the
whole process over and over, without having to reload the entire  
page.


I came up with this, which I was surprised actually worked first  
try :)

gotta love Wicket.

But perhaps there's a better way to do it ? A simpler way?  
Something I'm
missing? I tried simply replacing the lazy loading panel with a new  
instance
of one but that didn't seem to have an effect - I think the magic  
is in the

adding a new AbstractAjaxBehaviour on each request.


import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import  
org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;

import org.apache.wicket.markup.html.IHeaderResponse;

/**
 * An {...@link AjaxLazyLoadPanel} extension which allows it to
 * {...@link #restart(AjaxRequestTarget)} the process of showing the  
loading

 * indicator, then load it's contents using a separate Ajax request.
 *
 * @author Antony Stubbs
 */
abstract public class ReloadingAjaxLazyPanel extends  
AjaxLazyLoadPanel {


   private static final long serialVersionUID = 1L;

   public ReloadingAjaxLazyPanel(String id) {
   super( id );
   }

   /**
* Causes the {...@link AjaxLazyLoadPanel} to re-display the loading
indicator,
* then in a seperate ajax request, get it's contents.
*
* @param target
*/
   public void restart(AjaxRequestTarget target) {
   target.addComponent( this );

   // replace panel contents with loading icon
   Component loadingComponent = getLoadingComponent( content );

   this.replace( loadingComponent );

   // add ajax behaviour to install call back
   loadingComponent.add( new AbstractDefaultAjaxBehavior() {

   private static final long serialVersionUID = 1L;

   @Override
   protected void respond(AjaxRequestTarget target) {
   Component component =
ReloadingAjaxLazyPanel.this.getLazyLoadComponent( content );
   ReloadingAjaxLazyPanel.this.replace(
component.setRenderBodyOnly( true ) );
   target.addComponent( ReloadingAjaxLazyPanel.this );
   // setState((byte)2);
   }

   @Override
   public void renderHead(IHeaderResponse response) {
   super.renderHead( response );
   response.renderOnDomReadyJavascript(
getCallbackScript().toString() );
   }

   } );
   }

}

As you can see, there is duplication from AjaxLazyLoadingPanel -  
which would

need re-factoring in order to remove. - no problem there.
But also, because the setState method is private, I can't use that  
state

system.

Regards,
Antony Stubbs,
NZ
http://friendfeed.com/astubbs




-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org



-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org