X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FSpecialBoxProperty.java;h=748819935139a50e235c74f78d20a6bc4ba2237e;hb=3921df8be3570de747a5c873b144909d36f4bb8a;hp=ea3060a075615a4a3848b648115c399e3c021edc;hpb=a98a618c726110009e3fa5e862945c7fc0a8c96a;p=org.ibex.core.git diff --git a/src/org/xwt/SpecialBoxProperty.java b/src/org/xwt/SpecialBoxProperty.java index ea3060a..7488199 100644 --- a/src/org/xwt/SpecialBoxProperty.java +++ b/src/org/xwt/SpecialBoxProperty.java @@ -258,8 +258,7 @@ class SpecialBoxProperty { boolean newshrink = stob(value); if (b.hshrink == newshrink && b.vshrink == newshrink) return; b.hshrink = b.vshrink = newshrink; - if (b.hshrink) b.set(b.dmax, 0, Box.max(b.cmin(0), b.textdim(0) + 2 * b.pad(0), b.dmin(0))); - if (b.vshrink) b.set(b.dmax, 1, Box.max(b.cmin(1), b.textdim(1) + 2 * b.pad(1), b.dmin(1))); + b.mark_for_prerender(); } }); specialBoxProperties.put("hshrink", new SpecialBoxProperty() { @@ -268,7 +267,7 @@ class SpecialBoxProperty { boolean newshrink = stob(value); if (b.hshrink == newshrink) return; b.hshrink = newshrink; - if (b.hshrink) b.set(b.dmax, 0, Box.max(b.cmin(0), b.textdim(0) + 2 * b.pad(0), b.dmin(0))); + b.mark_for_prerender(); } }); @@ -278,7 +277,7 @@ class SpecialBoxProperty { boolean newshrink = stob(value); if (b.vshrink == newshrink) return; b.vshrink = newshrink; - if (b.vshrink) b.set(b.dmax, 1, Box.max(b.cmin(1), b.textdim(1) + 2 * b.pad(1), b.dmin(1))); + b.mark_for_prerender(); } }); @@ -293,7 +292,7 @@ class SpecialBoxProperty { b.surface.setLocation(stoi(value), b.abs(1)); b.surface.centerSurfaceOnRender = false; } - b.set(abs, 0, stosh(value)); + b.set(abs, 0, stoi(value)); } }); @@ -308,7 +307,7 @@ class SpecialBoxProperty { b.surface.setLocation(b.abs(0), stoi(value)); b.surface.centerSurfaceOnRender = false; } - b.set(abs, 1, stosh(value)); + b.set(abs, 1, stoi(value)); } }); @@ -317,11 +316,11 @@ class SpecialBoxProperty { public void put(Box b, Object value) { if (b.sizetoimage) return; if (b.getParent() == null && b.surface != null) { - b.set(size, 0, Box.max(Surface.scarPicture.getWidth(), stosh(value))); + b.set(size, 0, Box.max(Surface.scarPicture.getWidth(), stoi(value))); b.mark_for_prerender(); } else { - b.set(dmax, 0, stosh(value)); - b.set(dmin, 0, stosh(value)); + b.set(dmax, 0, stoi(value)); + b.set(dmin, 0, stoi(value)); } } }); @@ -330,11 +329,11 @@ class SpecialBoxProperty { public void put(Box b, Object value) { if (b.sizetoimage) return; if (b.getParent() == null && b.surface != null) { - b.set(size, 1, Box.max(Surface.scarPicture.getHeight(), stosh(value))); + b.set(size, 1, Box.max(Surface.scarPicture.getHeight(), stoi(value))); b.mark_for_prerender(); } else { - b.set(dmax, 1, stosh(value)); - b.set(dmin, 1, stosh(value)); + b.set(dmax, 1, stoi(value)); + b.set(dmin, 1, stoi(value)); } } }); @@ -376,7 +375,10 @@ class SpecialBoxProperty { } }); specialBoxProperties.put("invisible", new SpecialBoxProperty() { - public Object get(Box b) { return b.invisible ? Boolean.TRUE : Boolean.FALSE; } + public Object get(Box b) { + for (Box cur = b; cur != null; cur = cur.getParent()) { if (cur.invisible) return Boolean.TRUE; } + return Boolean.FALSE; + } public void put(Box b, Object value) { boolean newinvisible = stob(value); if (newinvisible == b.invisible) return; @@ -478,20 +480,13 @@ class SpecialBoxProperty { SpecialBoxProperty mouseEventHandler = new SpecialBoxProperty() { public void put(String name, Box b, Object value) { if (b.surface == null) return; - if (b.getParent() == null) { - if (b.surface.boxContainingMouse != null && b.surface.boxContainingMouse.getParent() != null) - b.surface.boxContainingMouse.put(name, b.surface.boxContainingMouse, value); - } else { - // check siblings - for(Box c = b.prevSibling(); c != null; c = c.prevSibling()) - if (c.inside(c.surface.mousex, c.surface.mousey)) { - c.put(name, c, value); - return; - } - // move up a level - if (b.getParent() != null && b.getParent().getParent() != null) - b.getParent().put(name, b.getParent(), value); - } + for(Box c = b.prevSibling(); c != null; c = c.prevSibling()) + if (c.inside(c.surface.mousex, c.surface.mousey)) { + c.put(name, c, value); + return; + } + if (b.getParent() != null) + b.getParent().put(name, b.getParent(), value); }}; specialBoxProperties.put("Press1", mouseEventHandler); @@ -573,7 +568,7 @@ class SpecialBoxProperty { specialBoxProperties.put("Close", new SpecialBoxProperty() { public void put(Box b, Object value) { - if (b.getParent() == null && b.surface != null) b.surface.dispose(); + if (b.getParent() == null && b.surface != null) b.surface.dispose(true); } }); @@ -592,7 +587,7 @@ class SpecialBoxProperty { public void put(Box b, Object value) { if (b.redirect == null) return; if (b.redirect != b) { put(b.redirect, value); return; } - short newval = stosh(value); + int newval = stoi(value); if (newval == b.pad(0)) return; b.set(pad, 0, newval); } @@ -607,7 +602,7 @@ class SpecialBoxProperty { public void put(Box b, Object value) { if (b.redirect == null) return; if (b.redirect != b) { put(b.redirect, value); return; } - short newval = stosh(value); + int newval = stoi(value); if (newval == b.pad(1)) return; b.set(pad, 1, newval); } @@ -621,7 +616,7 @@ class SpecialBoxProperty { public Object get(Box b) { return new Integer(b.dmin(0)); } public void put(Box b, Object value) { if (b.sizetoimage) return; - b.set(dmin, 0, stosh(value)); + b.set(dmin, 0, stoi(value)); } }); @@ -629,7 +624,7 @@ class SpecialBoxProperty { public Object get(Box b) { return new Integer(b.dmax(0)); } public void put(Box b, Object value) { if (b.sizetoimage) return; - b.set(dmax, 0, stosh(value)); + b.set(dmax, 0, stoi(value)); } }); @@ -637,7 +632,7 @@ class SpecialBoxProperty { public Object get(Box b) { return new Integer(b.dmin(1)); } public void put(Box b, Object value) { if (b.sizetoimage) return; - b.set(dmin, 1, stosh(value)); + b.set(dmin, 1, stoi(value)); } }); @@ -645,7 +640,7 @@ class SpecialBoxProperty { public Object get(Box b) { return new Integer(b.dmax(1)); } public void put(Box b, Object value) { if (b.sizetoimage) return; - b.set(dmax, 1, stosh(value)); + b.set(dmax, 1, stoi(value)); } }); @@ -657,6 +652,16 @@ class SpecialBoxProperty { return get(b.redirect); } }); + + specialBoxProperties.put("apply", new SpecialBoxProperty() { + public void put(Box b, Object value) { } + public Object get(Box b) { return new Apply(b); } + }); + + specialBoxProperties.put("id", new SpecialBoxProperty() { + public void put(Box b, Object value) { } + public Object get(Box b) { return b.id; } + }); } @@ -679,19 +684,42 @@ class SpecialBoxProperty { catch (NumberFormatException e) { return 0; } } - /** helper that converts a String to a short according to JavaScript coercion rules */ - public static short stosh(Object o) { - if (o == null) return 0; - if (o instanceof Number) return ((Number)o).shortValue(); + /** helper that converts a String to a int according to JavaScript coercion rules */ + private static class Apply extends JSObject.JSFunction { + + Box b; + public Apply(Box b) { this.b = b; } + + public Object call(Context cx, Scriptable thisObj, Scriptable ctorObj, Object[] args) throws JavaScriptException { + + // apply a template + if (args[0] instanceof String) { + String templatename = (String)args[0]; + Template t = Template.getTemplate(templatename, null); + if (t == null) { + if (Log.on) Log.log(this, "template " + templatename + " not found at " + + Context.enter().interpreterSourceFile + ":" + Context.enter().interpreterLine); + } else { + if (ThreadMessage.suspendThread()) try { + Function callback = args.length < 2 ? null : (Function)args[1]; + t.apply(b, null, null, callback, 0, t.numUnits()); + } finally { + ThreadMessage.resumeThread(); + } + } - String s; - if (!(o instanceof String)) s = o.toString(); - else s = (String)o; + // apply a list of properties + } else if (args[0] instanceof Scriptable && !(args[0] instanceof Box)) { + // FIXME: need to ensure that this is putGlobally(), but still run traps... + Scriptable s = (Scriptable)args[0]; + Object[] keys = s.getIds(); + for(int j=0; j