X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fcore%2FBox.java;h=b6dcdf57fabaadd1b064c84ba048ffd61bc0edd2;hp=29cd9bcb57e88acbd0eff7c3fa500e7956c73de4;hb=281809f6b87f0abc7b944795c05b1131a4495895;hpb=76982fccac3c46ccc47621dd22dc0c96b6b9cd62 diff --git a/src/org/ibex/core/Box.java b/src/org/ibex/core/Box.java index 29cd9bc..b6dcdf5 100644 --- a/src/org/ibex/core/Box.java +++ b/src/org/ibex/core/Box.java @@ -1,5 +1,8 @@ +// Copyright 2000-2005 the Contributors, as shown in the revision logs. +// Licensed under the GNU General Public License version 2 ("the License"). +// You may not use this file except in compliance with the License. + // FIXME -// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] package org.ibex.core; // FIXME: are traps on x/y meaningful? @@ -38,7 +41,9 @@ import org.ibex.graphics.*; * trigger a Surface.abort; if rendering were done in the same pass, * rendering work done prior to the Surface.abort would be wasted. */ -public final class Box extends JSScope implements Task { +public final class Box extends JS.Obj implements Callable { + + private static final JS.Method METHOD = new JS.Method(); // Macros ////////////////////////////////////////////////////////////////////// @@ -46,18 +51,16 @@ public final class Box extends JSScope implements Task { final void RECONSTRAIN() { for(Box b2 = this; b2 != null && !b2.test(RECONSTRAIN); b2 = b2.parent) b2.set(RECONSTRAIN); } final void REPACK() { for(Box b2 = this; b2 != null && !b2.test(REPACK); b2 = b2.parent) b2.set(REPACK); } - //#define CHECKSET_SHORT(prop) short nu = (short)toInt(value); if (nu == prop) break; prop = nu; - //#define CHECKSET_INT(prop) int nu = toInt(value); if (nu == prop) break; prop = nu; - //#define CHECKSET_FLAG(flag) boolean nu = toBoolean(value); if (nu == test(flag)) break; if (nu) set(flag); else clear(flag); - //#define CHECKSET_BOOLEAN(prop) boolean nu = toBoolean(value); if (nu == prop) break; prop = nu; - //#define CHECKSET_STRING(prop) if ((value==null&&prop==null)||(value!=null&&JS.toString(value).equals(prop))) break; prop=JS.toString(value); - - public Box() { super(null); } + //#define CHECKSET_SHORT(prop) short nu = (short)JSU.toInt(value); if (nu == prop) break; prop = nu; + //#define CHECKSET_INT(prop) int nu = JSU.toInt(value); if (nu == prop) break; prop = nu; + //#define CHECKSET_FLAG(flag) boolean nu = JSU.toBoolean(value); if (nu == test(flag)) break; if (nu) set(flag); else clear(flag); + //#define CHECKSET_BOOLEAN.N(prop) boolean nu = JSU.toBoolean(value); if (nu == prop) break; prop = nu; + //#define CHECKSET_STRING(prop) if ((value==null&&prop==null)||(value!=null&&JSU.toString(value).equals(prop))) break; prop=JSU.toString(value); // FIXME memory leak - static Hash boxToCursor = new Hash(500, 3); + static Basket.Map boxToCursor = new Basket.Hash(500, 3); - static final Font DEFAULT_FONT = Font.getFont((Stream)Main.builtin.get(JS.S("fonts/vera/Vera.ttf")), 10); + public static final Font DEFAULT_FONT = Font.getFont(Main.vera, 10); // Flags ////////////////////////////////////////////////////////////////////// @@ -78,11 +81,6 @@ public final class Box extends JSScope implements Task { static final int RECONSTRAIN = 0x00000200; static final int REPLACE = 0x00000400; - static final int ALIGN_TOP = 0x00001000; - static final int ALIGN_BOTTOM = 0x00002000; - static final int ALIGN_LEFT = 0x00004000; - static final int ALIGN_RIGHT = 0x00008000; - static final int ALIGNS = 0x0000f000; static final int CURSOR = 0x00010000; // if true, this box has a cursor in the cursor hash; FEATURE: GC issues? static final int CLIP = 0x00020000; static final int STOP_UPWARD_PROPAGATION = 0x00040000; @@ -95,6 +93,8 @@ public final class Box extends JSScope implements Task { Box redirect = this; int flags = VISIBLE | PACKED | REPACK | RECONSTRAIN | REPLACE | FIXED | STOP_UPWARD_PROPAGATION | CLIP | MOVED; + private BalancedTree bt; + private String text = null; private Font font = DEFAULT_FONT; private Picture texture = null; @@ -109,6 +109,10 @@ public final class Box extends JSScope implements Task { public int maxwidth = Integer.MAX_VALUE; public int minheight = 0; public int maxheight = Integer.MAX_VALUE; + public int minwidth() { return minwidth; } + public int minheight() { return minheight; } + public int maxwidth() { return maxwidth; } + public int maxheight() { return maxheight; } private short rows = 1; private short cols = 0; private short rowspan = 1; @@ -138,13 +142,14 @@ public final class Box extends JSScope implements Task { public final int fontSize() { return font == null ? DEFAULT_FONT.pointsize : font.pointsize; } /** invoked when a resource needed to render ourselves finishes loading */ - public void perform() throws JSExn { - if (texture == null) { Log.warn(Box.class, "perform() called with null texture"); return; } + public Object run(Object o) throws JSExn { + if (texture == null) { Log.warn(Box.class, "perform() called with null texture"); return null; } if (texture.isLoaded) { setWidth(max(texture.width, minwidth), maxwidth); setHeight(max(texture.height, minheight), maxheight); dirty(); } else { JS res = texture.stream; texture = null; throw new JSExn("image not found: "+res.unclone()); } + return null; } // FEATURE: use cx2/cy2 format @@ -230,11 +235,12 @@ public final class Box extends JSScope implements Task { set(REPLACE); // FIXME: be smarter / more incremental } - private final static JS SIZECHANGE = JS.S("SizeChange"); + private final static JS SIZECHANGE = JSU.S("SizeChange"); void resize(int x, int y, int width, int height) { if (x == this.x && y == this.y && width == this.width && height == this.height) return; - boolean sizechange = (this.width != width || this.height != height) && hasTrap(SIZECHANGE); + boolean sizechange = (this.width != width || this.height != height); + try { sizechange = sizechange && getTrap(SIZECHANGE) != null; } catch (JSExn e) {} int thisx = parent == null ? 0 : this.x; int thisy = parent == null ? 0 : this.y; Box who = (parent == null ? this : parent); @@ -250,7 +256,7 @@ public final class Box extends JSScope implements Task { this.width = width; this.height = height; this.x = x; this.y = y; dirty(); } - if (sizechange) putAndTriggerTrapsAndCatchExceptions(SIZECHANGE, T); + if (sizechange) putAndTriggerTrapsAndCatchExceptions(SIZECHANGE, JSU.T); } private float targetColumnSize = (float)0.0; @@ -358,13 +364,13 @@ public final class Box extends JSScope implements Task { child_height = max(child.minheight, child_height); int gap_x = width - child_width; int gap_y = height - child_height; - child_x = child.ax + (child.test(ALIGN_RIGHT) ? gap_x : !child.test(ALIGN_LEFT) ? gap_x / 2 : 0); - child_y = child.ay + (child.test(ALIGN_BOTTOM) ? gap_y : !child.test(ALIGN_TOP) ? gap_y / 2 : 0); + child_x = child.ax + gap_x / 2; + child_y = child.ay + gap_y / 2; } else { int diff; //#repeat col/row colspan/rowspan contentwidth/contentheight width/height colMaxWidth/rowMaxHeight \ // child_x/child_y x/y HSHRINK/VSHRINK maxwidth/maxheight cols/rows minwidth/minheight x_slack/y_slack \ - // child_width/child_height ALIGN_RIGHT/ALIGN_BOTTOM ALIGN_LEFT/ALIGN_TOP lp_h/lp \ + // child_width/child_height lp_h/lp \ // numregions/numregions_v regions/regions_v targetColumnSize/targetRowSize sizes/sizes_v child_x = 0; if (cols == 1) { @@ -377,7 +383,7 @@ public final class Box extends JSScope implements Task { } } diff = (child_width - (child.test(HSHRINK) ? child.contentwidth : min(child_width, child.maxwidth))); - child_x += (child.test(ALIGN_RIGHT) ? diff : child.test(ALIGN_LEFT) ? 0 : diff / 2); + child_x += diff / 2; child_width -= diff; //#end } @@ -421,12 +427,12 @@ public final class Box extends JSScope implements Task { if (text != null && !text.equals("") && font != null) { int gap_x = width - font.textwidth(text); int gap_y = height - font.textheight(text); - int text_x = globalx + (test(ALIGN_RIGHT) ? gap_x : !test(ALIGN_LEFT) ? gap_x/2 : 0); - int text_y = globaly + (test(ALIGN_BOTTOM) ? gap_y : !test(ALIGN_TOP) ? gap_y/2 : 0); + int text_x = globalx + gap_x/2; + int text_y = globaly + gap_y/2; font.rasterizeGlyphs(text, buf, strokecolor, text_x, text_y, cx1, cy1, cx2, cy2); } - if (path != null) path.realize(Affine.translate(globalx, globaly)).stroke(buf, 1, strokecolor); + if (path != null) new Polygon(path, Affine.translate(globalx, globaly)).stroke(buf, strokecolor); for(Box b = getChild(0); b != null; b = b.nextSibling()) b.render(globalx, globaly, cx1, cy1, cx2, cy2, buf, null); @@ -434,103 +440,100 @@ public final class Box extends JSScope implements Task { // Methods to implement org.ibex.js.JS ////////////////////////////////////// - - public JS callMethod(JS method, JS a0, JS a1, JS a2, JS[] rest, int nargs) throws JSExn { - switch (nargs) { + public JS call(JS method, JS[] args) throws JSExn { + switch (args.length) { case 1: { - //#switch(JS.toString(method)) + //#switch(JSU.toString(method)) case "indexof": - Box b = (Box)a0; + Box b = (Box)args[0]; if (b.parent != this) return (redirect == null || redirect == this) ? - N(-1) : - redirect.callMethod(method, a0, a1, a2, rest, nargs); - return N(b.getIndexInParent()); + JSU.N(-1) : redirect.call(method, args); + return JSU.N(b.getIndexInParent()); case "distanceto": - Box b = (Box)a0; - JS ret = new JS.O(); - ret.put(JS.S("x"), N(b.localToGlobalX(0) - localToGlobalX(0))); - ret.put(JS.S("y"), N(b.localToGlobalY(0) - localToGlobalY(0))); + Box b = (Box)args[0]; + JS ret = new JS.Obj(); + ret.put(JSU.S("x"), JSU.N(b.localToGlobalX(0) - localToGlobalX(0))); + ret.put(JSU.S("y"), JSU.N(b.localToGlobalY(0) - localToGlobalY(0))); return ret; //#end } } - return super.callMethod(method, a0, a1, a2, rest, nargs); + return super.call(method, args); } public JS get(JS name) throws JSExn { - if (JS.isInt(name)) - return redirect == null ? null : redirect == this ? getChild(JS.toInt(name)) : redirect.get(name); + if (JSU.isInt(name)) + return redirect == null ? null : redirect == this ? getChild(JSU.toInt(name)) : redirect.get(name); - //#switch(JS.toString(name)) + //#switch(JSU.toString(name)) case "surface": return parent == null ? null : parent.getAndTriggerTraps(name); case "indexof": return METHOD; case "distanceto": return METHOD; - case "text": return JS.S(text); + case "text": return JSU.S(text); case "path": { - if (path != null) return JS.S(path.toString()); + if (path != null) return JSU.S(path.toString()); if (text == null) return null; if (font == null) return null; String ret = ""; for(int i=0; i 0) { CHECKSET_SHORT(colspan); if (parent != null) parent.REPACK(); } - case "rowspan": if (toInt(value) > 0) { CHECKSET_SHORT(rowspan); if (parent != null) parent.REPACK(); } + case "path": path = new Path(JSU.toString(value)); RECONSTRAIN(); dirty(); + case "width": setWidth(JSU.toInt(value), JSU.toInt(value)); + case "height": setHeight(JSU.toInt(value), JSU.toInt(value)); + case "maxwidth": setWidth(minwidth, JSU.toInt(value)); + case "minwidth": setWidth(JSU.toInt(value), maxwidth); + case "maxheight": setHeight(minheight, JSU.toInt(value)); + case "minheight": setHeight(JSU.toInt(value), maxheight); + case "colspan": if (JSU.toInt(value) > 0) { CHECKSET_SHORT(colspan); if (parent != null) parent.REPACK(); } + case "rowspan": if (JSU.toInt(value) > 0) { CHECKSET_SHORT(rowspan); if (parent != null) parent.REPACK(); } case "visible": CHECKSET_FLAG(VISIBLE); RECONSTRAIN(); dirty(); case "packed": CHECKSET_FLAG(PACKED); if (parent != null) { parent.REPACK(); } else { REPACK(); } - case "align": clear(ALIGNS); setAlign(value == null ? "center" : JS.toString(value)); REPLACE(); - case "cursor": setCursor(JS.toString(value)); + case "cursor": setCursor(JSU.toString(value)); case "fill": setFill(value); case "clip": CHECKSET_FLAG(CLIP); if (parent == null) dirty(); else parent.dirty(); case "rows": CHECKSET_SHORT(rows); if (rows==0){set(FIXED, COLS);if(cols==0)cols=1;} else set(FIXED, ROWS); REPACK(); @@ -580,23 +582,23 @@ public final class Box extends JSScope implements Task { // FIXME: remove case "mouse": - int mousex = toInt(((JS)value).get(JS.S("x"))); - int mousey = toInt(((JS)value).get(JS.S("y"))); + int mousex = JSU.toInt(((JS)value).get(JSU.S("x"))); + int mousey = JSU.toInt(((JS)value).get(JSU.S("y"))); getSurface()._mousex = localToGlobalX(mousex); getSurface()._mousey = localToGlobalY(mousey); - case "Minimized": if (parent == null && getSurface() != null) getSurface().minimized = toBoolean(value); // FEATURE - case "Maximized": if (parent == null && getSurface() != null) getSurface().maximized = toBoolean(value); // FEATURE + case "Minimized": if (parent == null && getSurface() != null) getSurface().minimized = JSU.toBoolean(value); // FEATURE + case "Maximized": if (parent == null && getSurface() != null) getSurface().maximized = JSU.toBoolean(value); // FEATURE case "Close": if (parent == null && getSurface() != null) getSurface().dispose(true); case "redirect": for(Box cur = (Box)value; cur != null || cur == redirect; cur = cur.parent) if (cur == redirect) { redirect = (Box)value; return; } - JS.error("redirect can only be set to a descendant of its current value"); - case "fontsize": font = Font.getFont(font == null ? null : font.stream, toInt(value)); RECONSTRAIN(); dirty(); + JSU.error("redirect can only be set to a descendant of its current value"); + case "fontsize": font = Font.getFont(font == null ? null : font.stream, JSU.toInt(value)); RECONSTRAIN(); dirty(); case "font": - if(!(value instanceof Stream)) throw new JSExn("You can only put streams to the font property"); + if(!(value instanceof Fountain)) throw new JSExn("You can only put streams to the font property"); //FIXME: if (font == value) return; // FIXME: unclone() - font = value == null ? null : Font.getFont((Stream)value, font == null ? 10 : font.pointsize); + font = value == null ? null : Font.getFont((Fountain)value, font == null ? 10 : font.pointsize); RECONSTRAIN(); dirty(); case "x": if (parent==null && Surface.fromBox(this)!=null) { @@ -613,7 +615,7 @@ public final class Box extends JSScope implements Task { CHECKSET_INT(ay); REPLACE(); } - case "titlebar": if (getSurface()!=null) getSurface().setTitleBarText(toString(value)); super.put(name,value); + case "titlebar": if (getSurface()!=null) getSurface().setTitleBarText(JSU.toString(value)); super.put(name,value); // FIXME: icon case "Press1": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) parent.putAndTriggerTraps(name, value); @@ -632,9 +634,9 @@ public final class Box extends JSScope implements Task { case "KeyReleased": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) parent.putAndTriggerTraps(name, value); case "Move": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) parent.putAndTriggerTraps(name, value); case "HScroll": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) - parent.putAndTriggerTraps(name, N(JS.toFloat(value) * ((float)parent.fontSize()) / ((float)fontSize()))); + parent.putAndTriggerTraps(name, JSU.N(JSU.toFloat(value) * ((float)parent.fontSize()) / ((float)fontSize()))); case "VScroll": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) - parent.putAndTriggerTraps(name, N(JS.toFloat(value) * ((float)parent.fontSize()) / ((float)fontSize()))); + parent.putAndTriggerTraps(name, JSU.N(JSU.toFloat(value) * ((float)parent.fontSize()) / ((float)fontSize()))); case "_Move": propagateDownward(name, value, false); case "_Press1": propagateDownward(name, value, false); @@ -663,36 +665,6 @@ public final class Box extends JSScope implements Task { //#end } - private String alignToString() { - switch(flags & ALIGNS) { - case (ALIGN_TOP | ALIGN_LEFT): return "topleft"; - case (ALIGN_BOTTOM | ALIGN_LEFT): return "bottomleft"; - case (ALIGN_TOP | ALIGN_RIGHT): return "topright"; - case (ALIGN_BOTTOM | ALIGN_RIGHT): return "bottomright"; - case ALIGN_TOP: return "top"; - case ALIGN_BOTTOM: return "bottom"; - case ALIGN_LEFT: return "left"; - case ALIGN_RIGHT: return "right"; - case 0: return "center"; - default: throw new Error("invalid alignment flags: " + (flags & ALIGNS)); - } - } - - private void setAlign(String value) { - clear(ALIGNS); - //#switch(value) - case "topleft": set(ALIGN_TOP | ALIGN_LEFT); - case "bottomleft": set(ALIGN_BOTTOM | ALIGN_LEFT); - case "topright": set(ALIGN_TOP | ALIGN_RIGHT); - case "bottomright": set(ALIGN_BOTTOM | ALIGN_RIGHT); - case "top": set(ALIGN_TOP); - case "bottom": set(ALIGN_BOTTOM); - case "left": set(ALIGN_LEFT); - case "right": set(ALIGN_RIGHT); - default: JS.log("invalid alignment \"" + value + "\""); - //#end - } - private void setCursor(String value) throws JSExn { if (value == null) { clear(CURSOR); boxToCursor.remove(this); return; } if (value.equals(boxToCursor.get(this))) return; @@ -710,8 +682,8 @@ public final class Box extends JSScope implements Task { if (texture == null && fillcolor == 0) return; texture = null; fillcolor = 0; - } else if (JS.isString(value)) { - int newfillcolor = Color.stringToColor(JS.toString(value)); + } else if (JSU.isString(value)) { + int newfillcolor = Color.stringToColor(JSU.toString(value)); if (newfillcolor == fillcolor) return; fillcolor = newfillcolor; texture = null; @@ -720,7 +692,7 @@ public final class Box extends JSScope implements Task { if (texture == newtex) return; texture = newtex; fillcolor = 0; - if (texture != null && texture.isLoaded) perform(); + if (texture != null && texture.isLoaded) run(null); } dirty(); } @@ -731,7 +703,7 @@ public final class Box extends JSScope implements Task { */ private void propagateDownward(JS name_, JS value, boolean obscured) throws JSExn { - String name = JS.toString(name_); + String name = JSU.toString(name_); if (getSurface() == null) return; int x = globalToLocalX(getSurface()._mousex); int y = globalToLocalY(getSurface()._mousey); @@ -739,12 +711,12 @@ public final class Box extends JSScope implements Task { boolean isinside = test(VISIBLE) && inside(x, y) && !obscured; if (!wasinside && isinside) { set(MOUSEINSIDE); - putAndTriggerTrapsAndCatchExceptions(JS.S("Enter"), T); + putAndTriggerTrapsAndCatchExceptions(JSU.S("Enter"), JSU.T); } if (isinside && test(CURSOR)) getSurface().cursor = (String)boxToCursor.get(this); if (wasinside && !isinside) { clear(MOUSEINSIDE); - putAndTriggerTrapsAndCatchExceptions(JS.S("Leave"), T); + putAndTriggerTrapsAndCatchExceptions(JSU.S("Leave"), JSU.T); } boolean found = false; @@ -753,7 +725,7 @@ public final class Box extends JSScope implements Task { boolean save_stop = child.test(STOP_UPWARD_PROPAGATION); JS value2 = value; if (name.equals("_HScroll") || name.equals("_VScroll")) - value2 = N(JS.toFloat(value) * ((float)child.fontSize()) / (float)fontSize()); + value2 = JSU.N(JSU.toFloat(value) * ((float)child.fontSize()) / (float)fontSize()); if (obscured || !child.inside(x - child.x, y - child.y)) { child.propagateDownward(name_, value2, true); } else try { @@ -772,7 +744,7 @@ public final class Box extends JSScope implements Task { if (!obscured && !found) if ("_Move".equals(name) || name.startsWith("_Release") || wasinside) if (name != null) - putAndTriggerTrapsAndCatchExceptions(JS.S(name.substring(1)), value); + putAndTriggerTrapsAndCatchExceptions(JSU.S(name.substring(1)), value); } /** figures out what box in this subtree of the Box owns the pixel at x,y relitave to the Surface */ @@ -863,34 +835,34 @@ public final class Box extends JSScope implements Task { deleteNode(i); b.parent = null; REPACK(); - putAndTriggerTrapsAndCatchExceptions(JS.S("ChildChange"), b); + putAndTriggerTrapsAndCatchExceptions(JSU.S("ChildChange"), b); } public void put(int i, JS value) throws JSExn { if (i < 0) return; if (value != null && !(value instanceof Box)) { - if (Log.on) JS.warn("attempt to set a numerical property on a box to a non-box"); + if (Log.on) JSU.warn("attempt to set a numerical property on a box to a non-box"); return; } if (redirect == null) { - if (value == null) putAndTriggerTrapsAndCatchExceptions(JS.S("ChildChange"), getChild(i)); - else JS.warn("attempt to add/remove children to/from a node with a null redirect"); + if (value == null) putAndTriggerTrapsAndCatchExceptions(JSU.S("ChildChange"), getChild(i)); + else JSU.warn("attempt to add/remove children to/from a node with a null redirect"); } else if (redirect != this) { - if (value != null) putAndTriggerTrapsAndCatchExceptions(JS.S("ChildChange"), value); + if (value != null) putAndTriggerTrapsAndCatchExceptions(JSU.S("ChildChange"), value); redirect.put(i, value); if (value == null) { - Box b = (Box)redirect.get(JS.N(i)); - if (b != null) putAndTriggerTrapsAndCatchExceptions(JS.S("ChildChange"), b); + Box b = (Box)redirect.get(JSU.N(i)); + if (b != null) putAndTriggerTrapsAndCatchExceptions(JSU.S("ChildChange"), b); } } else if (value == null) { if (i < 0 || i > treeSize()) return; Box b = getChild(i); removeChild(i); - putAndTriggerTrapsAndCatchExceptions(JS.S("ChildChange"), b); + putAndTriggerTrapsAndCatchExceptions(JSU.S("ChildChange"), b); } else { Box b = (Box)value; @@ -898,14 +870,14 @@ public final class Box extends JSScope implements Task { // check if box being moved is currently target of a redirect for(Box cur = b.parent; cur != null; cur = cur.parent) if (cur.redirect == b) { - if (Log.on) JS.warn("attempt to move a box that is the target of a redirect"); + if (Log.on) JSU.warn("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.parent) if (cur == b) { - if (Log.on) JS.warn("attempt to make a node a parent of its own ancestor"); + if (Log.on) JSU.warn("attempt to make a node a parent of its own ancestor"); if (Log.on) Log.info(this, "box == " + this + " ancestor == " + b); return; } @@ -919,7 +891,7 @@ public final class Box extends JSScope implements Task { REPACK(); b.dirty(); - putAndTriggerTrapsAndCatchExceptions(JS.S("ChildChange"), b); + putAndTriggerTrapsAndCatchExceptions(JSU.S("ChildChange"), b); } } @@ -927,11 +899,22 @@ public final class Box extends JSScope implements Task { try { putAndTriggerTraps(name, val); } catch (JSExn e) { - JS.log("caught js exception while putting to trap \""+ JS.debugToString(name)+"\""); - JS.log(e); + JSU.log("caught js exception while putting to trap \""+ JSU.str(name)+"\""); + JSU.log(e); } catch (Exception e) { - JS.log("caught exception while putting to trap \""+ JS.debugToString(name)+"\""); - JS.log(e); + JSU.log("caught exception while putting to trap \""+ JSU.str(name)+"\""); + JSU.log(e); } } + + // BalancedTree functions + private void insertNode(int p, Box b) { + if(bt == null) bt = new BalancedTree(); + bt.insertNode(p,b); + } + + private int treeSize() { return bt == null ? 0 : bt.treeSize(); } + private int indexNode(Box b) { return bt == null ? -1 : bt.indexNode(b); } + private void deleteNode(int p) { bt.deleteNode(p); } + private Box getNode(int p) { return (Box)bt.getNode(p); } }