/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.extjs.gxt.ui.client.core; import com.extjs.gxt.ui.client.GXT; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.ModelStringProvider; import com.extjs.gxt.ui.client.js.JsUtil; import com.extjs.gxt.ui.client.util.Params; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; /** * Represents an HTML fragment template. Templates can be precompiled for * greater performance. */ public class Template { static { GXT.init(); } private native static Element appendInternal(JavaScriptObject t, Element el, JavaScriptObject values) /*-{ return t.append(el, values); }-*/; private native static String applyInternal(JavaScriptObject t, JavaScriptObject values) /*-{ return t.applyTemplate(values); }-*/; private native static JavaScriptObject create(String html) /*-{ return new $wnd.GXT.Ext.Template(html); }-*/; private native static String getHtml(JavaScriptObject t) /*-{ return t.html; }-*/; private native static Element insertInternal(String method, JavaScriptObject t, Element el, JavaScriptObject values) /*-{ return t[method](el, values); }-*/; private JavaScriptObject t; private ModelStringProvider<ModelData> stringProvider; /** * Creates a new template with the given html. * * @param html the HTML fragment or an array */ public Template(String html) { t = create(html); } /** * Applies the supplied values to the template and appends the new node(s) to * el. * * @param el the context element * @param values the positional template values * @return the new element */ public Element append(Element el, Object... values) { return appendInternal(t, el, JsUtil.toJavaScriptArray(values)); } /** * Applies the supplied values to the template and appends the new node(s) to * el. * * @param el the context element * @param values the template values * @return the new element */ public Element append(Element el, Params values) { return appendInternal(t, el, values.getValues()); } /** * Returns an HTML fragment of this template with the specified values * applied. * * @param values the substitution values * @return the html frament */ public String applyTemplate(JavaScriptObject values) { return applyInternal(t, values); } /** * Returns an HTML fragment of this template with the specified values * applied. * * @param values the values * @return the html fragment */ public String applyTemplate(Params values) { return applyInternal(t, values.getValues()); } /** * Compiles the template into an internal function, eliminating the regex * overhead. */ public native void compile() /*-{ var t = this.@com.extjs.gxt.ui.client.core.Template::t; t.compile(); }-*/; /** * Creates a new element. * * @param values the substitution values * @return the new element */ public Element create(Object... values) { return create(new Params(values)); } /** * Creates a new element. * * @param values the substitution values * @return the new element */ public Element create(Params values) { return XDOM.create(applyTemplate(values)); } public String getHtml() { return getHtml(t); } /** * Returns the template's string provider. * * @return the string provider */ public ModelStringProvider<ModelData> getStringProvider() { return stringProvider; } /** * Applies the supplied values to the template and inserts the new node(s) at * the given index. * * @param el the context element * @param index the insert index * @param values the values * @return the new element */ public Element insert(Element el, int index, Params values) { int count = DOM.getChildCount(el); Element before = el.getChildNodes().getItem(index).cast(); if (count == 0 || before == null) { return appendInternal(t, el, values.getValues()); } else { return insertBefore(before, values); } } /** * Applies the supplied values to the template and inserts the new node(s) * after el. * * @param el the context element * @param params the values * @return the new element */ public Element insertAfter(Element el, Params params) { return insertInternal("insertAfter", t, el, params.getValues()); } /** * Applies the supplied values to the template and inserts the new node(s) * before el. * * @param el the context element * @param values the values * @return the new element */ public Element insertBefore(Element el, Params values) { return insertInternal("insertBefore", t, el, values.getValues()); } /** * Applies the supplied values to the template and inserts the new node(s) as * the first child of el. * * @param el the context element * @param values the values * @return the new element */ public Element insertFirst(Element el, Params values) { return insertInternal("insertFirst", t, el, values.getValues()); } /** * Applies the supplied values to the template and overwrites the content of * el with the new node(s). * * @param el the context element * @param values the values * @return the new element */ public Element overwrite(Element el, Params values) { return insertInternal("overwrite", t, el, values.getValues()); } /** * Applies the supplied values to the template and overwrites the content of * el with the new node(s). * * @param el the context element * @param values the values * @return the new element */ public Element overwrite(Element el, JavaScriptObject values) { return insertInternal("overwrite", t, el, values); } /** * Sets the HTML used as the template and optionally compiles it. * * @param html the html fragment * @param compile <code>true<code> to compile */ public native void set(String html, boolean compile) /*-{ var t = this.@com.extjs.gxt.ui.client.core.Template::t; t.set(html, compile); }-*/; /** * Sets the string provider for the template. * * @param stringProvider the string provider */ public void setStringProvider(ModelStringProvider<ModelData> stringProvider) { this.stringProvider = stringProvider; } }