package org.nocket.component.modal;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.head.OnLoadHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.nocket.component.header.jquery.JQueryHelper;
import org.nocket.component.modal.ModalSettings.ButtonDef;
@SuppressWarnings("serial")
public class DMDModalWindow extends AbstractModalWindow {
/**
* Höhe eines Standardheaders
*/
protected static final double MODAL_HEADER_SIZE = 20;
private final WebMarkupContainer content = new WebMarkupContainer("content");
public DMDModalWindow(String id, DMDModalMessagePanel modalPanel) {
this(id);
this.modalPanel = modalPanel;
}
public DMDModalWindow(String id) {
super(id);
/**
* Das ist das Div über das Bootstrap die Anzeige des Panels steuert.
* Hier wird show oder hide als class ergänzt.
*/
WebMarkupContainer divModal = new WebMarkupContainer(
"innerModal") {
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
changeClassTag(tag);
changeStyleTag(tag);
}
private void changeClassTag(ComponentTag tag) {
String css = doShow ? " show" : " hide";
String attribute = tag.getAttribute("class");
tag.put("class", attribute + css);
}
private void changeStyleTag(ComponentTag tag) {
if (dimension == null || !doShow) {
return;
}
/**
* <pre>
* width: 900px; // SET THE WIDTH OF THE MODAL
* margin: -250px 0 0 -450px; // CHANGE MARGINS TO ACCOMODATE THE NEW WIDTH (original = margin: -250px 0 0 -280px;)
* </pre>
*/
int width = (int) dimension.getWidth();
String cssClassWidth = "width: " + width + "px; ";
// TODO blaz02
// The calculation of margin top is buggy. It causes modal
// dialog gets out of the visible
// area of the browser window. Therefore commented out.
// String marginTop = "margin-top: -" + calcHeight() + "px; ";
String marginLeft = "margin-left: -" + (int) (dimension.getWidth() / 2) + "px; ";
// String cssClassMargin = marginTop + marginLeft;
String cssClassMargin = marginLeft;
String attribute = tag.getAttribute("style");
tag.put("style", StringUtils.trimToEmpty(attribute) + " " + cssClassWidth + " " + cssClassMargin);
}
private int calcHeight() {
double height = (dimension.getHeight() + MODAL_HEADER_SIZE) / 2;
return (int) height;
};
@Override
/**
* Austauschen des Panels
*/
protected void onBeforeRender() {
if (doShow) {
addOrReplace(getModalPanel());
}
else {
addOrReplace(content);
}
super.onBeforeRender();
}
};
add(divModal);
setOutputMarkupId(true);
}
public String getModalWindowId() {
return content.getMarkupId();
}
@Override
public void renderHead(IHeaderResponse response) {
if (modalPanel == null) {
return;
}
JQueryHelper.initJQuery(response);
//response.render(CssHeaderItem.forReference(new PackageResourceReference(DMDModalWindow.class, "DMDModalWindow.css")));
response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(DMDModalWindow.class, "DMDModalWindow.js")));
if (doShow) {
String setDimensionToModalFooter = "";
if (dimension != null) {
setDimensionToModalFooter = "dmdModalWindowSetzeHoeheAnModalBody(" + (int) dimension.getHeight() + ", " + 1200 + ");";
}
// Bootstrap macht bei jeder Form einen margin-bottom von 20px.
// Dieses ist in der modalen Box sehr störend und muss per
// Javascript korrigiert werden
response.render(OnDomReadyHeaderItem.forScript("dmdModalWindowKorrigiereFormMargin(); zeigeBlockerWennModalPanelVorhanden(); "
+ setDimensionToModalFooter));
}
else {
response.render(OnLoadHeaderItem.forScript("zeigeBlockerWennModalPanelVorhanden();"));
}
}
@Override
protected void showModalMessagePanel(ModalSettings settings, String defaultTitleKey, ModalCallback callback) {
dimension = null;
DMDModalMessagePanel modalPanel = new DMDModalMessagePanel("content", settings, this, defaultTitleKey);
modalPanel.setCallback(callback);
setModalPanel(modalPanel);
show();
}
@Override
protected void showModalMessagePanel(String title, String defaultTitleKey, String text, ModalCallback callback, ButtonDef... buttonDefs) {
ModalSettings settings = new ModalSettings(title, text, buttonDefs);
showModalMessagePanel(settings, defaultTitleKey, callback);
}
@Override
protected void showModalMessagePanel(String title, String defaultTitleKey, String text, ModalCallback callback, ButtonFlag... buttonFlags) {
ModalSettings settings = new ModalSettings(title, text, buttonFlags);
showModalMessagePanel(settings, defaultTitleKey, callback);
}
@Override
public AbstractModalPanel getNewModalPanel(String id, IModel<String> title) {
return new ModalPanel(id, title, this);
}
}