package fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.behavior; import org.apache.wicket.Component; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.wicketstuff.wiquery.core.events.Event; import org.wicketstuff.wiquery.core.events.MouseEvent; import org.wicketstuff.wiquery.core.javascript.JsScope; import org.wicketstuff.wiquery.core.javascript.JsScopeEvent; import org.wicketstuff.wiquery.core.javascript.JsStatement; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.BootstrapModalJavaScriptResourceReference; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.component.IModalPopupPanel; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.statement.BootstrapModalEvent; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.statement.BootstrapModalManagerStatement; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.util.JQueryAbstractBehavior; public class ModalOpenOnClickBehavior extends JQueryAbstractBehavior { private static final long serialVersionUID = 8188257386595829052L; private final IModalPopupPanel modal; /** * @param modal - le composant qui contient la popup */ public ModalOpenOnClickBehavior(IModalPopupPanel modal) { super(); this.modal = modal; } protected JsStatement getBindClickStatement() { if (!getComponent().isEnabledInHierarchy()) { return null; } Event event = new Event(MouseEvent.CLICK) { private static final long serialVersionUID = 1410592312776274815L; @Override public JsScope callback() { JsStatement jsStatement = new JsStatement(); JsStatement onModalStart = onModalStart(); JsStatement onModalComplete = onModalComplete(); if (onModalStart != null) { jsStatement.append(onModalStart.render(true)); } jsStatement.append(BootstrapModalManagerStatement.show(modal.getContainer(), modal.getBootstrapModal()).render(true)); if (onModalComplete != null) { jsStatement.append(onModalComplete.render(true)); } return JsScope.quickScope(jsStatement); } }; return new JsStatement().$(getComponent()).chain(event); } /** * Code appelé avant tout traitement de l'événement d'affichage. */ public JsStatement onModalStart() { return null; } /** * Code appelé au moment avant de demander l'affichage de la popup. */ public JsStatement onModalComplete() { return null; } /** * Code appelé au moment de l'affichage du popup. */ public JsStatement onModalShow() { return null; } /** * Code appelé quand le popup est caché. */ public JsStatement onModalHide() { return null; } /** * Rend le composant attaché invisible si la popup est invisible */ @Override public void onConfigure(Component component) { super.onConfigure(component); modal.configure(); component.setVisibilityAllowed(modal.determineVisibility()); } @Override public void renderHead(Component component, IHeaderResponse response) { super.renderHead(component, response); response.render(JavaScriptHeaderItem.forReference(BootstrapModalJavaScriptResourceReference.get())); JsStatement bindClickStatement = getBindClickStatement(); if (bindClickStatement != null) { response.render(OnDomReadyHeaderItem.forScript(getBindClickStatement().render())); Event onShow = new Event(BootstrapModalEvent.SHOW) { private static final long serialVersionUID = -5947286377954553132L; @Override public JsScope callback() { return JsScopeEvent.quickScope(onModalShow()); } }; Event onHide = new Event(BootstrapModalEvent.HIDE) { private static final long serialVersionUID = -5947286377954553132L; @Override public JsScope callback() { return JsScopeEvent.quickScope(onModalHide()); } }; // enregistrement des événements onShow et onHide response.render(OnDomReadyHeaderItem.forScript(new JsStatement().$(modal.getContainer()).chain(onShow).render())); response.render(OnDomReadyHeaderItem.forScript(new JsStatement().$(modal.getContainer()).chain(onHide).render())); } } }