package org.vaadin.smartgwt.server;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.codehaus.jackson.annotate.JsonProperty;
import org.vaadin.smartgwt.server.data.Record;
import org.vaadin.smartgwt.server.util.JSONHelper;
import com.vaadin.terminal.PaintException;
import com.vaadin.terminal.PaintTarget;
import com.vaadin.terminal.Paintable;
import com.vaadin.terminal.gwt.server.JsonPaintTarget;
import com.vaadin.ui.AbstractComponent;
// @formatter:off
public abstract class BaseWidget extends AbstractComponent implements PropertyAccessor { // implements HasHandlers, Serializable {
// private Function onRenderFn;
// static {
// init();
// }
// private static native void init()/*-{
// $wnd.isc.setAutoDraw(false);
// }-*/;
protected String id;
// protected JavaScriptObject config = null; // JSOHelper.createObject();
// protected boolean isElementSet = false;
protected String scClassName;
protected boolean configOnly;
//event handling code
//can be removed when GWT issue http://code.google.com/p/google-web-toolkit/issues/detail?id=3378
//is fixed
// private HandlerManager manager;
// public void fireEvent(GwtEvent<?> event) {
// if (manager != null) {
// manager.fireEvent(event);
// }
// }
/**
* Adds this handler to the widget.
*
* @param <H> the type of handler to add
* @param type the event type
* @param handler the handler
* @return {@link HandlerRegistration} used to remove the handler
*/
// protected final <H extends EventHandler> HandlerRegistration doAddHandler(
// final H handler, GwtEvent.Type<H> type) {
// return ensureHandlers().addHandler(type, handler);
// }
/**
* Ensures the existence of the handler manager.
*
* @return the handler manager
*/
// HandlerManager ensureHandlers() {
// return manager == null ? manager = new HandlerManager(this)
// : manager;
// }
//
// HandlerManager getManager() {
// return manager;
// }
//
// public int getHandlerCount(GwtEvent.Type<?> type) {
// return manager == null ? 0 : manager.getHandlerCount(type);
// }
public BaseWidget() {
// String id = SC.generateID(getClass().getName());
// setID(id);
}
// protected BaseWidget(JavaScriptObject jsObj) {
// id = JSOHelper.getAttribute(jsObj, "ID");
// }
// public BaseWidget(String id) {
// setID(id);
// }
// public static BaseWidget getRef(JavaScriptObject jsObj) {
// return jsObj == null ? null : (BaseWidget) JSOHelper.getAttributeAsObject(jsObj, SC.REF);
// }
// protected void setElement(Element elem) {
// super.setElement(elem);
// isElementSet = true;
// }
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#getScClassName()
*/
@Override
public String getScClassName() {
return scClassName;
}
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#setScClassName(java.lang.String)
*/
@Override
public void setScClassName(String scClassName) {
this.scClassName = scClassName;
}
// protected final native void doInit()/*-{
// var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
// self.__setDragTracker = self.setDragTracker;
// self.setDragTracker = function() {
// var jObj = this.__ref;
// return jObj.@com.smartgwt.client.widgets.BaseWidget::setDragTracker()();
// };
//
// self.__getInnerHTML = self.getInnerHTML;
// self.getInnerHTML = function() {
// var jObj = this.__ref;
// return jObj.@com.smartgwt.client.widgets.BaseWidget::getInnerHTML()();
// };
//
// if (self.shouldRedrawOnResize == $wnd.isc.Canvas.getPrototype().shouldRedrawOnResize) {
// self.shouldRedrawOnResize = function(deltaX, deltaY) {
// var redrawOnResize = self.redrawOnResize;
// if (redrawOnResize == null) {
// redrawOnResize = !((self.children != null && self.children.length > 0 &&
// !self.allowContentAndChildren) ||
// // we want to redrawOnResize if we have dynamic content
// // Check for getInnerHTML() having been overridden for this (javascript) Canvas subclass
// // This handles SC subclasses (EG detailViewer) where redrawOnResize is required.
// // If the developer overrides the java getInnerHTML() method rely on them
// // explicitly setting redrawOnResize if required.
// (self.__getInnerHTML == $wnd.isc.Canvas.getPrototype().getInnerHTML &&
// !$wnd.isc.isA.Function(self.contents)));
// }
// return redrawOnResize;
// }
// }
//
// // onDraw() - undocumented method called from draw() as a draw-complete notification
// // Override this rather than overriding draw() directly - the latter adds a layer to the
// // stack depth on draw and when drawing deeply nested layouts etc increases the likelyhood
// // of seeing an out of stack depth error in IE7 and 8
// self.onDraw = function () {
// var jObj = this.__ref;
// if (jObj != null) jObj.@com.smartgwt.client.widgets.BaseWidget::rendered()();
// }
//
// self.__destroy = self.destroy;
// self.destroy = function() {
// var jObj = this.__ref;
// jObj.@com.smartgwt.client.widgets.BaseWidget::destroy()();
// };
//
// this.@com.smartgwt.client.widgets.BaseWidget::onInit()();
// }-*/;
// protected void onInit() {
//
// }
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#isConfigOnly()
*/
@Override
public boolean isConfigOnly() {
return configOnly;
}
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#setConfigOnly(boolean)
*/
@Override
public void setConfigOnly(boolean configOnly) {
this.configOnly = configOnly;
}
// protected native boolean setDragTracker() /*-{
// var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
// return !!self.__setDragTracker();
// }-*/;
// /**
// * Return the inner HTML for this canvas. Called when the canvas is drawn or redrawn;
// * override to customize.
// * <p>
// * <b>Note</b> : {@link Canvas#setRedrawOnResize} should be set to true for components whose inner HTML
// * will not automatically reflow to fit the component's new size.
// *
// * @return HTML contents of this canvas
// */
// public native String getInnerHTML() /*-{
// var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
// return self.__getInnerHTML();
// }-*/;
// /**
// * Draws the widget on the page.
// */
// public native void draw() /*-{
// var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
// self.draw();
// }-*/;
// public native void destroy() /*-{
// var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
// var id = self.ID;
// self.__destroy();
// @com.smartgwt.client.util.IDManager::unregisterID(Ljava/lang/String;)(id);
// this.@com.smartgwt.client.widgets.Canvas::onDestroy()();
// }-*/;
// public void doOnRender(Function function) {
// onRenderFn = function;
// }
// private void rendered() {
// onDraw();
// fireEvent(new DrawEvent(getID()));
// if (onRenderFn != null) {
// onRenderFn.execute();
// }
// }
// public HandlerRegistration addDrawHandler(DrawHandler handler) {
// return doAddHandler(handler, DrawEvent.getType());
// }
// protected void onDraw() {
//
// }
// protected void onDestroy() {
//
// }
// public Element getElement() {
// return getElement(true);
// }
// public Element getElement(boolean allowPreRender) {
//
// if (!isElementSet) {
// JavaScriptObject jsObj = getJsObj();
// if (!allowPreRender) {
// error("This method should only be called after the component has been rendered");
// }
//
// if (jsObj == null) {
// getOrCreateJsObj();
// }
//
// Element wrapperDiv = DOM.createDiv();
// DOMUtil.setID(wrapperDiv, getID() + "_wrapper");
// //the wrapper div must be attached to the dom, or else this widgets children don't get
// //a handle to this widgets dom element (via getHandle()). For example if this self is a
// // HLayout and containts a Canvas and IButton child member.
// RootPanel.getBodyElement().appendChild(wrapperDiv);
//
// Canvas self = ((Canvas) this);
// //need to set properties before calling clear else the properties are not set on the jsObj (it ends up on the config)
// setProperty("position", Positioning.RELATIVE.getValue());
// setProperty("redrawOnResize", true);
// setProperty("htmlElement", wrapperDiv);
// self.clear();
// self.draw();
// setElement(wrapperDiv);
// return wrapperDiv;
//
// }
// return super.getElement();
// }
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#setPosition(java.lang.String)
*/
@Override
public void setPosition(String position) {
setAttribute("position", position, false);
}
// public void setHtmlElement(Element element) {
// setAttribute("htmlElement", element, false);
// }
// public native Element getDOM()/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
// return widget.getHandle();
// }-*/;
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#getID()
*/
@Override
public String getID() {
return id;
}
//
// public void setID(String id) {
// if (this.id != null) {
// IDManager.unregisterID(this.id);
// }
// IDManager.registerID(id);
// setAttribute("ID", id, false);
// this.id = id;
// }
// public JavaScriptObject getConfig() {
// return config;
// }
//
// public void setConfig(JavaScriptObject config) {
// this.config = config;
// }
// public native boolean isCreated()/*-{
// var id = this.@com.smartgwt.client.widgets.BaseWidget::getID()();
// var obj = $wnd.window[id];
// return id != null && obj != null && obj !== undefined && $wnd.isc.isA.Canvas(obj) === true;
// }-*/;
// protected Boolean isDrawn() {
// return isCreated() && doIsDrawn();
// }
// private native boolean doIsDrawn()/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
// return widget.isDrawn();
// }-*/;
// public native JavaScriptObject getJsObj()/*-{
// var id = this.@com.smartgwt.client.widgets.BaseWidget::getID()();
// if($wnd.window[id] != null && $wnd.window[id]!== undefined) {
// return $wnd.window[id];
// } else {
// return null;
// }
// }-*/;
// public JavaScriptObject getOrCreateJsObj() {
// if (!isCreated()) {
// JavaScriptObject jsObj = create();
// JSOHelper.setAttribute(jsObj, SC.REF, this);
// return jsObj;
// } else {
// return getJsObj();
// }
// }
// protected native JavaScriptObject create()/*-{
// var config = this.@com.smartgwt.client.widgets.BaseWidget::getConfig()();
// return $wnd.isc.Canvas.create(config);
// }-*/;
// protected String getAttribute(String attribute) {
// return getAttributeAsString(attribute);
// }
// protected native String getAttributeAsString(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret == null || ret === undefined ? null : String(ret) ;
// }-*/;
// protected native String[] getAttributeAsStringArray(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::convertToJavaStringArray(Lcom/google/gwt/core/client/JavaScriptObject;)(ret);
// }-*/;
// protected native int[] getAttributeAsIntArray(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::convertToJavaIntArray(Lcom/google/gwt/core/client/JavaScriptObject;)(ret);
// }-*/;
// protected native Float[] getAttributeAsFloatArray(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::convertToJavaFloatArray(Lcom/google/gwt/core/client/JavaScriptObject;)(ret);
// }-*/;
// protected native Date getAttributeAsDate(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toDate(D)(ret.getTime());
// }-*/;
// protected native Integer getAttributeAsInt(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toInteger(I)(ret);
// }-*/;
// protected native Double getAttributeAsDouble(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toDouble(D)(ret);
// }-*/;
// protected native Element getAttributeAsElement(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret === undefined ? null : ret;
// }-*/;
// protected native JavaScriptObject getAttributeAsJavaScriptObject(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret === undefined ? null : ret;
// }-*/;
// protected native Float getAttributeAsFloat(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toFloat(F)(ret);
// }-*/;
// protected native Boolean getAttributeAsBoolean(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(ret);
// }-*/;
// protected native Map getAttributeAsMap(String property)/*-{
// var ret;
// if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// ret = widget.getProperty(property);
// } else {
// var config = this.@com.smartgwt.client.widgets.BaseWidget::config;
// if(config[property] != undefined) {
// ret = config[property];
// } else {
// var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
// ret = $wnd.isc[scClassName].getInstanceProperty(property);
// }
// }
// return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::convertToMap(Lcom/google/gwt/core/client/JavaScriptObject;)(ret);
// }-*/;
private void error(String attribute, String value) throws IllegalStateException {
error("Cannot change configuration property '" + attribute + "' to " + value + " after the component has been created.");
}
protected void errorIfNotCreated(String property) throws IllegalStateException {
if (!isCreated()) {
throw new IllegalStateException("Cannot access property " + property + " before the widget has been created.");
}
}
// protected void error(String message) throws IllegalStateException {
// if (!GWT.isScript()) {
// Window.alert("Error :" + message);
// throw new IllegalStateException(message);
// }
// }
// protected void setAttribute(String attribute, String value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, value);
// } else {
// error(attribute, value);
// }
// }
//
// protected void setAttribute(String attribute, ValueEnum value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value.getValue());
// } else if (allowPostCreate) {
// setProperty(attribute, value.getValue());
// } else {
// error(attribute, value.getValue());
// }
// }
//
// protected void setAttribute(String attribute, BaseWidget value, boolean allowPostCreate) {
// JavaScriptObject valueJS = value.isConfigOnly() ? value.getConfig() : value.getOrCreateJsObj();
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, valueJS);
// } else if (allowPostCreate) {
// setProperty(attribute, valueJS);
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, Map value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertMapToJavascriptObject(value));
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, int[] value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, Float[] value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, DataClass value, boolean allowPostCreate) {
//
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value.getJsObj());
// } else if (allowPostCreate) {
// setProperty(attribute, value.getJsObj());
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, DataClass[] value, boolean allowPostCreate) {
//
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, JSOHelper.convertToJavaScriptArray(value));
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, JavaScriptObject[] value, boolean allowPostCreate) {
//
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, JSOHelper.convertToJavaScriptArray(value));
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, BaseClass[] value, boolean allowPostCreate) {
//
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, JSOHelper.convertToJavaScriptArray(value));
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, BaseWidget[] value, boolean allowPostCreate) {
//
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, JSOHelper.convertToJavaScriptArray(value));
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, value.toString());
// }
// }
//
// protected void setAttribute(String attribute, float value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, value);
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// protected void setAttribute(String attribute, double value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, value);
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// protected void setAttribute(String attribute, Integer value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// if (value == null) {
// setNullProperty(attribute);
// } else {
// setProperty(attribute, value.intValue());
// }
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// public native void setNullProperty(String property)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, null);
// }-*/;
//
// public native void setProperty(String property, String value)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, value);
// }-*/;
//
// public native void setProperty(String property, boolean value)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, value);
// }-*/;
//
// public native void setProperty(String property, int value)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, value);
// }-*/;
//
// public native void setProperty(String property, float value)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, value);
// }-*/;
//
// public native void setProperty(String property, double value)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, value);
// }-*/;
//
// public native void setProperty(String property, Element value)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, value);
// }-*/;
//
// public native void setProperty(String property, JavaScriptObject value)/*-{
// var widget = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
// widget.setProperty(property, value);
// }-*/;
//
// protected void setAttribute(String attribute, Date value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// if (value == null) {
// setNullProperty(attribute);
// } else {
// setProperty(attribute, JSOHelper.convertToJavaScriptDate(value));
// }
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// protected void setAttribute(String attribute, JavaScriptObject value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, value);
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// protected void setAttribute(String attribute, String[] value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, JSOHelper.convertToJavaScriptArray(value));
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// protected void setAttribute(String attribute, Object[] value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, JSOHelper.convertToJavaScriptArray(value));
// } else if (allowPostCreate) {
// setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// protected void setAttribute(String attribute, Boolean value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// if (value == null) {
// setNullProperty(attribute);
// } else {
// setProperty(attribute, value.booleanValue());
// }
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//
// protected void setAttribute(String attribute, Element value, boolean allowPostCreate) {
// if (!isCreated()) {
// JSOHelper.setAttribute(config, attribute, value);
// } else if (allowPostCreate) {
// setProperty(attribute, value);
// } else {
// error(attribute, String.valueOf(value));
// }
// }
//override default behavior of setting title for SmartGWT widgets
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#setTitle(java.lang.String)
*/
@Override
public void setTitle(String title) {
//do nothing
}
/* (non-Javadoc)
* @see org.vaadin.smartgwt.server.PropertyAccessor#getTitle()
*/
@Override
public String getTitle() {
return "";
}
// public String toString() {
// if (true || !isDrawn()) {
// return "<<SmartGWT Component>>::" + getClass() + ", ID:" + getID();
// } else {
// return super.toString();
// }
// }
// public boolean equals(Object obj) {
// if (obj instanceof BaseWidget) {
// if (obj == this) {
// return true;
// } else {
// BaseWidget other = (BaseWidget) obj;
// if (other.getID().equals(getID())) {
// return true;
// }
// }
// return false;
// } else {
// return false;
// }
// }
//
// public int hashCode() {
// return getID().hashCode();
// }
// @formatter:on
// ------------ Vaadin integration methods
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = Logger.getLogger(BaseWidget.class);
protected Map<String, Object> attributes = new HashMap<String, Object>();
private boolean isCreated = false;
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#isCreated()
*/
@Override
public boolean isCreated()
{
return isCreated;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#removeAttribute(java.lang.String)
*/
@Override
public void removeAttribute(String attribute)
{
attributes.remove(attribute);
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#setAttribute(java.lang.String, java.lang.Object, boolean)
*/
@Override
public void setAttribute(String attribute, Object value, boolean allowPostCreate)
{
if (isCreated() && !allowPostCreate)
{
throw new IllegalArgumentException("Cannot modify property " + attribute + " once created");
}
if (value == null)
attributes.remove(attribute);
else
attributes.put(attribute, value);
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#setAttribute(java.lang.String, java.lang.Object)
*/
@Override
public void setAttribute(String attribute, Object value)
{
setAttribute(attribute, value, true);
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsString(java.lang.String)
*/
@Override
public String getAttributeAsString(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
return value.toString();
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttribute(java.lang.String)
*/
@Override
public String getAttribute(String attribute)
{
return getAttributeAsString(attribute);
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsInt(java.lang.String)
*/
@Override
public Integer getAttributeAsInt(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
return Integer.valueOf(value.toString());
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsBoolean(java.lang.String)
*/
@Override
public Boolean getAttributeAsBoolean(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
return Boolean.valueOf(value.toString());
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsDouble(java.lang.String)
*/
@Override
public Double getAttributeAsDouble(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
return Double.valueOf(value.toString());
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsFloat(java.lang.String)
*/
@Override
public Float getAttributeAsFloat(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
return Float.valueOf(value.toString());
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsMap(java.lang.String)
*/
@Override
public Map<?, ?> getAttributeAsMap(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
return (Map<?, ?>) value;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsDate(java.lang.String)
*/
@Override
public Date getAttributeAsDate(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
{
DateFormat df = new SimpleDateFormat();
try
{
Date d = df.parse(value.toString());
return d;
}
catch (Exception e)
{
e.printStackTrace();
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsStringArray(java.lang.String)
*/
@Override
public String[] getAttributeAsStringArray(String attribute)
{
Object value = attributes.get(attribute);
if (value == null)
return null;
else
return (String[]) value;
}
// public JavaScriptObject getAttributeAsJavaScriptObject(String property)
// {
// throw new IllegalStateException();
// }
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getAttributeAsObject(java.lang.String)
*/
@Override
public <T> T getAttributeAsObject(String attribute)
{
Object value = attributes.get(attribute);
return (T) value;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#paintContent(com.vaadin.terminal.PaintTarget)
*/
@JsonProperty
public Map<String, Object> getAttributes()
{
return attributes;
}
@Override
public void paintContent(PaintTarget target) throws PaintException
{
JsonPaintTarget jspt = (JsonPaintTarget) target;
// if (jspt.needsToBePainted(this) == false && (this instanceof MasterContainer == false))
// return;
for (Map.Entry<String, Object> entry : attributes.entrySet())
{
Object value = entry.getValue();
String name = entry.getKey();
if (name.length() >= 2 && name.charAt(1) == '$') {
switch (name.charAt(0)) {
case 'b':
target.addAttribute(name, (Boolean) value);
break;
}
break;
}
if (value == null)
{
logPaintContentAttribute(name, null);
target.addAttribute(name, "null");
}
else if (value instanceof Boolean)
{
logPaintContentAttribute(name, value);
target.addAttribute(name, "b" + String.valueOf(value));
}
else if (value instanceof Integer)
{
logPaintContentAttribute(name, value);
target.addAttribute(name, "i" + String.valueOf(value));
}
else if (value instanceof Float)
{
logPaintContentAttribute(name, value);
target.addAttribute(name, "f" + String.valueOf(value));
}
else if (value instanceof Long)
{
logPaintContentAttribute(name, value);
target.addAttribute(name, "l" + String.valueOf(value));
}
else if (value instanceof Double)
{
logPaintContentAttribute(name, value);
target.addAttribute(name, "d" + String.valueOf(value));
}
else if (value instanceof String)
{
logPaintContentAttribute(name, value);
target.addAttribute(name, "s" + String.valueOf(value));
}
else if (value instanceof String[])
{
logPaintContentAttribute(name, value);
if (name.charAt(0) != '*')
name = "!" + name;
target.addAttribute(name, (String[]) value);
}
else if (value instanceof Record[])
{
try
{
String json = JSONHelper.getJsonString((Record[]) value);
target.addAttribute(name, "j" + json);
}
catch (Exception e)
{
e.printStackTrace();
}
}
else if (value instanceof Paintable[])
{
logPaintContentAttribute(name, value);
List<String> references = new ArrayList<String>();
for (Paintable p : (Paintable[]) value)
{
if (jspt.needsToBePainted(p))
p.paint(target);
references.add(jspt.getPaintIdentifier(p));
}
if (name.charAt(0) != '*')
name = "[" + name;
target.addAttribute(name, references.toArray()); // [ = array
}
else if (value instanceof Paintable)
{
logPaintContentAttribute(name, value);
String ref = jspt.getPaintIdentifier((Paintable) value);
if (jspt.needsToBePainted((Paintable) value))
((Paintable) value).paint(target);
if (name.charAt(0) != '*')
name = "#" + name;
target.addAttribute(name, ref); // # = reference
}
}
// Since the paint is finished, set the created attribute
isCreated = true;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getOrCreateJsObj()
*/
@Override
public BaseWidget getOrCreateJsObj()
{
return this;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.smartgwt.server.PropertyAccessor#getConfig()
*/
@Override
public PropertyAccessor getConfig()
{
return this;
}
protected void error(String message) throws IllegalStateException
{
throw new IllegalStateException(message);
}
private void logPaintContentAttribute(String name, Object value)
{
if (LOGGER.isDebugEnabled())
{
final String type = value == null ? "null" : value.getClass().getSimpleName();
final String stringValue = value == null ? "null" : String.valueOf(value);
LOGGER.debug("widget: " + getClass().getSimpleName() + " { attribute { name: " + name + ", type: " + type + ", value: " + stringValue + " }}");
}
}
@Override
public void setSizeFull()
{
setWidth("100%");
setHeight("100%");
}
public void setEnabled(boolean enabled)
{
setAttribute("disabled", !enabled);
}
@Override
public void setReadOnly(boolean readOnly)
{
setAttribute("readonly", readOnly);
}
public void setVisible(boolean visible)
{
setAttribute("visible", visible);
};
}