X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2FIbex.java;h=d1e328414e36f8266a27e3d8b3484e52d0cd3ce0;hb=2532e32f07910e63b366ac8e02e897e5314be72c;hp=225b4bcacf4e66ad8d54b6f2f0544b57b07bbd90;hpb=db19c351a5a1e3ca8a817463baaa5bf6ea2cfe6b;p=org.ibex.core.git diff --git a/src/org/ibex/Ibex.java b/src/org/ibex/Ibex.java index 225b4bc..d1e3284 100644 --- a/src/org/ibex/Ibex.java +++ b/src/org/ibex/Ibex.java @@ -28,7 +28,7 @@ public final class Ibex extends JS.Cloneable { str = str.substring(str.indexOf('.') + 1); ret = (JS)ret.get(path); } - ret = (JS)ret.get(str); + if (!"".equals(str)) ret = (JS)ret.get(str); return ret; } @@ -65,6 +65,8 @@ public final class Ibex extends JS.Cloneable { case "ui": return getSub("ui"); case "ui.font": return getSub("ui.font"); case "ui.font.wait": return METHOD; + case "ui.font.width": return METHOD; + case "ui.font.height": return METHOD; case "ui.font.sansserif": return Main.builtin.get("fonts/vera/Vera.ttf"); case "ui.font.monospace": return Main.builtin.get("fonts/vera/VeraMono.ttf"); case "ui.font.serif": return Main.builtin.get("fonts/vera/VeraSe.ttf"); @@ -198,7 +200,8 @@ public final class Ibex extends JS.Cloneable { //#end case 3: //#switch(name) - case "font.wait": + case "ui.font.height": return N(Font.getFont((Stream)a, JS.toInt(b)).textheight((String)c)); + case "ui.font.wait": try { JS.UnpauseCallback callback = JS.pause(); Font font = Font.getFont((Stream)a, JS.toInt(b)); @@ -206,6 +209,8 @@ public final class Ibex extends JS.Cloneable { } catch (JS.NotPauseableException npe) { JS.error("can't wait for a font in a foreground thread"); } + return null; + case "ui.font.width": return N(Font.getFont((Stream)a, JS.toInt(b)).textwidth((String)c)); //#end break; } @@ -215,7 +220,7 @@ public final class Ibex extends JS.Cloneable { throw new JSExn("invalid argument for ibex object method "+name+"()"); } - throw new JSExn("invalid number of arguments for ibex object method "+name+"()"); + throw new JSExn("invalid number of arguments ("+nargs+") for ibex object method "+name+"()"); } public Stream url2res(String url) throws JSExn { @@ -324,10 +329,15 @@ public final class Ibex extends JS.Cloneable { private Template t = null; public Object parentkey = null; public Blessing parent = null; + private Hash cache = new Hash(); public Blessing(JS.Cloneable clonee, Ibex ibex, Blessing parent, Object parentkey) { super(clonee); this.ibex = ibex; this.parentkey = parentkey; this.parent = parent; } public Object get(Object key) throws JSExn { - return key.equals("") ? ((Object)getStatic()) : (new Blessing((JS.Cloneable)clonee.get(key), ibex, this, key)); + if (key.equals("")) return ((Object)getStatic()); + if (cache.get(key) != null) return cache.get(key); + Object ret = new Blessing((JS.Cloneable)clonee.get(key), ibex, this, key); + cache.put(key, ret); + return ret; } public static Blessing getBlessing(Object o) { if (!(o instanceof JS)) return null; @@ -351,9 +361,7 @@ public final class Ibex extends JS.Cloneable { } public JSScope getStatic() { try { - // FIXME background? - if (t == null) - t = Template.buildTemplate(parentkey + ".t", parent.get(parentkey + ".t"), ibex); + if (t == null) t = Template.buildTemplate(parentkey + ".t", parent.get(parentkey + ".t"), ibex); return t.staticScope; } catch (Exception e) { Log.error(this, e);