2003/06/18 07:54:30
[org.ibex.core.git] / src / org / xwt / Box.java
index 2ab32b9..501f061 100644 (file)
@@ -263,13 +263,13 @@ public final class Box extends JS.Scope {
     // Instance Data: IndexOf  ////////////////////////////////////////////////////////////
 
     /** The indexof() Function; created lazily */
-    public JS.Function indexof = null;
-    public JS.Function indexof() { if (indexof == null) indexof = new IndexOf(); return indexof; }
+    public JS.Callable indexof = null;
+    public JS.Callable indexof() { if (indexof == null) indexof = new IndexOf(); return indexof; }
 
     /** a trivial private class to serve as the box.indexof function object */
-    private class IndexOf extends JS.Function {
+    private class IndexOf extends JS.Callable {
         public IndexOf() { this.setSeal(true); }
-        public Object _call(JS.Array args) throws JS.Exn {
+        public Object call(JS.Array args) throws JS.Exn {
             if (args.length() != 1 || args.elementAt(0) == null || !(args.elementAt(0) instanceof Box)) return new Integer(-1);
             Box b = (Box)args.elementAt(0);
             if (b.getParent() != Box.this) {
@@ -374,20 +374,20 @@ public final class Box extends JS.Scope {
 
     /** returns the actual font that should be used to render this box */
     private String font() {
-       if (font != null) return font;
-       if (font == null && cachedFont != null) return cachedFont;
-       if (getParent() != null) return cachedFont = getParent().font();
-       return cachedFont = Platform.getDefaultFont();
+        if (font != null) return font;
+        if (font == null && cachedFont != null) return cachedFont;
+        if (getParent() != null) return cachedFont = getParent().font();
+        return cachedFont = Platform.getDefaultFont();
     }
 
     /** this must be called when a box's font changes */
     void fontChanged() {
-       textupdate();
-       for(Box b = getChild(0); b != null; b = b.nextSibling())
-           if (b.font == null) {
-               b.cachedFont = font();
-               b.fontChanged();
-           }
+        textupdate();
+        for(Box b = getChild(0); b != null; b = b.nextSibling())
+            if (b.font == null) {
+                b.cachedFont = font();
+                b.fontChanged();
+            }
     }
 
     /** This must be called when font or text is changed */
@@ -424,25 +424,25 @@ public final class Box extends JS.Scope {
     }
 
     /** loads the image described by string str, possibly blocking for a network load */
-    static ImageDecoder getImage(String str, final Function callback) {
+    static ImageDecoder getImage(String str, final JS.Callable callback) {
 
         if (str.indexOf(':') == -1) {
             String s = str;
             byte[] b = Resources.getResource(Resources.resolve(s + ".png", null));
-           if (b != null) return PNG.decode(new ByteArrayInputStream(b), str);
+            if (b != null) return PNG.decode(new ByteArrayInputStream(b), str);
             b = Resources.getResource(Resources.resolve(s + ".jpeg", null));
-           if (b != null) return Platform.decodeJPEG(new ByteArrayInputStream(b), str);
-           return null;
+            if (b != null) return Platform.decodeJPEG(new ByteArrayInputStream(b), str);
+            return null;
             
         } else {
-            Thread thread = Thread.currentThread();
+            java.lang.Thread thread = java.lang.Thread.currentThread();
             if (!(thread instanceof ThreadMessage)) {
                 if (Log.on) Log.log(Box.class, "HTTP images can not be loaded from the foreground thread");
                 return null;
             }
             // FIXME: use primitives here
             ThreadMessage mythread = (ThreadMessage)thread;
-            mythread.setPriority(Thread.MIN_PRIORITY);
+            mythread.setPriority(java.lang.Thread.MIN_PRIORITY);
             mythread.done.release();
             try {
                 HTTP http = new HTTP(str);
@@ -460,13 +460,13 @@ public final class Box extends JS.Scope {
                             if (ret != -1) bytesDownloaded += ret;
                             if (clear && callback != null) {
                                 clear = false;
-                                ThreadMessage.newthread(new JS.Function() {
-                                        public Object _call(JS.Array args_) throws JS.Exn {
+                                ThreadMessage.newthread(new JS.Callable() {
+                                        public Object call(JS.Array args_) throws JS.Exn {
                                             try {
-                                               JS.Array args = new JS.Array();
-                                               args.addElement(new Double(bytesDownloaded));
-                                               args.addElement(new Double(contentLength));
-                                               callback.call(args);
+                                                JS.Array args = new JS.Array();
+                                                args.addElement(new Double(bytesDownloaded));
+                                                args.addElement(new Double(contentLength));
+                                                callback.call(args);
                                             } finally {
                                                 clear = true;
                                             }
@@ -480,7 +480,7 @@ public final class Box extends JS.Scope {
 
                 if (str.endsWith(".gif")) return GIF.decode(is, str);
                 else if (str.endsWith(".jpeg") || str.endsWith(".jpg")) return Platform.decodeJPEG(is, str);
-               else return PNG.decode(is, str);
+                else return PNG.decode(is, str);
 
             } catch (IOException e) {
                 if (Log.on) Log.log(Box.class, "error while trying to load an image from " + str);
@@ -489,7 +489,7 @@ public final class Box extends JS.Scope {
 
             } finally {
                 MessageQueue.add(mythread);
-                mythread.setPriority(Thread.NORM_PRIORITY);
+                mythread.setPriority(java.lang.Thread.NORM_PRIORITY);
                 mythread.go.block();
             }
         }
@@ -518,9 +518,9 @@ public final class Box extends JS.Scope {
         } else {
             image = getPicture(s);
             if (image == null) {
-                if (Log.on) Log.log(Box.class, "unable to load image " + s + " at " + JS.getCurrentFunctionSourceName());
+                if (Log.on) Log.logJS(Box.class, "unable to load image " + s);
                 return;
-           }
+            }
             if (sizetoimage) syncSizeToImage();
             dirty();
         }
@@ -539,7 +539,7 @@ public final class Box extends JS.Scope {
             if (border == null) {
                 ImageDecoder id = getImage(s, null);
                 if (id == null) {
-                    if (Log.on) Log.log(this, "unable to load border image " + s + " at " + JS.getCurrentFunctionSourceName());
+                    if (Log.on) Log.logJS(this, "unable to load border image " + s);
                     return;
                 }
                 int[] data = id.getData();
@@ -634,7 +634,7 @@ public final class Box extends JS.Scope {
     }
 
     /** creates a new box from an anonymous template; <tt>ids</tt> is passed through to Template.apply() */
-    Box(Template anonymous, Vec pboxes, Vec ptemplates, Function callback, int numerator, int denominator) {
+    Box(Template anonymous, Vec pboxes, Vec ptemplates, JS.Callable callback, int numerator, int denominator) {
         super(null);
         set(dmax, 0, Integer.MAX_VALUE);
         set(dmax, 1, Integer.MAX_VALUE);
@@ -646,7 +646,7 @@ public final class Box extends JS.Scope {
 
     /** creates a new box from an unresolved templatename and an importlist; use "box" for an untemplatized box */
     public Box(String templatename, String[] importlist) { this(templatename, importlist, null); }
-    public Box(String templatename, String[] importlist, Function callback) {
+    public Box(String templatename, String[] importlist, JS.Callable callback) {
         super(null);
         set(dmax, 0, Integer.MAX_VALUE);
         set(dmax, 1, Integer.MAX_VALUE);
@@ -711,12 +711,12 @@ public final class Box extends JS.Scope {
             for(Box cur = this; cur != null && (cur == this || cur == this.getParent()); cur = cur.getParent()) {
                 cur.dirty(pos(0) + min(oldsize(0) - bw, size(0) - bw),
                           pos(1),
-                          Math.abs(oldsize(0) - size(0)) + bw,
+                          java.lang.Math.abs(oldsize(0) - size(0)) + bw,
                           max(oldsize(1), size(1)));
                 cur.dirty(pos(0),
                           pos(1) + min(oldsize(1) - bh, size(1) - bh),
                           max(oldsize(0), size(0)),
-                          Math.abs(oldsize(1) - size(1)) + bh);
+                          java.lang.Math.abs(oldsize(1) - size(1)) + bh);
             }
             
         // SLOWPATH: dirty ourselves, as well as our former position on our parent
@@ -740,15 +740,14 @@ public final class Box extends JS.Scope {
 
         if (++surface.sizePosChangesSinceLastRender >= 500) {
             if (surface.sizePosChangesSinceLastRender == 500) {
-                if (Log.on) Log.log(this, "Warning, more than 500 SizeChange/PosChange traps triggered since last complete render");
-                if (Log.on) Log.log(this, "    interpreter is at " + JS.getCurrentFunctionSourceName());
-           /*
+                if (Log.on) Log.logJS(this, "Warning, more than 500 SizeChange/PosChange traps triggered since last complete render");
+            /*
                 try {
                     Trap t = sizechange ? Trap.getTrap(this, "SizeChange") : Trap.getTrap(this, "PosChange");
-                    InterpretedFunction f = (InterpretedFunction)t.f;
+                    InterpretedJS.Callable f = (InterpretedJS.Callable)t.f;
                     if (Log.on) Log.log(this, "Current trap is at " + f.getSourceName() + ":" + f.getLineNumbers()[0]);
                 } catch (Throwable t) { }
-           */
+            */
             }
         } else {
             if (sizechange) put("SizeChange", Boolean.TRUE);
@@ -1062,7 +1061,7 @@ public final class Box extends JS.Scope {
     public Object get(int i) {
         if (redirect == null) return null;
         if (redirect != this) return redirect.get(i);
-        return i >= numChildren() ? null : getChild(i);
+        return i >= numChildren() || i < 0 ? null : getChild(i);
     }
 
     /**
@@ -1072,12 +1071,12 @@ public final class Box extends JS.Scope {
      *  WARNING: O(n) runtime, unless i == numChildren()
      */
     public void put(int i, Object value) {
+        if (i < 0) return;
 
         if (value != null && !(value instanceof Box)) {
-            if (Log.on) Log.log(this, "attempt to set a numerical property on a box to anything other than a box at " + JS.getCurrentFunctionSourceName());
-
+            if (Log.on) Log.logJS(this, "attempt to set a numerical property on a box to anything other than a box");
         } else if (redirect == null) {
-            if (Log.on) Log.log(this, "attempt to add/remove children to/from a node with a null redirect at " +  JS.getCurrentFunctionSourceName());
+            if (Log.on) Log.logJS(this, "attempt to add/remove children to/from a node with a null redirect");
         } else if (redirect != this) {
             Box b = value == null ? (Box)redirect.get(i) : (Box)value;
             redirect.put(i, value);
@@ -1091,7 +1090,7 @@ public final class Box extends JS.Scope {
             }
 
         } else if (value instanceof RootProxy) {
-            if (Log.on) Log.log(this, "attempt to reparent a box via its proxy object at " + JS.getCurrentFunctionSourceName());
+            if (Log.on) Log.logJS(this, "attempt to reparent a box via its proxy object");
 
         } else {
             Box newnode = (Box)value;
@@ -1099,14 +1098,15 @@ public final class Box extends JS.Scope {
             // check if box being moved is currently target of a redirect
             for(Box cur = newnode.getParent(); cur != null; cur = cur.getParent())
                 if (cur.redirect == newnode) {
-                    if (Log.on) Log.log(this, "attempt to move a box that is the target of a redirect at "+ JS.getCurrentFunctionSourceName());
+                    if (Log.on) Log.logJS(this, "attempt to move a box that is the target of a redirect");
                     return;
                 }
 
             // check for recursive ancestor violation
             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 " + JS.getCurrentFunctionSourceName());
+                    if (Log.on) Log.logJS(this, "attempt to make a node a parent of its own ancestor");
+                    if (Log.on) Log.log(this, "box == " + this + "  ancestor == " + newnode);
                     return;
                 }
 
@@ -1161,9 +1161,9 @@ public final class Box extends JS.Scope {
     
     public Object get(Object name) { return get(name, false); }
     public Object get(Object name_, boolean ignoretraps) {
-       if (name_ instanceof Number) return get(((Number)name_).intValue());
+        if (name_ instanceof Number) return get(((Number)name_).intValue());
 
-       String name = (String)name_;
+        String name = (String)name_;
         if (name.equals("")) return null;
 
         // See if we're reading back the function value of a trap
@@ -1184,14 +1184,13 @@ public final class Box extends JS.Scope {
 
         Object ret = super.get(name);
         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; " +
-                                JS.getFileAndLine());
+            if (Log.on) Log.logJS(this, "WARNING: attempt to access " + name + ", but no child with id=\"" + name.substring(1) + "\" found");
         return ret;
     }
 
     public Object[] keys() {
         Object[] ret = new Object[numChildren()];
-        for(int i=0; i<ret.length; i++) ret[i] = get(i);
+        for(int i=0; i<ret.length; i++) ret[i] = new Integer(i);
         return ret;
     }
 
@@ -1203,18 +1202,19 @@ public final class Box extends JS.Scope {
     public void put(Object name, Object value) { put(name, value, false, null); }
     public void put(Object name, Object value, boolean ignoretraps) { put(name, value, ignoretraps, null); }
     public void put(Object name_, Object value, boolean ignoretraps, RootProxy rp) {
-       if (name_ instanceof Number) { put(((Number)name_).intValue(), value); return; }
-       String name = (String)name_;
+        if (name_ instanceof Number) { put(((Number)name_).intValue(), value); return; }
+        String name = (String)name_;
+        if (name == null) return;  // FIXME, shouldn't be necessary
         if (name.startsWith("xwt_")) {
-            if (Log.on) Log.log(this, "attempt to set reserved property " + name + " at " + JS.getFileAndLine());
+            if (Log.on) Log.logJS(this, "attempt to set reserved property " + name);
             return;
-       }
+        }
 
         if (!ignoretraps && traps != null) {
             Trap t = (Trap)traps.get(name);
             if (t != null) {
                 JS.Array arg = new JS.Array();
-               arg.addElement(value);
+                arg.addElement(value);
                 t.perform(arg);
                 arg.setElementAt(null, 0);
                 return;
@@ -1231,23 +1231,25 @@ public final class Box extends JS.Scope {
         }
 
         if (name.charAt(0) == '_') {
-            if (value != null && !(value instanceof Function)) {
-                if (Log.on) Log.log(this, "attempt to put a non-function value to " + name + " at " + JS.getFileAndLine());
+            if (value != null && !(value instanceof JS.Callable)) {
+                if (Log.on) Log.logJS(this, "attempt to put a non function value (" + value + ") to " + name);
+            } else if (value != null && !(value instanceof JS.CompiledFunction)) {
+                if (Log.on) Log.logJS(this, "attempt to put a non-compiled function value (" + value + ") to " + name);
             } else if (name.charAt(1) == '_') {
                 name = name.substring(2).intern();
                 Trap t = Trap.getTrap(this, name);
                 if (t != null) t.delete();
-                if (value != null) Trap.addTrap(this, name, ((Function)value), true, rp);
+                if (value != null) Trap.addTrap(this, name, ((JS.CompiledFunction)value), true, rp);
             } else {
                 name = name.substring(1).intern();
                 Trap t = Trap.getTrap(this, name);
                 if (t != null) t.delete();
-                if (value != null) Trap.addTrap(this, name, ((Function)value), false, rp);
+                if (value != null) Trap.addTrap(this, name, ((JS.CompiledFunction)value), false, rp);
             }
             return;
         }
 
-       super.put(name, value);
+        super.put(name, value);
 
         // a bit of a hack, since titlebar is the only 'special' property stored in JSObject
         if (getParent() == null && surface != null) {
@@ -1290,7 +1292,7 @@ public final class Box extends JS.Scope {
     
     /** remove this node from its parent; INVARIANT: whenever the parent of a node is changed, remove() gets called. */
     public void remove() {
-       cachedFont = null;
+        cachedFont = null;
         if (parent == null) {
             if (surface != null) surface.dispose(true);
             return;
@@ -1502,4 +1504,3 @@ public final class Box extends JS.Scope {
 }
 
 
-