package de.flower.rmt.ui.page.base;
import de.flower.common.ui.ajax.behavior.test.SeleniumWaitForAjaxSupportBehavior;
import de.flower.common.ui.modal.ModalDialogWindowPanel;
import de.flower.rmt.security.ISecurityService;
import de.flower.rmt.service.IApplicationService;
import de.flower.rmt.ui.app.Resource;
import org.apache.wicket.Application;
import org.apache.wicket.Component;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.devutils.debugbar.DebugBar;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.spring.injection.annot.SpringBean;
/**
* @author flowerrrr
*/
public abstract class AbstractBasePage extends WebPage implements IAjaxIndicatorAware {
@SpringBean
private ISecurityService securityService;
@SpringBean
private IApplicationService applicationService;
public AbstractBasePage() {
this(null);
}
public AbstractBasePage(IModel<?> model) {
super(model);
// support for selenium tests.
add(new SeleniumWaitForAjaxSupportBehavior() {
@Override
public boolean isEnabled(final Component component) {
return Application.get().getConfigurationType() == RuntimeConfigurationType.DEVELOPMENT;
}
});
// RMT-718 - avoid rendering of wicket-modal-js when no modal window is required in page
if (hasModalWindow()) {
ModalDialogWindowPanel modalDialogWindowPanel = new ModalDialogWindowPanel();
add(modalDialogWindowPanel);
} else {
// need markup container to satisfy html-wicket-element
add(new WebMarkupContainer("modalDialogWindowPanel").setVisible(false));
}
// include dummy component to force rendering of css and js references. must be after modalwindow to keep
// original order (first wicket.js/css, then ours) and overriding
add(new AbstractBasePageHead("head"));
add(new RenderCSSBehavior());
add(new DebugBar("debugBar") {
@Override
public boolean isVisible() {
return false;
}
});
}
/**
* Display a ajax loading indicator for every ajax request.
*
* @return
*/
@Override
public String getAjaxIndicatorMarkupId() {
return "veil";
}
/**
* Have resource contribution in separate behavior cause page's renderHead is called at the very last after
* all child elements have been processed.
*/
public static class AbstractBasePageHead extends WebMarkupContainer {
public AbstractBasePageHead(String id) {
super(id);
}
@Override
public void renderHead(final IHeaderResponse response) {
response.renderJavaScriptReference(Resource.jqueryJsUrl);
response.renderJavaScriptReference(Resource.jqueryUiJsUrl);
// enable drag n drop for ipad
String includeTouchJs = "if (window.Touch) { document.write('" + String.format(Resource.scriptLink, relative(Resource.touchJsUrl)) + "'); }";
response.renderJavaScript(includeTouchJs, "touchJs");
response.renderJavaScriptReference(Resource.bootstrapJsUrl);
// script should be rendered at the very end cause it overrides wicket javascript functions.
response.renderJavaScriptReference(Resource.mainJsUrl);
}
}
/**
* Custom Css should be rendered at end of head. Add this behavior to page -> rendered last.
*/
public static class RenderCSSBehavior extends Behavior {
@Override
public void renderHead(final Component component, final IHeaderResponse response) {
response.renderCSSReference(Resource.bootstrapCssUrl);
// main.css is a less file and needs special type attribute. cannot use wicket #renderCss..
response.renderString(String.format(Resource.lessLink, relative(Resource.mainCssUrl)));
response.renderCSSReference(Resource.ieCssUrl, null, "IE");
String includeTouchCss = "if (window.Touch) { document.write('" + String.format(Resource.lessLink, relative(Resource.touchCssUrl)) + "'); }";
response.renderJavaScript(includeTouchCss, "touchCss");
// less script must be loaded after css-files.
response.renderJavaScriptReference(Resource.lessJsUrl);
}
}
/**
* copied from HeaderResponse#relative
*/
public static String relative(final String url) {
RequestCycle rc = RequestCycle.get();
return rc.getUrlRenderer().renderContextRelativeUrl(url);
}
/**
* Subclasses that need to access a modal window must override and return true;
*/
protected boolean hasModalWindow() {
return false;
}
}