X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java.pp;h=f18182cfc216d27cf6e1caa8e301d8b1b1ce3fc8;hb=8235361e8601ae7b36ab707058de3b52225d15a2;hp=f48835d64c79c3ec6cc024ab719b66ce9385dd1c;hpb=fdb9f1c6460e6833e58d1f8b4d45fd21306b88c0;p=org.ibex.core.git diff --git a/src/org/xwt/Box.java.pp b/src/org/xwt/Box.java.pp index f48835d..f18182c 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 @@ -19,7 +16,7 @@ import java.net.*; import java.util.*; import org.xwt.js.*; import org.xwt.util.*; -import org.xwt.imp.*; +import org.xwt.translators.*; /** *

@@ -62,7 +59,7 @@ import org.xwt.imp.*; * position. * * A note on coordinates: the Box class represents regions - * internally as x,y,w,h tuples, even though the DoubleBuffer class + * internally as x,y,w,h tuples, even though the PixelBuffer class * uses x1,y1,x2,y2 tuples. */ public final class Box extends JS.Scope { @@ -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,30 +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 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 //////////////////////////////////////////////////////////////////////////// @@ -119,14 +102,15 @@ 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; - private String font = null; + private Res font = null; + private int fontsize = 10; private LENGTH textwidth = 0; private LENGTH textheight = 0; @@ -137,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 @@ -153,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 @@ -193,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; @@ -212,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 */ @@ -286,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) @@ -302,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; } @@ -352,8 +337,8 @@ public final class Box extends JS.Scope { // --- Phase 3 ---------------------------------------------------------------------- // hand out the slack int slack; - //#repeat x/y y/x width/height col/row cols/rows colspan/rowspan colWidth/rowHeight maxwidth/maxheight minwidth/minheight contentwidth/contentheight colMaxWidth/rowMaxHeight numCols/numRows - slack = width; + //#repeat x/y y/x width/height col/row cols/rows colspan/rowspan colWidth/rowHeight maxwidth/maxheight minwidth/minheight contentwidth/contentheight colMaxWidth/rowMaxHeight numCols/numRows hpad/vpad + slack = width - 2 * hpad; for(int i=0; i 0) while(slack > 0) { @@ -400,30 +385,27 @@ public final class Box extends JS.Scope { // Rendering Pipeline ///////////////////////////////////////////////////////////////////// /** Renders self and children within the specified region. All rendering operations are clipped to xIn,yIn,wIn,hIn */ - void render(int parentx, int parenty, int clipx, int clipy, int clipw, int cliph, DoubleBuffer buf) { + void render(int parentx, int parenty, int clipx, int clipy, int clipw, int cliph, PixelBuffer buf) { if (Surface.abort || (flags & INVISIBLE_FLAG) != 0) return; int globalx = parentx + (parent == null ? 0 : x); 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); else renderStretchedImage(globalx, globaly, clipx, clipy, clipw, cliph, buf); if (text != null && !text.equals("")) - renderText(x, y, clipx, clipy, clipw, cliph, buf); + renderText(globalx, globaly, clipx, clipy, clipw, cliph, buf); // now subtract the pad region from the clip region before proceeding clipw = min(max(clipx, globalx + hpad) + clipw, globalx + width - hpad) - clipx; @@ -435,16 +417,12 @@ public final class Box extends JS.Scope { b.render(globalx, globaly, clipx, clipy, clipw, cliph, buf); } - void renderStretchedImage(int globalx, int globaly, int x, int y, int w, int h, DoubleBuffer buf) { - buf.setClip(x, y, w + x, h + y); - buf.drawPicture(image, - globalx, globaly, - globalx + width, globaly + height, - 0, 0, image.getWidth(), image.getHeight()); - buf.setClip(0, 0, buf.getWidth(), buf.getHeight()); + void renderStretchedImage(int globalx, int globaly, int clipx, int clipy, int clipw, int cliph, PixelBuffer buf) { + // 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, DoubleBuffer buf) { + void renderTiledImage(int globalx, int globaly, int x, int y, int w, int h, PixelBuffer buf) { int iw = image.getWidth(); int ih = image.getHeight(); for(int i=(x - x)/iw; i <= (x + w - x)/iw; i++) { @@ -466,19 +444,20 @@ public final class Box extends JS.Scope { } } - void renderText(int x, int y, int clipx, int clipy, int clipw, int cliph, DoubleBuffer buf) { - try { - ImageDecoder id = org.xwt.imp.Font.render(new FileInputStream("COMIC.TTF"), 24, text, false); - Picture p = Platform.createPicture(id); - // FIXME: clipping (don't use setClip) - buf.drawPicture(p, - x + hpad, y + vpad, - x + hpad + p.getWidth(), y + vpad + p.getHeight(), + void renderText(int x, int y, int clipx, int clipy, int clipw, int cliph, PixelBuffer buf) { + for(int i=0; i