package org.geoserver.web.wicket;
import org.apache.wicket.Component;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.behavior.AbstractBehavior;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.protocol.http.WebRequest;
/**
* Turns a normal text area into a an editor via the EditArea javascript library that supprots
* syntax highlighting.
* <p>
* See {@linkplain http://www.cdolivet.com/editarea/editarea/docs/} for info about EditArea.
* The syntax scheme can be set by passing the string to the constructor.
* </p>
*
* @author aaime
*/
@SuppressWarnings("serial")
public class EditAreaBehavior extends AbstractBehavior {
public static final ResourceReference REFERENCE = new ResourceReference(
EditAreaBehavior.class, "js/editarea/edit_area_full.js");
private Component component;
private String syntax;
public EditAreaBehavior() {
this("xml");
}
public EditAreaBehavior(String syntax) {
this.syntax = syntax;
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.renderJavascriptReference(REFERENCE);
String renderOnDomReady = getRenderOnDomReadyJavascript(response);
if (renderOnDomReady != null)
response.renderOnDomReadyJavascript(renderOnDomReady);
String renderJavaScript = getRenderJavascript(response);
if (renderJavaScript != null)
response.renderJavascript(renderJavaScript, null);
}
protected String getRenderOnDomReadyJavascript(IHeaderResponse response) {
if (component == null)
throw new IllegalStateException("TinyMceBehavior is not bound to a component");
if (!mayRenderJavascriptDirect())
return getEditAreaInitJavascript();
return null;
}
private String getEditAreaInitJavascript() {
return "editAreaLoader.init({" +
"id : \"" + component.getMarkupId() + "\"," +
"syntax: \""+syntax+"\"," +
"start_highlight: true," +
"allow_toggle: false," +
"font_size: 8," +
"min_width: 700," +
"min_height: 500," +
"allow_resize: true," +
"cursor_position: \"begin\"});";
}
private boolean mayRenderJavascriptDirect() {
return RequestCycle.get().getRequest() instanceof WebRequest && !((WebRequest)RequestCycle.get().getRequest()).isAjax();
}
protected String getRenderJavascript(IHeaderResponse response) {
if (component == null)
throw new IllegalStateException("EditAreaBehavior is not bound to a component");
if (mayRenderJavascriptDirect())
return getEditAreaInitJavascript();
return null;
}
public void bind(Component component) {
if (this.component != null)
throw new IllegalStateException("TinyMceBehavior can not bind to more than one component");
super.bind(component);
component.setOutputMarkupId(true);
this.component = component;
}
}