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()); } }