package be.selckin.swu.util.xml;
import be.selckin.swu.jquery.Javascripter;
import com.google.common.base.Supplier;
import nu.xom.Builder;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.apache.wicket.request.resource.PackageResourceReference;
import static com.google.common.base.Preconditions.checkNotNull;
public class XmlEditorPanel extends Panel {
private IModel<String> model;
private boolean required = true;
private TextArea<String> textArea;
private Supplier<Builder> builderSupplier;
public XmlEditorPanel(String id, Supplier<Builder> builderSupplier, IModel<String> model) {
super(id, model);
this.model = checkNotNull(model);
this.builderSupplier = checkNotNull(builderSupplier);
add(new Behavior() {
@Override
public void renderHead(Component component, IHeaderResponse response) {
response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(XmlEditorPanel.class, "codemirror-0.94.js")));
response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(XmlEditorPanel.class, "XmlEditorPanel.js")));
response.render(CssHeaderItem.forReference(new CssResourceReference(XmlEditorPanel.class, "XmlEditorPanel.css")));
}
});
}
@Override
protected void onInitialize() {
super.onInitialize();
textArea = new TextArea<String>("xml", model) {
@Override
public boolean isRequired() {
return required;
}
};
add(textArea.add(new XmlParseableValidator(builderSupplier)).setOutputMarkupId(true));
}
public boolean isRequired() {
return required;
}
public XmlEditorPanel setRequired(boolean required) {
this.required = required;
return this;
}
@Override
public void renderHead(IHeaderResponse response) {
Javascripter.callFunction(response, "swu.xmlEditor.initXml", getUrl("codemirror_base-0.94.js"), getUrl("xmlcolors.css"), textArea.getMarkupId());
}
private CharSequence getUrl(String name) {
return RequestCycle.get().urlFor(new PackageResourceReference(XmlEditorPanel.class, name), new PageParameters());
}
}