/* * Copyright 2010 Manuel Carrasco Moñino. (manolo at apache/org) * http://code.google.com/p/gwtupload * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package jsupload.client; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArrayString; /** * @author Manolo Carrasco Moñino * * <p> * An utility class for managing native javascript properties blocks. * </p> * */ public class JsProperties { private static class JSChangeClosureImpl implements JsChangeClosure { JavaScriptObject jsobject; JSChangeClosureImpl(JavaScriptObject o) { jsobject = o; } public void onChange(Object object) { onChangeImpl(jsobject, object); } public native void onChangeImpl(JavaScriptObject f, Object o)/*-{ try { if (f && typeof f == 'function') f(o); } catch (e) { $wnd.console.log("JsUpload Error: " + e); } }-*/; } public static native JavaScriptObject createImpl(String properties) /*-{ return eval(properties); }-*/; public static boolean getBoolean(JavaScriptObject jso, String name, boolean deFault) { String val = getImpl(jso, name, "" + deFault).toLowerCase(); if (val.matches("^(1|true|on)$")) { return true; } if (val.matches("^(0|false|off)$")) { return false; } return deFault; } private static native boolean definedImpl(JavaScriptObject p, String name) /*-{ return p && p[name] ? true : false; }-*/; private static native double getDoubleImpl(JavaScriptObject p, String name) /*-{ return p && p[name] ? p[name]: 0; }-*/; private static native String getImpl(JavaScriptObject p, String name, String defa) /*-{ return p && p[name] ? "" + p[name] : p && p[name] === false ? "false" : defa; }-*/; private static native JavaScriptObject getJSObjectImpl(JavaScriptObject p, String name) /*-{ return p && p[name] ? p[name] : null ; }-*/; private static native JsArrayString keysImpl(JavaScriptObject p) /*-{ var key, keys=[]; if (p) for(key in p) keys.push("" + key); return keys; }-*/; JavaScriptObject p = null; public JsProperties(JavaScriptObject p) { this.p = p; } public JsProperties(String properties) { String s = properties.replaceFirst("^[({]*(.*)[})]*$", "({$1})"); s = "({" + s + "})"; try { this.p = createImpl(s); } catch (Exception e) { this.p = createImpl("({exception: '" + e + "'})"); } } public boolean defined(String name) { return definedImpl(p, name); } public String get(String name) { return getImpl(p, name, ""); } public String get(String name, String deFault) { return getImpl(p, name, deFault); } public boolean getBoolean(String name) { return getBoolean(name, false); } public boolean getBoolean(String name, boolean deFault) { return getBoolean(p, name, deFault); } public JsChangeClosure getClosure(String name) { return new JSChangeClosureImpl(getJSObjectImpl(p, name)); } public double getDouble(String name) { return (double) getDoubleImpl(p, name); } public float getFloat(String name) { return (float) getDoubleImpl(p, name); } public int getInt(String name) { return getInt(name, 0); } public int getInt(String name, int deFault) { String val = defined(name) ? get(name).replaceAll("[^\\d]", "") : ""; if (val.length() == 0) { return deFault; } return Integer.valueOf(val); } public JsProperties getJsProperties(String name) { return new JsProperties(getJSObjectImpl(p, name)); } public final String[] keys() { JsArrayString a = keysImpl(p); String[] ret = new String[a.length()]; for (int i = 0; i < a.length(); i++) { ret[i] = "" + a.get(i); } return ret; } public String toString() { String ret = ""; if (p == null) { ret = "null"; } else { for (String k : keys()) { ret += k + ":" + get(k) + ","; } } return ret; } }