package org.vaadin.smartgwt.client.ui.utils; import java.util.HashSet; import java.util.Set; import org.vaadin.smartgwt.client.core.VBaseClass; import org.vaadin.smartgwt.client.core.VDataClass; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.ui.Widget; import com.smartgwt.client.core.BaseClass; import com.smartgwt.client.core.DataClass; import com.smartgwt.client.util.JSOHelper; import com.smartgwt.client.util.JSON; import com.smartgwt.client.widgets.BaseWidget; import com.smartgwt.client.widgets.Canvas; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; public class PainterHelper { private static final Set<String> abstractComponentAttributes = new HashSet<String>(); static { // abstractComponentAttributes.add("height"); // abstractComponentAttributes.add("width"); // abstractComponentAttributes.add("style"); // abstractComponentAttributes.add("readonly"); // abstractComponentAttributes.add("immediate"); abstractComponentAttributes.add("disabled"); // abstractComponentAttributes.add("caption"); // abstractComponentAttributes.add("icon"); // abstractComponentAttributes.add("description"); // abstractComponentAttributes.add("eventListeners"); // abstractComponentAttributes.add("invisible"); abstractComponentAttributes.add("cached"); } /** * Provides automatic processing of a Widget's property, coming from properties in uidl * * @param client * @param component * @param uidl */ public static void updateSmartGWTComponent(ApplicationConnection client, Widget component, UIDL uidl) { if (uidl.hasAttribute("cached")) return; for (String att : uidl.getAttributeNames()) { if (!att.startsWith("*") && !att.equals("id") && !att.startsWith("_") && !abstractComponentAttributes.contains(att)) { if (component instanceof BaseWidget) { BaseWidget widget = (BaseWidget) component; if (att.length() >= 2 && att.charAt(1) == '$') { final String attribute = att.substring(2); switch (att.charAt(0)) { case 'b': if ("disabled".equals(attribute) && widget instanceof Canvas) { if (uidl.getBooleanAttribute(att)) { ((Canvas) widget).disable(); } else { ((Canvas) widget).enable(); } } else { widget.setProperty(attribute, uidl.getBooleanAttribute(att)); } break; } break; } // Names starting with the character '#' indicate a reference to a Paintable if (att.startsWith("#")) { final Paintable paintable = client.getPaintable(uidl.getStringAttribute(att)); if (paintable instanceof BaseWidget) { widget.setProperty(att.substring(1), ((BaseWidget) paintable).getOrCreateJsObj()); } else if (paintable instanceof VDataClass) { final JavaScriptObject jso = ((VDataClass<DataClass>) paintable).getJSObject().getJsObj(); widget.setProperty(att.substring(1), jso); } else if (paintable instanceof VBaseClass) { final JavaScriptObject jso = ((VBaseClass<BaseClass>) paintable).getJSObject().getOrCreateJsObj(); widget.setProperty(att.substring(1), jso); } } // Names starting with '!' indicate a String[] else if (att.startsWith("!")) { String[] value = uidl.getStringArrayAttribute(att); widget.setProperty(att.substring(1), JSOHelper.convertToJavaScriptArray(value)); } else { String sValue = uidl.getStringAttribute(att); if (sValue.equals("null")) { widget.setProperty(att, (String) null); } else if (sValue.length() == 0) { widget.setProperty(att, ""); } else { setWidgetProperty(widget, att, sValue); } } } } } } private static void setBaseClassProperty(BaseClass data, String att, String sValue) { switch (sValue.charAt(0)) { case 's': { String value = sValue.substring(1); if (!data.isCreated()) JSOHelper.setAttribute(data.getConfig(), att, value); else data.setProperty(att, value); } break; case 'i': { Integer value = Integer.valueOf(sValue.substring(1)); if (!data.isCreated()) JSOHelper.setAttribute(data.getConfig(), att, value); else data.setProperty(att, value); } break; case 'f': { Float value = Float.valueOf(sValue.substring(1)); if (!data.isCreated()) JSOHelper.setAttribute(data.getConfig(), att, value); else data.setProperty(att, value); } break; case 'l': { Long value = Long.valueOf(sValue.substring(1)); if (!data.isCreated()) JSOHelper.setAttribute(data.getConfig(), att, value); else data.setProperty(att, value); } break; case 'd': { Double value = Double.valueOf(sValue.substring(1)); if (!data.isCreated()) JSOHelper.setAttribute(data.getConfig(), att, value); else data.setProperty(att, value); } break; case 'b': { Boolean value = Boolean.valueOf(sValue.substring(1)); if (!data.isCreated()) JSOHelper.setAttribute(data.getConfig(), att, value); else data.setProperty(att, value); } break; case 'j': { JavaScriptObject value = JSON.decode(sValue.substring(1)); if (!data.isCreated()) JSOHelper.setAttribute(data.getConfig(), att, value); else data.setProperty(att, value); } break; } } private static void setDataProperty(DataClass data, String att, String sValue) { Object value = null; switch (sValue.charAt(0)) { case 's': value = sValue.substring(1); break; case 'i': value = Integer.valueOf(sValue.substring(1)); break; case 'f': value = Float.valueOf(sValue.substring(1)); break; case 'l': value = Long.valueOf(sValue.substring(1)); break; case 'd': value = Double.valueOf(sValue.substring(1)); break; case 'b': value = Boolean.valueOf(sValue.substring(1)); break; } data.setAttribute(att, value); } private static void setWidgetProperty(BaseWidget widget, String att, String sValue) { switch (sValue.charAt(0)) { case 's': { String value = sValue.substring(1); if (!widget.isCreated()) JSOHelper.setAttribute(widget.getConfig(), att, value); else widget.setProperty(att, value); } break; case 'i': { Integer value = Integer.valueOf(sValue.substring(1)); if (!widget.isCreated()) JSOHelper.setAttribute(widget.getConfig(), att, value); else widget.setProperty(att, value); } break; case 'f': { Float value = Float.valueOf(sValue.substring(1)); if (!widget.isCreated()) JSOHelper.setAttribute(widget.getConfig(), att, value); else widget.setProperty(att, value); } break; case 'l': { Long value = Long.valueOf(sValue.substring(1)); if (!widget.isCreated()) JSOHelper.setAttribute(widget.getConfig(), att, value); else widget.setProperty(att, value); } break; case 'd': { Double value = Double.valueOf(sValue.substring(1)); if (!widget.isCreated()) JSOHelper.setAttribute(widget.getConfig(), att, value); else widget.setProperty(att, value); } break; case 'b': { Boolean value = Boolean.valueOf(sValue.substring(1)); if (!widget.isCreated()) JSOHelper.setAttribute(widget.getConfig(), att, value); else widget.setProperty(att, value); } break; case 'j': { JavaScriptObject value = JSON.decode(sValue.substring(1)); if (!widget.isCreated()) JSOHelper.setAttribute(widget.getConfig(), att, value); else widget.setProperty(att, value); } break; } } public static void updateBaseClass(ApplicationConnection client, BaseClass dataObject, UIDL uidl) { if (uidl.hasAttribute("cached")) return; for (String att : uidl.getAttributeNames()) { if (att.startsWith("#")) { Paintable p = client.getPaintable(uidl.getStringAttribute(att)); if (p instanceof BaseWidget) { BaseWidget bw = (BaseWidget) p; dataObject.setAttribute(att.substring(1), bw.getOrCreateJsObj(), true); } } else if (att.startsWith("!")) { String[] value = uidl.getStringArrayAttribute(att); dataObject.setAttribute(att.substring(1), value, true); } else if (!att.startsWith("*") && !att.equals("id") && !"disabled".equalsIgnoreCase(att)) { String sValue = uidl.getStringAttribute(att); setBaseClassProperty(dataObject, att, sValue); } } } public static void updateDataObject(ApplicationConnection client, DataClass dataObject, UIDL uidl) { if (uidl.hasAttribute("cached")) return; for (String att : uidl.getAttributeNames()) { if (att.startsWith("#")) { final Paintable paintable = client.getPaintable(uidl.getStringAttribute(att)); if (paintable instanceof BaseWidget) { dataObject.setAttribute(att.substring(1), ((BaseWidget) paintable).getOrCreateJsObj()); } else if (paintable instanceof VDataClass) { final JavaScriptObject jso = ((VDataClass<DataClass>) paintable).getJSObject().getJsObj(); dataObject.setAttribute(att.substring(1), jso); } else if (paintable instanceof VBaseClass) { final JavaScriptObject jso = ((VBaseClass<BaseClass>) paintable).getJSObject().getOrCreateJsObj(); dataObject.setAttribute(att.substring(1), jso); } } else if (att.startsWith("!")) { String[] value = uidl.getStringArrayAttribute(att); dataObject.setAttribute(att.substring(1), value); } else if (!att.startsWith("*") && !att.equals("id") && !"disabled".equalsIgnoreCase(att)) { String sValue = uidl.getStringAttribute(att); setDataProperty(dataObject, att, sValue); } } } public static Canvas getCanvasByRef(UIDL uidl, ApplicationConnection client, String refName) { String ref = uidl.getStringAttribute(refName); return (Canvas) client.getPaintable(ref); } }