package fr.openwide.core.wicket.more.jqplot.behavior;
import java.io.Serializable;
import org.apache.wicket.Component;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.wicketstuff.wiquery.core.events.Event;
import org.wicketstuff.wiquery.core.events.EventLabel;
import org.wicketstuff.wiquery.core.events.WiQueryEventBehavior;
import org.wicketstuff.wiquery.core.javascript.JsScope;
import org.wicketstuff.wiquery.core.javascript.JsStatement;
import org.wicketstuff.wiquery.core.javascript.JsUtils;
import fr.openwide.core.wicket.more.jqplot.plugin.adddomreference.JQPlotAddDomReferenceResourceReference;
/**
* A behavior that will replot JQPlot's plots whenever a JS event occurs.
* <p>This behavior is most commonly used to replot when the visibility of a plot
* changes, for instance when switching tabs.
*/
public class JQPlotReplotBehavior extends WiQueryEventBehavior {
private static final long serialVersionUID = 8757328427949400346L;
/**
* @param eventLabel The label of the event on which to trigger the replot.
*/
public JQPlotReplotBehavior(String eventLabel) {
this(null, eventLabel);
}
/**
* @param eventLabel The label of the event on which to trigger the replot.
*/
public JQPlotReplotBehavior(EventLabel eventLabel) {
this(null, eventLabel);
}
/**
* @param context A parent component that contains every JQPlot to replot (and only those).
* @param eventLabel The label of the event on which to trigger the replot.
*/
public JQPlotReplotBehavior(Component context, String eventLabel) {
this(context, new ArbitraryEventLabel(eventLabel));
}
/**
* @param context A parent component that contains every JQPlot to replot (and only those).
* @param eventLabel The labels of the events on which to trigger the replot.
*/
public JQPlotReplotBehavior(final Component context, EventLabel ... eventLabels) {
super(new Event(eventLabels) {
private static final long serialVersionUID = 1L;
@Override
public JsScope callback() {
return JsScope.quickScope(
new JsStatement().$(context, ".jqplot-target:visible")
.each(JsScope.quickScope(
new JsStatement().append("$(this)").chain("data", JsUtils.quotes("jqplot")).chain("replot")
))
);
}
});
}
@Override
@SuppressWarnings("deprecation")
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forReference(JQPlotAddDomReferenceResourceReference.get()));
}
private static final class ArbitraryEventLabel implements EventLabel, Serializable {
private static final long serialVersionUID = 1L;
private final String eventLabel;
public ArbitraryEventLabel(String eventLabel) {
super();
this.eventLabel = eventLabel;
}
@Override
public String getEventLabel() {
return eventLabel;
}
}
}