package de.flower.common.ui.ajax.behavior; import de.flower.common.ui.js.JQuery; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.ComponentTag; /** * Behavior can be used to fade in / fade out panels. * * @author flowerrrr */ public class AjaxSlideToggleBehavior extends Behavior { private Component c; /** * If component should be faded in its visibility is set to true but the component must be * rendered with display: none. */ private boolean beforeFadeIn; @Override public void bind(final Component component) { this.c = component; component.setOutputMarkupPlaceholderTag(true); component.setVisible(false); // component.add(AttributeModifier.append("style", component.isVisible() ? "" : "display:none")); } public void show(AjaxRequestTarget target) { c.setVisible(true); beforeFadeIn = true; target.add(c); target.appendJavaScript(getSlideDownJS()); } @Override public void onComponentTag(final Component component, final ComponentTag tag) { super.onComponentTag(component, tag); if (beforeFadeIn) { tag.put("style", "display: none;"); beforeFadeIn = false; } } public final void hide(AjaxRequestTarget target) { c.setVisible(false); // use undocumented wicket feature to delay other ajax processing steps until animation completes. // see wicket-ajax.js#processEvaluation() String identifier = "processNext"; String code = JQuery.slideUp(c, "slow", identifier + "()"); target.prependJavaScript(identifier + "|" + code); target.add(c); onHide(target); } private CharSequence getSlideDownJS() { return JQuery.slideDown(c, "slow"); } public void onHide(AjaxRequestTarget target) { ; } }