package fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.component; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.Markup; import org.apache.wicket.markup.MarkupFactory; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.wicketstuff.wiquery.core.javascript.JsStatement; import fr.openwide.core.wicket.markup.html.panel.GenericPanel; 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.behavior.ModalOpenOnClickBehavior; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.statement.BootstrapModal; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.statement.BootstrapModalBackdrop; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.statement.BootstrapModalManagerStatement; public abstract class AbstractModalPopupPanel<O> extends GenericPanel<O> implements IModalPopupPanel { private static final long serialVersionUID = -6919950872346297617L; private static final String HEADER_WICKET_ID = "header"; private static final String BODY_WICKET_ID = "body"; private static final String FOOTER_WICKET_ID = "footer"; private final WebMarkupContainer container; private BootstrapModal bootstrapModal; public AbstractModalPopupPanel(String id, IModel<? extends O> model) { super(id, model); setOutputMarkupId(true); // doit être présent dès le début pour le bon fonctionnement de prepareLink container = new WebMarkupContainer("container"); container.setOutputMarkupId(true); container.add(new AttributeAppender("class", getCssClassNamesModel(), " ")); add(container); } /** * @param link * @param options - peut être null */ public void prepareLink(final Component link) { link.add(new ModalOpenOnClickBehavior(this) { private static final long serialVersionUID = 7578810529771850911L; @Override public JsStatement onModalStart() { return AbstractModalPopupPanel.this.onModalStart(); } @Override public JsStatement onModalComplete() { return AbstractModalPopupPanel.this.onModalComplete(); } @Override public JsStatement onModalShow() { return AbstractModalPopupPanel.this.onModalShow(); } @Override public JsStatement onModalHide() { return AbstractModalPopupPanel.this.onModalHide(); } }); } @Override protected void onInitialize() { super.onInitialize(); container.add(createHeader(HEADER_WICKET_ID)); container.add(createBody(BODY_WICKET_ID)); container.add(createFooter(FOOTER_WICKET_ID)); } protected abstract Component createHeader(String wicketId); protected abstract Component createBody(String wicketId); protected abstract Component createFooter(String wicketId); protected final Component getHeader() { return container.get(HEADER_WICKET_ID); } protected final Component getBody() { return container.get(BODY_WICKET_ID); } protected final Component getFooter() { return container.get(FOOTER_WICKET_ID); } @Override public Markup getAssociatedMarkup() { return MarkupFactory.get().getMarkup(this, AbstractModalPopupPanel.class, false); } @Override public String getContainerMarkupId() { return container.getMarkupId(); } @Override public WebMarkupContainer getContainer() { return container; } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(JavaScriptHeaderItem.forReference(BootstrapModalJavaScriptResourceReference.get())); } /** * A surcharger pour personnaliser la classe CSS de la popup. */ protected IModel<String> getCssClassNamesModel() { return Model.of(); } /** * A surcharger au besoin ; code appelé avant tout traitement */ protected JsStatement onModalStart() { return null; } /** * A surcharger au besoin ; code appelé à l'affichage de la popup */ protected 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; } /** * Permet de récupérer le code de fermeture de la popup. */ public JsStatement closeStatement() { return BootstrapModalManagerStatement.hide(getContainer()); } protected void addCancelBehavior(AbstractLink link) { link.add(new AttributeModifier("data-dismiss", "modal")); } public void setBootstrapModal(BootstrapModal bootstrapModal) { this.bootstrapModal = bootstrapModal; } @Override public BootstrapModal getBootstrapModal() { return this.bootstrapModal; } public AbstractModalPopupPanel<O> setStatic() { if (bootstrapModal == null) { bootstrapModal = BootstrapModal.modal(); } bootstrapModal.setKeyboard(false); bootstrapModal.setBackdrop(BootstrapModalBackdrop.STATIC); return this; } }