X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java;h=e7d63cb274da94f4d72dfe4eb77f5c83a54483d2;hb=55854fa1b8f8f33fb064674b43761a0515c10960;hp=1e9bcc01d4cde94f718d02bcc186458c2a629f6f;hpb=963fc3700fdbc4d64cb56f1b15be16d7b3acb643;p=org.ibex.core.git diff --git a/src/org/xwt/Box.java b/src/org/xwt/Box.java index 1e9bcc0..e7d63cb 100644 --- a/src/org/xwt/Box.java +++ b/src/org/xwt/Box.java @@ -413,7 +413,7 @@ public final class Box extends JSObject { } /** loads the image described by string str, possibly blocking for a network load */ - private static ImageDecoder getImage(String str) { + static ImageDecoder getImage(String str, final Function callback) { ImageDecoder ret = null; boolean ispng = false; @@ -438,8 +438,38 @@ public final class Box extends JSObject { if (str.endsWith(".jpeg") || str.endsWith(".jpg")) str = "http://xmlrpc.xwt.org/jpeg2png/" + str.substring(str.indexOf("//") + 2); - if (str.endsWith(".gif")) ret = GIF.decode(new HTTP(str).getInputStream(), str); - else ret = PNG.decode(new HTTP(str).getInputStream(), str); + final HTTP http = new HTTP(str); + final int contentLength = http.getContentLength(); + InputStream is = new FilterInputStream(http.getInputStream()) { + int bytesDownloaded = 0; + boolean clear = true; + public int read() throws IOException { + bytesDownloaded++; + return super.read(); + } + public int read(byte[] b, int off, int len) throws IOException { + int ret = super.read(b, off, len); + if (ret != -1) bytesDownloaded += ret; + if (clear && callback != null) { + clear = false; + ThreadMessage.newthread(new JSObject.JSFunction() { + public Object call(Context cx, Scriptable thisObj, Scriptable ctorObj, Object[] args) throws JavaScriptException { + try { + callback.call(cx, null, null, new Object[] { + new Double(bytesDownloaded), new Double(contentLength) }); + } finally { + clear = true; + } + return null; + } + }); + } + return ret; + } + }; + + if (str.endsWith(".gif")) ret = GIF.decode(is, str); + else ret = PNG.decode(is, str); return ret; } catch (IOException e) { @@ -460,7 +490,7 @@ public final class Box extends JSObject { Picture ret = null; ret = (Picture)pictureCache.get(os); if (ret != null) return ret; - ImageDecoder id = getImage(os); + ImageDecoder id = getImage(os, null); if (id == null) return null; ret = Platform.createPicture(id); pictureCache.put(os, ret); @@ -498,7 +528,7 @@ public final class Box extends JSObject { } else { border = (Picture[])bordercache.get(s); if (border == null) { - ImageDecoder id = getImage(s); + ImageDecoder id = getImage(s, null); if (id == null) { if (Log.on) Log.log(this, "unable to load border image " + s + " at " + Context.enter().interpreterSourceFile + ":" + Context.enter().interpreterLine); @@ -607,26 +637,31 @@ public final class Box extends JSObject { } /** creates a new box from an anonymous template; ids is passed through to Template.apply() */ - Box(Template anonymous, Vec pboxes, Vec ptemplates) { + Box(Template anonymous, Vec pboxes, Vec ptemplates, Function callback, int numerator, int denominator) { super(true); set(dmax, 0, Short.MAX_VALUE); set(dmax, 1, Short.MAX_VALUE); template = anonymous; - template.apply(this, pboxes, ptemplates); + template.apply(this, pboxes, ptemplates, callback, numerator, denominator); templatename = null; importlist = null; } /** creates a new box from an unresolved templatename and an importlist; use "box" for an untemplatized box */ - public Box(String templatename, String[] importlist) { + public Box(String templatename, String[] importlist) { this(templatename, importlist, null); } + public Box(String templatename, String[] importlist, Function callback) { super(true); set(dmax, 0, Short.MAX_VALUE); set(dmax, 1, Short.MAX_VALUE); this.importlist = importlist; - template = "box".equals(templatename) ? null : Template.getTemplate(templatename, importlist); - this.templatename = templatename; + if (!"box".equals(templatename)) { + template = Template.getTemplate(templatename, importlist); + if (template == null) + if (Log.on) Log.log(this, "couldn't find template \"" + templatename + "\""); + } if (template != null) { - template.apply(this, null, null); + this.templatename = templatename; + template.apply(this, null, null, callback, 0, template.numUnits()); if (redirect == this && !"self".equals(template.redirect)) redirect = null; } } @@ -637,6 +672,8 @@ public final class Box extends JSObject { /** Checks if the Box's size has changed, dirties it if necessary, and makes sure childrens' sizes are up to date */ void prerender() { + if (invisible) return; + if (getParent() == null) { set(pos, 0, 0); set(pos, 1, 0); @@ -1049,6 +1086,14 @@ public final class Box extends JSObject { return; } Box newnode = (Box)value; + + for(Box cur = this; cur != null; cur = cur.getParent()) + if (cur == newnode) { + if (Log.on) Log.log(this, "attempt to make a node a parent of its own ancestor at " + + Context.enter().interpreterSourceFile + ":" + Context.enter().interpreterLine); + return; + } + if (redirect == null) { if (Log.on) Log.log(this, "attempt to add a child to a node with a null redirect at " + Context.enter().interpreterSourceFile + ":" + Context.enter().interpreterLine); @@ -1132,7 +1177,11 @@ public final class Box extends JSObject { SpecialBoxProperty gph = (SpecialBoxProperty)SpecialBoxProperty.specialBoxProperties.get(name); if (gph != null) return gph.get(this); - return super.get(name, start); + Object ret = super.get(name, start); + if (name.startsWith("$") && ret == null) + if (Log.on) Log.log(this, "WARNING: attempt to access " + name + ", but no child with id=\"" + name.substring(1) + "\" found; " + + Context.enter().interpreterSourceFile + ":" + Context.enter().interpreterLine); + return ret; } /** indicate that we don't want JSObject trying to handle these */ @@ -1440,6 +1489,10 @@ public final class Box extends JSObject { /** returns numerator/denominator, but rounds up instead of down */ static final int divide_round_up(int numerator, int denominator) { + + // cope with bozos who use flex==0.0 + if (denominator == 0) return Integer.MAX_VALUE; + int ret = numerator / denominator; if (ret * denominator < numerator) return ret + 1; return ret;