/*
* SmartGWT (GWT for SmartClient)
* Copyright 2008 and beyond, Isomorphic Software, Inc.
*
* SmartGWT is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License version 3
* as published by the Free Software Foundation. SmartGWT is also
* available under typical commercial license terms - see
* smartclient.com/license.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package com.smartgwt.client.core;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Window;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.smartgwt.client.types.ValueEnum;
import com.smartgwt.client.util.IDManager;
import com.smartgwt.client.util.JSOHelper;
import com.smartgwt.client.util.JSONEncoder;
import com.smartgwt.client.util.SC;
import java.util.Date;
import java.util.Map;
public abstract class BaseClass {
protected String id;
protected JavaScriptObject config = JSOHelper.createObject();
protected String scClassName;
public BaseClass() {
String id = SC.generateID(getClass().getName());
setID(id);
}
protected BaseClass(JavaScriptObject jsObj) {
String nativeID = JSOHelper.getAttribute(jsObj, "ID");
this.id = nativeID;
}
/**
* Return the ID
*
* @return the ID
*/
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;
}
/**
* Get the name of the underlying SmartClient class
*
* @return the SmartClient class name
*/
public String getScClassName() {
return scClassName;
}
/**
* Set the name of the underlying SmartClient class. This is an advanced setting.
*
* @param scClassName the SmartClient class
*/
public void setScClassName(String scClassName) {
this.scClassName = scClassName;
}
public JavaScriptObject getConfig() {
return config;
}
public native boolean isCreated()/*-{
var id = this.@com.smartgwt.client.core.BaseClass::getID()();
var obj = $wnd.window[id];
// && $wnd.isc.isA.Canvas(obj) === true
return id != null && obj != null && obj !== undefined;
}-*/;
public native JavaScriptObject getJsObj()/*-{
var id = this.@com.smartgwt.client.core.BaseClass::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);
onInit();
return jsObj;
} else {
return getJsObj();
}
}
public static BaseClass getRef(JavaScriptObject jsObj) {
return jsObj == null ? null : (BaseClass) JSOHelper.getAttributeAsObject(jsObj, SC.REF);
}
/**
* Destroy this object.
*/
public native void destroy()/*-{
var self = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
var ID = this.@com.smartgwt.client.core.BaseClass::getID()();
if (self != null && self.destroy) self.destroy();
if (ID != null) {
@com.smartgwt.client.util.IDManager::unregisterID(Ljava/lang/String;)(ID);
}
}-*/;
protected void error(String attribute, String value, boolean allowPostCreate) throws IllegalStateException {
if (allowPostCreate) {
error("Cannot change configuration property '" + attribute + "' to " + value + " after the component has been rendered.");
} else {
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 component has been created.");
}
}
protected void error(String message) throws IllegalStateException {
if (!GWT.isScript()) {
Window.alert("Error :" + message);
throw new IllegalStateException(message);
}
}
protected abstract JavaScriptObject create();
protected void onInit() {}
public String getAttribute(String attribute) {
return getAttributeAsString(attribute);
}
public native String getAttributeAsString(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret === undefined ? null : ret;
}-*/;
public native Date getAttributeAsDate(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toDate(D)(ret.getTime());
}-*/;
public native Integer getAttributeAsInt(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toInteger(I)(ret);
}-*/;
public native Double getAttributeAsDouble(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toDouble(D)(ret);
}-*/;
public native Element getAttributeAsElement(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret === undefined ? null : ret;
}-*/;
public native JavaScriptObject getAttributeAsJavaScriptObject(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret === undefined ? null : ret;
}-*/;
public native Float getAttributeAsFloat(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toFloat(F)(ret);
}-*/;
public native Boolean getAttributeAsBoolean(String property)/*-{
var ret;
if(this.@com.smartgwt.client.core.BaseClass::isCreated()()) {
var widget = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
ret = widget.getProperty(property);
} else {
var config = this.@com.smartgwt.client.core.BaseClass::config;
if(config[property] != undefined) {
ret = config[property];
} else {
var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName;
ret = eval("($wnd.isc." + scClassName + ".getInstanceProperty('" + property + "'))")
}
}
return ret == null || ret === undefined ? null : @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(ret);
}-*/;
public Map getAttributeAsMap(String property) {
return JSOHelper.getAttributeAsMap(getOrCreateJsObj(), property);
}
public 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, allowPostCreate);
}
}
public void setAttribute(String attribute, Boolean value, boolean allowPostCreate) {
if (!isCreated()) {
JSOHelper.setAttribute(config, attribute, value);
} else if (allowPostCreate) {
setProperty(attribute, value);
} else {
error(attribute, value.toString(), allowPostCreate);
}
}
public void setAttribute(String attribute, Map value, boolean allowPostCreate) {
if (!isCreated()) {
JSOHelper.setAttribute(config, attribute, JSOHelper.convertMapToJavascriptObject(value));
} else if (allowPostCreate) {
setProperty(attribute, JSOHelper.convertMapToJavascriptObject(value));
} else {
error(attribute, value.toString(), allowPostCreate);
}
}
public void setAttribute(String attribute, int[] 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(), allowPostCreate);
}
}
public 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(), allowPostCreate);
}
}
public 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(), allowPostCreate);
}
}
public 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), allowPostCreate);
}
}
public void setAttribute(String attribute, int value, boolean allowPostCreate) {
if (!isCreated()) {
JSOHelper.setAttribute(config, attribute, value);
} else if (allowPostCreate) {
setProperty(attribute, value);
} else {
error(attribute, String.valueOf(value), allowPostCreate);
}
}
public void setAttribute(String attribute, Date value, boolean allowPostCreate) {
if (!isCreated()) {
JSOHelper.setAttribute(config, attribute, value);
} else if (allowPostCreate) {
setProperty(attribute, JSOHelper.convertToJavaScriptDate(value));
} else {
error(attribute, String.valueOf(value), allowPostCreate);
}
}
public void setAttribute(String attribute, ValueEnum[] value, boolean allowPostCreate) {
if (!isCreated()) {
JSOHelper.setAttribute(config, attribute, value);
} else if (allowPostCreate) {
setProperty(attribute, JSOHelper.convertToJavaScriptArray(value));
} else {
error(attribute, String.valueOf(value), allowPostCreate);
}
}
public 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, String.valueOf(value), allowPostCreate);
}
}
public 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), allowPostCreate);
}
}
public 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), allowPostCreate);
}
}
protected void setAttribute(String attribute, boolean value, boolean allowPostCreate) {
if (!isCreated()) {
JSOHelper.setAttribute(config, attribute, value);
} else if (allowPostCreate) {
setProperty(attribute, value);
} else {
error(attribute, String.valueOf(value), allowPostCreate);
}
}
public 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), allowPostCreate);
}
}
public native void setProperty(String property, String value)/*-{
var self = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
self.setProperty(property, value);
}-*/;
public native void setProperty(String property, boolean value)/*-{
var self = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
self.setProperty(property, value);
}-*/;
public native void setProperty(String property, double value)/*-{
var self = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
self.setProperty(property, value);
}-*/;
public native void setProperty(String property, JavaScriptObject value)/*-{
var self = this.@com.smartgwt.client.core.BaseClass::getJsObj()();
self.setProperty(property, value);
}-*/;
//event handling ode
private HandlerManager manager = null;
public void fireEvent(GwtEvent<?> event) {
if (manager != null) {
manager.fireEvent(event);
}
}
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);
}
}