X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java.pp;h=4a1c07aac417a6f2e01ac3045301f1241286bdec;hb=5ef18e2b3993d3c515a0b51a1326b2ad11285f4a;hp=eb8c0c011ccbc643891282b3618d6e9bb0bcee88;hpb=8ea2f2734a60f0c4fa9c82083469165283a8b810;p=org.ibex.core.git diff --git a/src/org/xwt/Box.java.pp b/src/org/xwt/Box.java.pp index eb8c0c0..4a1c07a 100644 --- a/src/org/xwt/Box.java.pp +++ b/src/org/xwt/Box.java.pp @@ -6,9 +6,6 @@ package org.xwt; // RULE: coordinates on non-static methods are ALWAYS relative to the // upper-left hand corner of this -// FIXME: font color, italicization, bolding, and underlining -// FIXME: align -// FIXME: fixed aspect // FEATURE: reflow before allowing js to read from width/height // FEATURE: fastpath for rows=1/cols=1 // FEATURE: reflow starting with a certain child @@ -72,7 +69,7 @@ public final class Box extends JS.Scope { // Misc instance data //////////////////////////////////////////////////////////////// - private static int sizePosChangesSinceLastRender = 0; + static int sizePosChangesSinceLastRender = 0; // Misc instance data //////////////////////////////////////////////////////////////// @@ -85,31 +82,16 @@ public final class Box extends JS.Scope { Box redirect = this; Surface surface = null; // null on all non-root boxen - // FEATURE: combine this with the JSObject Hash - Hash traps = null; - - // Flags /////////////////////////////////////////////////////////////////////////////// + short flags = 0; static int MOUSEINSIDE_FLAG = 0x00000001; static int INVISIBLE_FLAG = 0x00000002; static int ABSOLUTE_FLAG = 0x00000004; - static int HSHRINK_FLAG = 0x00000010; - static int VSHRINK_FLAG = 0x00000020; - static int TILE_FLAG = 0x00000040; - - /** - * Set when the font changes, cleared during repack. If set - * during repack, all font==null children are marked for reflow - * and given the font_changed_flag. We use this flag to avoid - * having to iterate over all descendents of a box when its font - * changes. - */ - static int FONT_CHANGED_FLAG = 0x00000100; - static int ISROOT_FLAG = 0x00000200; - - static int ALIGN_FLAG = 0x00000000; - static int FIXEDASPECT_FLAG = 0x00000000; - int flags = 0; + static int HSHRINK_FLAG = 0x00000008; + static int VSHRINK_FLAG = 0x00000010; + static int TILE_FLAG = 0x00000020; + static int FONT_CHANGED_FLAG = 0x00000040; // set when font changes, cleared during repack + static int ISROOT_FLAG = 0x00000080; // Geometry //////////////////////////////////////////////////////////////////////////// @@ -120,10 +102,10 @@ public final class Box extends JS.Scope { //#define MIN_LENGTH Integer.MIN_VALUE // always correct (set directly by user) - LENGTH minwidth = 0; - LENGTH minheight = 0; - LENGTH maxwidth = MAX_LENGTH; - LENGTH maxheight = MAX_LENGTH; + public LENGTH minwidth = 0; + public LENGTH minheight = 0; + public LENGTH maxwidth = MAX_LENGTH; + public LENGTH maxheight = MAX_LENGTH; private LENGTH hpad = 0; private LENGTH vpad = 0; private String text = null; @@ -139,8 +121,8 @@ public final class Box extends JS.Scope { private int colspan = 1; // computed during reflow - LENGTH x = 0; - LENGTH y = 0; + public LENGTH x = 0; + public LENGTH y = 0; public LENGTH width = 0; public LENGTH height = 0; private int row = 0; // FEATURE use a short @@ -155,7 +137,7 @@ public final class Box extends JS.Scope { //private SVG.Paint fill = null; //private SVG.Paint stroke = null; - private Picture image; // will disappear + public Picture image; // will disappear private int fillcolor = 0x00000000; // will become SVG.Paint private int strokecolor = 0xFF000000; // will become SVG.Paint @@ -167,7 +149,6 @@ public final class Box extends JS.Scope { /** Adds the intersection of (x,y,w,h) and the node's current actual geometry to the Surface's dirty list */ public final void dirty() { dirty(0, 0, width, height); } public final void dirty(int x, int y, int w, int h) { - /* for(Box cur = this; cur != null; cur = cur.parent) { w = min(x + w, cur.width) - max(x, 0); h = min(y + h, cur.height) - max(y, 0); @@ -178,10 +159,6 @@ public final class Box extends JS.Scope { x += cur.x; y += cur.y; } - */ - Box cur; - for(cur = this; cur.parent != null; cur = cur.parent); - if (cur.surface != null) cur.surface.dirty(0, 0, cur.width, cur.height); } /** @@ -200,10 +177,10 @@ public final class Box extends JS.Scope { if (!wasinside && !isinside) return; - if (traps == null) { } - else if (!wasinside && isinside && traps.get("Enter") != null) put("Enter", Boolean.TRUE); - else if (wasinside && !isinside && traps.get("Leave") != null) put("Leave", Boolean.TRUE); - else if (wasinside && isinside && (mousex != oldmousex || mousey != oldmousey) && traps.get("Move") != null) put("Move", Boolean.TRUE); + if (!wasinside && isinside && get("Enter", Trap.class) != null) put("Enter", Boolean.TRUE); + else if (wasinside && !isinside && get("Leave", Trap.class) != null) put("Leave", Boolean.TRUE); + else if (wasinside && isinside && (mousex != oldmousex || mousey != oldmousey) && get("Move", Trap.class) != null) + put("Move", Boolean.TRUE); if (isinside && cursor != null) getRoot().cursor = cursor; @@ -219,10 +196,11 @@ public final class Box extends JS.Scope { // Reflow //////////////////////////////////////////////////////////////////////////////////////// - void reflow() { + void reflow() { reflow(width, height); } + void reflow(int new_width, int new_height) { repack(); if (Surface.abort) return; - resize(x, y, width, height); + resize(x, y, new_width, new_height); } /** Checks if the Box's size has changed, dirties it if necessary, and makes sure childrens' sizes are up to date */ @@ -293,15 +271,15 @@ public final class Box extends JS.Scope { } - void resize(LENGTH x, LENGTH y, LENGTH width, LENGTH height) { - + private void resize(LENGTH x, LENGTH y, LENGTH width, LENGTH height) { + // --- Phase 1 ---------------------------------------------------------------------- // run PosChange/SizeChange, dirty as needed if (x != this.x || y != this.y || width != this.width || height != this.height) { (parent == null ? this : parent).dirty(this.x, this.y, this.width, this.height); boolean sizechange = false, poschange = false; - if (traps != null && (this.width != width || this.height != height) && traps.get("SizeChange") != null) sizechange = true; - if (traps != null && (this.x != x || this.y != y) && traps.get("PosChange") != null) poschange = true; + if ((this.width != width || this.height != height) && get("SizeChange", Trap.class) != null) sizechange = true; + if ((this.x != x || this.y != y) && get("PosChange", Trap.class) != null) poschange = true; this.width = width; this.height = height; this.x = x; this.y = y; dirty(); if (sizechange || poschange) @@ -309,8 +287,8 @@ public final class Box extends JS.Scope { if (Log.on) Log.logJS(this, "Warning, more than 500 SizeChange/PosChange traps triggered since last complete render"); } else { sizePosChangesSinceLastRender++; - if (sizechange) put("SizeChange", Boolean.TRUE); - if (poschange) put("PosChange", Boolean.TRUE); + try { if (sizechange) put("SizeChange", Boolean.TRUE); } catch (Exception e) { Log.log(this, e); } + try { if (poschange) put("PosChange", Boolean.TRUE); } catch (Exception e) { Log.log(this, e); } Surface.abort = true; return; } @@ -413,17 +391,14 @@ public final class Box extends JS.Scope { int globaly = parenty + (parent == null ? 0 : y); // intersect the x,y,w,h rendering window with ourselves; quit if it's empty - clipw = min(max(clipx, parent == null ? 0 : globalx) + clipw, - (parent == null ? 0 : globalx) + width) - globalx; - cliph = min(max(clipy, parent == null ? 0 : globaly) + cliph, - (parent == null ? 0 : globaly) + height) - globaly; + clipw = min(max(clipx, parent == null ? 0 : globalx) + clipw, (parent == null ? 0 : globalx) + width) - globalx; + cliph = min(max(clipy, parent == null ? 0 : globaly) + cliph, (parent == null ? 0 : globaly) + height) - globaly; clipx = max(clipx, parent == null ? 0 : globalx); clipy = max(clipy, parent == null ? 0 : globaly); if (clipw <= 0 || cliph <= 0) return; - if ((fillcolor & 0xFF000000) != 0x00000000 || parent == null) - buf.fillRect(clipx, clipy, clipx + clipw, clipy + cliph, - (fillcolor & 0xFF000000) != 0 ? fillcolor : 0xFF777777); + if ((fillcolor & 0xFF000000) != 0x00000000) + buf.fillRect(clipx, clipy, clipx + clipw, clipy + cliph, fillcolor); if (image != null) if ((flags & TILE_FLAG) != 0) renderTiledImage(globalx, globaly, clipx, clipy, clipw, cliph, buf); @@ -443,12 +418,8 @@ public final class Box extends JS.Scope { } void renderStretchedImage(int globalx, int globaly, int clipx, int clipy, int clipw, int cliph, PixelBuffer buf) { - //buf.setClip(x, y, w + x, h + y); - System.out.println("draw " + clipx + " " + clipy + " " + (clipx + clipw) + " " + (clipy + cliph)); - buf.drawPicture(image, - clipx, clipy, clipx + clipw, clipy + cliph, - 0, 0, image.getWidth(), image.getHeight()); - //buf.setClip(0, 0, buf.getWidth(), buf.getHeight()); + // FIXME: wrong + buf.drawPicture(image, clipx, clipy, clipx + clipw, clipy + cliph, 0, 0, image.getWidth(), image.getHeight()); } void renderTiledImage(int globalx, int globaly, int x, int y, int w, int h, PixelBuffer buf) { @@ -502,45 +473,6 @@ public final class Box extends JS.Scope { return redirect.callMethod(method, args, checkOnly); } return new Integer(b.getIndexInParent()); - - } else if ("apply".equals(method)) { - if (checkOnly) return Boolean.TRUE; - if (args.elementAt(0) instanceof Res) { - try { - Res res = (Res)args.elementAt(0); - // res = res.addExtension(".xwt"); - Template t = Template.buildTemplate(res.getInputStream(), "fromResource"); - if (ThreadMessage.suspendThread()) try { - JS.Callable callback = args.length() < 2 ? null : (Callable)args.elementAt(1); - - // FIXME!!! needs to be xwt.apply(template, box) - t.apply(this, null, null, callback, 0, t.numUnits(), null); - } finally { - ThreadMessage.resumeThread(); - } - } catch (IOException e) { - Log.log(this, e); - } - } else if (args.elementAt(0) instanceof String) { - String templatename = (String)args.elementAt(0); - Template t = Template.getTemplate(templatename, null); - if (t == null) { - if (Log.on) Log.logJS(this, "template " + templatename + " not found"); - } else { - if (ThreadMessage.suspendThread()) try { - JS.Callable callback = args.length() < 2 ? null : (Callable)args.elementAt(1); - // FIXME!!! needs to be xwt.apply(template, box) - t.apply(this, null, null, callback, 0, t.numUnits(), null); - } finally { - ThreadMessage.resumeThread(); - } - } - } else if (args.elementAt(0) instanceof JS && !(args.elementAt(0) instanceof Box)) { - JS s = (JS)args.elementAt(0); - Object[] keys = s.keys(); - for(int j=0; j