X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java.pp;h=5c7a24266219c49396a3adc8116ab09f65398c24;hb=f0c0afaff382c85c2434fe7c7420fbfd3904c0a3;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..5c7a242 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,17 @@ 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 NOTPACKED_FLAG = 0x00000004;
+ 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;
+ static int NOCLIP_FLAG = 0x00000100;
// Geometry ////////////////////////////////////////////////////////////////////////////
@@ -119,14 +103,13 @@ 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;
- private LENGTH hpad = 0;
- private LENGTH vpad = 0;
+ public LENGTH minwidth = 0;
+ public LENGTH minheight = 0;
+ public LENGTH maxwidth = MAX_LENGTH;
+ public LENGTH maxheight = MAX_LENGTH;
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,25 +120,34 @@ 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
private int col = 0; // FEATURE use a short
- private LENGTH contentwidth = 0; // == max(minwidth, textwidth+pad, sum(child.contentwidth) + pad)
+ private LENGTH contentwidth = 0; // == max(minwidth, textwidth, sum(child.contentwidth))
private LENGTH contentheight = 0;
+ private LENGTH offset_x = 0;
+ private LENGTH offset_y = 0;
// Rendering Properties ///////////////////////////////////////////////////////////
- //private SVG.VP path = null;
- //private SVG.Paint fill = null;
- //private SVG.Paint stroke = null;
+ private VectorGraphics.VectorPath path = null;
+ private VectorGraphics.Affine transform = null;
+
+ private VectorGraphics.RasterPath rpath = null;
+ private VectorGraphics.Affine rtransform = null;
- private Picture image; // will disappear
- private int fillcolor = 0x00000000; // will become SVG.Paint
- private int strokecolor = 0xFF000000; // will become SVG.Paint
+ //private VectorGraphics.Paint fill = null;
+ //private VectorGraphics.Paint stroke = null;
+ int strokewidth = 1;
+
+ public Picture image; // will disappear
+ private int fillcolor = 0x00000000; // will become VectorGraphics.Paint
+ private int strokecolor = 0xFF000000; // will become VectorGraphics.Paint
+ private int textcolor = 0xFF000000; // will become VectorGraphics.Paint
private String cursor = null; // the cursor for this box
@@ -163,13 +155,18 @@ public final class Box extends JS.Scope {
// Instance Methods /////////////////////////////////////////////////////////////////////
/** 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() {
+ if ((flags & NOCLIP_FLAG) != 0 && parent != null) parent.dirty();
+ else 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);
- x = max(x, 0);
- y = max(y, 0);
+ if ((flags & NOCLIP_FLAG) == 0) {
+ w = min(x + w, cur.width) - max(x, 0);
+ h = min(y + h, cur.height) - max(y, 0);
+ x = max(x, 0);
+ y = max(y, 0);
+ }
if (w <= 0 || h <= 0) return;
if (cur.parent == null && cur.surface != null) cur.surface.dirty(x, y, w, h);
x += cur.x;
@@ -193,15 +190,15 @@ 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;
// if the mouse has moved into our padding region, it is considered 'outside' all our children
- if (!(mousex >= hpad && mousey >= vpad && mousex < width - hpad && mousey < height + vpad)) forceleave = true;
+ if (!(mousex >= 0 && mousey >= 0 && mousex < width && mousey < height)) forceleave = true;
for(Box b = getChild(numChildren() - 1); b != null; b = b.prevSibling()) {
b.Move(oldmousex - b.x, oldmousey - b.y, mousex - b.x, mousey - b.y, forceleave);
@@ -212,20 +209,17 @@ 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 */
void repack() {
if (!needs_reflow) return;
- if (numChildren() == 0) {
- contentwidth = max(textwidth + 2 * hpad, minwidth);
- contentheight = max(textheight + 2 * vpad, minheight);
- return;
- }
+ contentwidth = contentheight = 0;
// --- Phase 0 ----------------------------------------------------------------------
// recurse
@@ -243,10 +237,10 @@ public final class Box extends JS.Scope {
// assign children to their row/column positions (assuming constrained columns)
if ((rows == 0 && cols == 0) || (rows != 0 && cols != 0)) throw new Error("rows == " + rows + " cols == " + cols);
//#repeat x/y y/x width/height col/row row/col cols/rows rows/cols colspan/rowspan rowspan/colspan colWidth/rowHeight numRowsInCol/numColsInRow INNER/INNER2 maxwidth/maxheight minwidth/minheight contentwidth/contentheight colMaxWidth/rowMaxHeight OUTER/OUTER2 INNER/INNER2
- if (rows == 0) {
+ if (rows == 0 && numChildren() != 0) {
int[] numRowsInCol = new int[cols]; // the number of cells occupied in each column
Box child = getChild(0);
- for(; child != null && (((child.flags & ABSOLUTE_FLAG) != 0) || ((child.flags & INVISIBLE_FLAG) != 0)); child = child.nextSibling());
+ for(; child != null && (((child.flags & NOTPACKED_FLAG) != 0) || ((child.flags & INVISIBLE_FLAG) != 0)); child = child.nextSibling());
OUTER: for(int row=0; child != null; row++) {
for(int col=0; child != null && col < cols;) {
INNER: while(true) { // scan across the row, looking for an unoccupied gap at least as wide as the child
@@ -261,7 +255,7 @@ public final class Box extends JS.Scope {
child.row = row;
col += min(cols, child.colspan);
child = child.nextSibling();
- for(; child != null && (((child.flags & ABSOLUTE_FLAG) != 0) || ((child.flags & INVISIBLE_FLAG) != 0)); child = child.nextSibling());
+ for(; child != null && (((child.flags & NOTPACKED_FLAG) != 0) || ((child.flags & INVISIBLE_FLAG) != 0)); child = child.nextSibling());
}
}
}
@@ -269,32 +263,53 @@ public final class Box extends JS.Scope {
// --- Phase 2 ----------------------------------------------------------------------
// compute the min/max sizes of the columns and rows and set our contentwidth
- //#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
- contentwidth = 2 * hpad;
- int numCols = cols;
- if (numCols == 0)
+ if (numChildren() != 0) {
+ //#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
+ int numCols = cols;
+ if (numCols == 0)
+ for(Box child = getChild(0); child != null; child = child.nextSibling())
+ numCols = max(numCols, child.col + child.colspan);
+ LENGTH[] colWidth = new LENGTH[numCols];
for(Box child = getChild(0); child != null; child = child.nextSibling())
- numCols = max(numCols, child.col + child.colspan);
- LENGTH[] colWidth = new LENGTH[numCols];
- for(Box child = getChild(0); child != null; child = child.nextSibling())
- if (!(((child.flags & ABSOLUTE_FLAG) != 0) || ((child.flags & INVISIBLE_FLAG) != 0)))
- colWidth[child.col] = max(colWidth[child.col], child.contentwidth / child.colspan);
- for(int col=0; col