package ro.nextreports.server.web.dashboard.display;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnLoadHeaderItem;
import org.apache.wicket.markup.html.image.NonCachingImage;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
import ro.nextreports.engine.exporter.util.DisplayData;
import ro.nextreports.server.web.NextServerApplication;
import ro.nextreports.server.web.dashboard.WidgetPopupMenuModel;
import ro.nextreports.server.web.dashboard.chart.ChartHTML5Panel;
public class DisplayImagePanel extends Panel {
private static final long serialVersionUID = 1L;
private final ResourceReference NEXT_JS = new JavaScriptResourceReference(ChartHTML5Panel.class, NextServerApplication.NEXT_CHARTS_JS);
private DisplayDinamicImageResource imageResource;
private String width;
private String height;
public DisplayImagePanel(String id, String w, String h, final IModel<DisplayData> model) {
super(id, model);
this.width = w;
this.height = h;
NonCachingImage image = new NonCachingImage("displayImage", new PropertyModel(this, "imageResource")) {
private static final long serialVersionUID = 1L;
@Override
protected void onBeforeRender() {
int w = 200;
int h = 120;
if ("100%".equals(width) || "100%".equals(height)) {
// see WidgetPopupMenuModel
w = WidgetPopupMenuModel.POPUP_WIDTH;
h = WidgetPopupMenuModel.POPUP_HEIGHT;
} else {
w = Integer.parseInt(width);
h = Integer.parseInt(height);
}
imageResource = new DisplayDinamicImageResource(w, h, model.getObject());
super.onBeforeRender();
}
};
add(image);
// add(new ResizeBehavior());
}
private class ResizeBehavior extends AbstractDefaultAjaxBehavior {
private static final long serialVersionUID = 1L;
private static final String HEIGHT = "height";
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
//include js file
response.render(JavaScriptHeaderItem.forReference(NEXT_JS));
response.render(OnLoadHeaderItem.forScript(getResizeEndDefinition()));
response.render(OnLoadHeaderItem.forScript(getResizeJavaScript()));
}
// http://stackoverflow.com/questions/2996431/detect-when-a-window-is-resized-using-javascript
public String getResizeEndDefinition() {
StringBuilder sb = new StringBuilder();
sb.append("$(window).resize(function() {").
append("if(this.resizeTO) clearTimeout(this.resizeTO);").
append("this.resizeTO = setTimeout(function() {").
append("$(this).trigger('resizeEnd');").
append("}, 500);").
append("});");
return sb.toString();
}
// we want a redraw after browser resize
// will be made only when resize event finished!
private String getResizeJavaScript() {
StringBuilder sb = new StringBuilder();
sb.append("$(window).bind(\'resizeEnd\', function(){");
sb.append("var ih = getIndicatorHeight();");
sb.append("Wicket.Ajax.get({ u: '");
sb.append(getCallbackUrl());
sb.append("&");
sb.append(HEIGHT);
sb.append("=");
sb.append("ih");
sb.append("});");
// System.out.println("---> " + sb.toString());
return sb.toString();
}
@Override
protected void respond(AjaxRequestTarget target) {
height = this.getComponent().getRequest().getRequestParameters().getParameterValue(HEIGHT).toString();
width = height;
// System.out.println("*** height="+height);
target.add(this.getComponent());
}
}
}