From 9c2602143956cd39ecf5ef4c9eb31f5f56b5bd66 Mon Sep 17 00:00:00 2001 From: brian Date: Fri, 30 Jan 2004 07:44:05 +0000 Subject: [PATCH] 2004/01/07 20:37:32 darcs-hash:20040130074405-aa32f-af4bbff1dc76f9d93088f164905b2683c0f08377.gz --- src/org/xwt/Box.java | 36 +++++++++++++++------- src/org/xwt/Font.java | 2 +- src/org/xwt/Scheduler.java | 3 +- src/org/xwt/Template.java | 19 +++++++----- src/org/xwt/XWT.java | 9 ++++-- src/org/xwt/js/Interpreter.java | 65 +++++++++++++++++++++------------------ 6 files changed, 82 insertions(+), 52 deletions(-) diff --git a/src/org/xwt/Box.java b/src/org/xwt/Box.java index c39823e..c4f34e5 100644 --- a/src/org/xwt/Box.java +++ b/src/org/xwt/Box.java @@ -479,7 +479,7 @@ public final class Box extends JSScope implements Scheduler.Task { case "y": return N(globalToLocalY(getSurface()._mousey)); // this might not get recomputed if we change mousex/mousey... - case "inside": return B(MOUSEINSIDE); + case "inside": return B(test(MOUSEINSIDE)); //#end return null; } @@ -533,11 +533,18 @@ public final class Box extends JSScope implements Scheduler.Task { case "Maximized": if (parent == null && getSurface() != null) getSurface().maximized = toBoolean(value); // FEATURE case "Close": if (parent == null && getSurface() != null) getSurface().dispose(true); case "redirect": if (redirect == this) redirect = (Box)value; else Log.info(this, "redirect can only be set once"); - case "font": font = value == null ? null : Font.getFont((Stream)value, font == null ? 10 : font.pointsize); MARK_RESIZE; dirty(); + case "font": + if(!(value instanceof Stream)) throw new JSExn("You can only put streams to the font property"); + font = value == null ? null : Font.getFont((Stream)value, font == null ? 10 : font.pointsize); + MARK_RESIZE; + dirty(); case "fontsize": font = Font.getFont(font == null ? null : font.res, toInt(value)); MARK_RESIZE; dirty(); case "x": if (parent==null && Surface.fromBox(this)!=null) { CHECKSET_INT(x); } else { if (test(PACKED) && parent != null) return; CHECKSET_INT(x); dirty(); MARK_RESIZE; dirty(); } case "y": if (parent==null && Surface.fromBox(this)!=null) { CHECKSET_INT(y); } else { if (test(PACKED) && parent != null) return; CHECKSET_INT(y); dirty(); MARK_RESIZE; dirty(); } - + case "titlebar": + if (getSurface() != null && value != null) getSurface().setTitleBarText(JS.toString(value)); + super.put(name,value); + case "Press1": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) parent.putAndTriggerTraps(name, value); case "Press2": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) parent.putAndTriggerTraps(name, value); case "Press3": if (!test(STOP_UPWARD_PROPAGATION) && parent != null) parent.putAndTriggerTraps(name, value); @@ -625,18 +632,22 @@ public final class Box extends JSScope implements Scheduler.Task { if (surface.cursor != tempcursor) surface.syncCursor(); } - private void setFill(Object value) { - if (value == null) return; - if (value instanceof String) { + private void setFill(Object value) throws JSExn { + if (value == null) { + // FIXME: Check this... does this make it transparent? + texture = null; + fillcolor = 0; + } else if (value instanceof String) { // FIXME check double set int newfillcolor = stringToColor((String)value); if (newfillcolor == fillcolor) return; fillcolor = newfillcolor; - dirty(); - return; + } else if(value instanceof Stream) { + texture = Picture.load((Stream)value, this); + } else { + throw new JSExn("fill must be null, a String, or a stream"); } - if (!(value instanceof Stream)) return; - texture = Picture.load((Stream)value, this); + dirty(); } // FIXME: mouse move/release still needs to propagate to boxen in which the mouse was pressed and is still held down @@ -681,7 +692,7 @@ public final class Box extends JSScope implements Scheduler.Task { // FIXME support three-char strings by doubling digits if (s == null) return 0x00000000; else if (SVG.colors.get(s) != null) return 0xFF000000 | toInt(SVG.colors.get(s)); - else if (s.length() > 0 && s.charAt(0) == '#') try { + else if (s.length() == 7 && s.charAt(0) == '#') try { // FEATURE alpha return 0xFF000000 | (Integer.parseInt(s.substring(1, 3), 16) << 16) | @@ -845,6 +856,9 @@ public final class Box extends JSScope implements Scheduler.Task { void putAndTriggerTrapsAndCatchExceptions(Object name, Object val) { try { putAndTriggerTraps(name, val); + } catch (JSExn e) { + JS.log("caught js exception while putting to trap \""+name+"\""); + JS.log(e); } catch (Exception e) { JS.log("caught exception while putting to trap \""+name+"\""); JS.log(e); diff --git a/src/org/xwt/Font.java b/src/org/xwt/Font.java index deb3c07..dc4f41e 100644 --- a/src/org/xwt/Font.java +++ b/src/org/xwt/Font.java @@ -120,7 +120,7 @@ public class Font { Glyph g = (Glyph)glyphsToBeRendered.remove(false); if (g == null) { glyphRenderingTaskIsScheduled = false; return; } if (g.isLoaded) { perform(); /* tailcall to the next glyph */ return; } - Log.info(Glyph.class, "rendering glyph " + g.c); + //Log.info(Glyph.class, "rendering glyph " + g.c); try { freetype.renderGlyph(g); } catch (IOException e) { Log.info(Freetype.class, e); } g.isLoaded = true; Scheduler.add(this); // keep ourselves in the queue until there are no glyphs to render diff --git a/src/org/xwt/Scheduler.java b/src/org/xwt/Scheduler.java index 6867376..5439bf9 100644 --- a/src/org/xwt/Scheduler.java +++ b/src/org/xwt/Scheduler.java @@ -84,7 +84,8 @@ public class Scheduler { renderAll(); } catch (JSExn e) { Log.info(Scheduler.class, "a JavaScript thread spawned with xwt.thread() threw an exception:"); - Log.info(Scheduler.class, e); + Log.info(Scheduler.class, "JS Exception: " + e.getObject() + "\n" + e.backtrace()); + Log.info(Scheduler.class,e); } catch (Exception e) { Log.info(Scheduler.class, "a Task threw an exception which was caught by the scheduler:"); Log.info(Scheduler.class, e); diff --git a/src/org/xwt/Template.java b/src/org/xwt/Template.java index 87d5a63..f85f3a7 100644 --- a/src/org/xwt/Template.java +++ b/src/org/xwt/Template.java @@ -62,7 +62,8 @@ public class Template { r.t = new Template(r); new TemplateHelper().parseit(r.getInputStream(), r.t); return r.t; - } catch (Exception e) { throw new JSExn(e.toString()); + } catch (Exception e) { + throw new JSExn("Error reading template stream: " + r + "\n" + e.toString()); } } @@ -108,15 +109,13 @@ public class Template { * @param pboxes a vector of all box parents on which to put $-references * @param ptemplates a vector of the fileNames to recieve private references on the pboxes */ - void apply(Box b, XWT xwt) { + void apply(Box b, XWT xwt) throws JSExn { try { apply(b, xwt, null); } catch (JSExn e) { b.clear(b.VISIBLE); b.mark_for_repack(); - Log.info(Template.class, "WARNING: exception (below) thrown during application of template;"); - Log.info(Template.class, " setting visibility of target box to \"false\""); - JS.log(e); + throw e; } } @@ -132,10 +131,11 @@ public class Template { } PerInstantiationJSScope pis = new PerInstantiationJSScope(b, xwt, parentPis, staticScope); + for (int i=0; children != null && i 0) { Object o = stack.pop(); if (o instanceof CatchMarker || o instanceof TryMarker) { @@ -489,19 +485,24 @@ class Interpreter implements ByteCodes, Tokens { stack.push(o); stack.push(catchMarker); stack.push(e.getObject()); + f = ((TryMarker)o).f; scope = ((TryMarker)o).scope; pc = ((TryMarker)o).catchLoc - 1; continue OUTER; } else { - stack.push(e); - stack.push(new FinallyData(THROW)); + stack.push(new FinallyData(e)); + f = ((TryMarker)o).f; scope = ((TryMarker)o).scope; pc = ((TryMarker)o).finallyLoc - 1; continue OUTER; } + } else if(o instanceof CallMarker) { + CallMarker cm = (CallMarker) o; + if(cm.f == null) + e.addBacktrace("",0); // This might not even be worth mentioning + else + e.addBacktrace(cm.f.sourceName,cm.f.line[cm.pc-1]); } - // no handler found within this func - if(o instanceof CallMarker) throw e; } throw e; } // end try/catch @@ -536,17 +537,21 @@ class Interpreter implements ByteCodes, Tokens { public int catchLoc; public int finallyLoc; public JSScope scope; - public TryMarker(int catchLoc, int finallyLoc, JSScope scope) { + public JSFunction f; + public TryMarker(int catchLoc, int finallyLoc, Interpreter cx) { this.catchLoc = catchLoc; this.finallyLoc = finallyLoc; - this.scope = scope; + this.scope = cx.scope; + this.f = cx.f; } } public static class FinallyData { public int op; public Object arg; - public FinallyData(int op, Object arg) { this.op = op; this.arg = arg; } + public JSExn exn; public FinallyData(int op) { this(op,null); } + public FinallyData(int op, Object arg) { this.op = op; this.arg = arg; } + public FinallyData(JSExn exn) { this.exn = exn; } // Just throw this exn } @@ -622,7 +627,7 @@ class Interpreter implements ByteCodes, Tokens { return JS.N(s.lastIndexOf(search,start)); } case "match": return JSRegexp.stringMatch(s,arg0); - case "replace": return JSRegexp.stringReplace(s,(String)arg0,arg1); + case "replace": return JSRegexp.stringReplace(s,arg0,arg1); case "search": return JSRegexp.stringSearch(s,arg0); case "split": return JSRegexp.stringSplit(s,arg0,arg1,alength); case "toLowerCase": return s.toLowerCase(); -- 1.7.10.4