X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FBox.java.pp;h=429c7a4494738ee49f28e7d9b75c3416f27f7e5c;hb=58695a7830be7fdd2a207ae3b67c8a8d39274f91;hp=b5a7b800a7f6a7d230f0c71b27c4b4ee1bb69c4e;hpb=26385e08ccf74e4ea46652a9b0aa86ce873677d5;p=org.ibex.core.git diff --git a/src/org/xwt/Box.java.pp b/src/org/xwt/Box.java.pp index b5a7b80..429c7a4 100644 --- a/src/org/xwt/Box.java.pp +++ b/src/org/xwt/Box.java.pp @@ -86,7 +86,7 @@ public final class Box extends JS.Scope { short flags = 0; static int MOUSEINSIDE_FLAG = 0x00000001; static int INVISIBLE_FLAG = 0x00000002; - static int ABSOLUTE_FLAG = 0x00000004; + static int NOTPACKED_FLAG = 0x00000004; static int HSHRINK_FLAG = 0x00000008; static int VSHRINK_FLAG = 0x00000010; static int TILE_FLAG = 0x00000020; @@ -107,8 +107,6 @@ public final class Box extends JS.Scope { 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 Res font = null; private int fontsize = 10; @@ -128,14 +126,20 @@ public final class Box extends JS.Scope { 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 VectorGraphics.VectorPath path = null; private VectorGraphics.Affine transform = null; + + private VectorGraphics.RasterPath rpath = null; + private VectorGraphics.Affine rtransform = null; + //private VectorGraphics.Paint fill = null; //private VectorGraphics.Paint stroke = null; int strokewidth = 1; @@ -143,6 +147,7 @@ public final class Box extends JS.Scope { 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 @@ -193,7 +198,7 @@ public final class Box extends JS.Scope { 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); @@ -214,15 +219,7 @@ public final class Box extends JS.Scope { /** 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); - if (path != null) { - contentwidth = max(contentwidth, path.boundingBoxWidth()); - contentheight = max(contentheight, path.boundingBoxHeight()); - } - return; - } + contentwidth = contentheight = 0; // --- Phase 0 ---------------------------------------------------------------------- // recurse @@ -240,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 @@ -258,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()); } } } @@ -266,26 +263,43 @@ 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 0) while(slack > 0) { @@ -376,17 +390,18 @@ public final class Box extends JS.Scope { for(Box child = getChild(0); child != null; child = child.nextSibling()) { if ((child.flags & INVISIBLE_FLAG) != 0) continue; int child_x = 0, child_y = 0, child_width = 0, child_height = 0; - if ((child.flags & ABSOLUTE_FLAG) != 0) { + if ((child.flags & NOTPACKED_FLAG) != 0) { child_x = child.x; child_y = child.y; - child_width = ((child.flags & HSHRINK_FLAG) != 0) ? child.contentwidth : min(child.maxwidth, width - child.x - hpad); - child_height = ((child.flags & VSHRINK_FLAG) != 0) ? child.contentheight : min(child.maxheight, height - child.y - vpad); + child_width = ((child.flags & HSHRINK_FLAG) != 0) ? child.contentwidth : min(child.maxwidth, width - child.x); + child_height = ((child.flags & VSHRINK_FLAG) != 0) ? child.contentheight : min(child.maxheight, height - child.y); } else { int diff; - //#repeat x/y y/x width/height col/row cols/rows colspan/rowspan colWidth/rowHeight maxwidth/maxheight minwidth/minheight contentwidth/contentheight colMaxWidth/rowMaxHeight HSHRINK_FLAG/VSHRINK_FLAG marginWidth/marginHeight hpad/vpad child_x/child_y child_width/child_height + //#repeat x/y y/x width/height col/row cols/rows colspan/rowspan colWidth/rowHeight maxwidth/maxheight minwidth/minheight contentwidth/contentheight colMaxWidth/rowMaxHeight HSHRINK_FLAG/VSHRINK_FLAG marginWidth/marginHeight child_x/child_y child_width/child_height child_width = 0; for(int i=child.col; i= 0 && i < numChildren()) { Box b = getChild(i); b.remove(); - put("0", b); + if (t != null) t.perform(b); } } else { Box newnode = (Box)value; @@ -597,9 +622,7 @@ public final class Box extends JS.Scope { MARK_FOR_REFLOW_this; newnode.dirty(); - - // note that JavaScript box[0] will invoke put(int i), not put(String s) - put("0", newnode); + if (t != null) t.perform(b); } } @@ -659,9 +682,6 @@ public final class Box extends JS.Scope { } } - // don't want to really cascade down to the box on this one - if (name.equals("0")) return; - SpecialBoxProperty gph = (SpecialBoxProperty)SpecialBoxProperty.specialBoxProperties.get(name); if (gph != null) { gph.put(name, this, value); return; } @@ -729,7 +749,10 @@ public final class Box extends JS.Scope { if (oldparent != null) { Box b = oldparent; MARK_FOR_REFLOW_b; } // note that JavaScript box[0] will invoke put(int i), not put(String s) - if (oldparent != null) oldparent.put("0", this); + if (oldparent != null) { + Trap t = (Trap)oldparent.get("childremoved", Trap.class); + if (t != null) t.perform(this); + } } /** returns our next sibling (parent[ourindex + 1]) */ @@ -809,8 +832,10 @@ public final class Box extends JS.Scope { // Trivial Helper Methods (should be inlined) ///////////////////////////////////////// static final int min(int a, int b) { if (ab) return a; else return b; } + static final float max(float a, float b) { if (a>b) return a; else return b; } static final int min(int a, int b, int c) { if (a<=b && a<=c) return a; else if (b<=c && b<=a) return b; else return c; } static final int max(int a, int b, int c) { if (a>=b && a>=c) return a; else if (b>=c && b>=a) return b; else return c; } static final int bound(int a, int b, int c) { if (c < b) return c; if (a > b) return a; return b; } @@ -874,49 +899,17 @@ public final class Box extends JS.Scope { void put(String name, Box b, Object value) { put(b, value); } static { - //#repeat fill/stroke fillcolor/strokecolor - specialBoxProperties.put("fill", new SpecialBoxProperty() { - public Object get(Box b) { - if ((b.fillcolor & 0xFF000000) == 0) return null; - String red = Integer.toHexString((b.fillcolor & 0x00FF0000) >> 16); - String green = Integer.toHexString((b.fillcolor & 0x0000FF00) >> 8); - String blue = Integer.toHexString(b.fillcolor & 0x000000FF); - if (red.length() < 2) red = "0" + red; - if (blue.length() < 2) blue = "0" + blue; - if (green.length() < 2) green = "0" + green; - return "#" + red + green + blue; - } - public void put(Box b, Object value) { - int newcolor = b.fillcolor; - String s = value == null ? null : value.toString(); - if (value == null) newcolor = 0x00000000; - else if (s.length() > 0 && s.charAt(0) == '#') - try { - newcolor = 0xFF000000 | - (Integer.parseInt(s.substring(1, 3), 16) << 16) | - (Integer.parseInt(s.substring(3, 5), 16) << 8) | - Integer.parseInt(s.substring(5, 7), 16); - } catch (NumberFormatException e) { - Log.log(this, "invalid color " + s); - return; - } - else if (org.xwt.translators.SVG.colors.get(s) != null) - newcolor = 0xFF000000 | ((Integer)org.xwt.translators.SVG.colors.get(s)).intValue(); - if (newcolor == b.fillcolor) return; - b.fillcolor = newcolor; - b.dirty(); - } + specialBoxProperties.put("fill", new ColorBoxProperty() { + public int getColor(Box b) { return b.fillcolor; } + public void putColor(Box b, int argb) { b.fillcolor = argb; } }); - //#end - - specialBoxProperties.put("color", new SpecialBoxProperty() { - public Object get(Box b) { return b.get("fill"); } - public void put(Box b, Object value) { b.put("fill", value); } + specialBoxProperties.put("textcolor", new ColorBoxProperty() { + public int getColor(Box b) { return b.textcolor; } + public void putColor(Box b, int argb) { b.textcolor = argb; } }); - - specialBoxProperties.put("textcolor", new SpecialBoxProperty() { - public Object get(Box b) { return b.get("stroke"); } - public void put(Box b, Object value) { b.put("stroke", value); } + specialBoxProperties.put("strokecolor", new ColorBoxProperty() { + public int getColor(Box b) { return b.strokecolor; } + public void putColor(Box b, int argb) { b.strokecolor = argb; } }); specialBoxProperties.put("text", new SpecialBoxProperty() { @@ -1016,6 +1009,7 @@ public final class Box extends JS.Scope { } t = t.substring(t.indexOf(')') + 1).trim(); } + MARK_FOR_REFLOW_b; b.dirty(); } public Object get(Box b) { return b.transform.toString(); } @@ -1083,10 +1077,6 @@ public final class Box extends JS.Scope { MARK_FOR_REFLOW_b; } }); - //FIXME - specialBoxProperties.put("static", new SpecialBoxProperty() { - }); - specialBoxProperties.put("shrink", new SpecialBoxProperty() { public Object get(Box b) { return (((b.flags & HSHRINK_FLAG) != 0) || ((b.flags & VSHRINK_FLAG) != 0)) ? Boolean.TRUE : Boolean.FALSE; } public void put(Box b, Object value) { b.put("hshrink", value); b.put("vshrink", value); } @@ -1112,7 +1102,7 @@ public final class Box extends JS.Scope { return new Integer(b.x); } public void put(Box b, Object value) { - if (!((b.flags & ABSOLUTE_FLAG) != 0)) return; + if (!((b.flags & NOTPACKED_FLAG) != 0)) return; int x = stoi(value); if (x == b.x) return; b.dirty(); @@ -1180,15 +1170,15 @@ public final class Box extends JS.Scope { b.dirty(); } }); - specialBoxProperties.put("invisible", new SpecialBoxProperty() { + specialBoxProperties.put("visible", new SpecialBoxProperty() { public Object get(Box b) { for (Box cur = b; cur != null; cur = cur.parent) { - if ((cur.flags & INVISIBLE_FLAG) != 0) return Boolean.TRUE; } - return Boolean.FALSE; + if ((cur.flags & INVISIBLE_FLAG) != 0) return Boolean.FALSE; } + return Boolean.TRUE; } public void put(Box b, Object value) { - if (stob(value) == ((b.flags & INVISIBLE_FLAG) != 0)) return; - if (stob(value)) b.flags |= INVISIBLE_FLAG; else b.flags &= ~INVISIBLE_FLAG; + if (!stob(value) == ((b.flags & INVISIBLE_FLAG) != 0)) return; + if (!stob(value)) b.flags |= INVISIBLE_FLAG; else b.flags &= ~INVISIBLE_FLAG; if (b.parent == null) { if (b.surface != null) b.surface.setInvisible((b.flags & INVISIBLE_FLAG) != 0); } else { @@ -1198,12 +1188,12 @@ public final class Box extends JS.Scope { } }}); - specialBoxProperties.put("absolute", new SpecialBoxProperty() { - public Object get(Box b) { return ((b.flags & ABSOLUTE_FLAG) != 0) ? Boolean.TRUE : Boolean.FALSE; } + specialBoxProperties.put("packed", new SpecialBoxProperty() { + public Object get(Box b) { return ((b.flags & NOTPACKED_FLAG) != 0) ? Boolean.TRUE : Boolean.FALSE; } public void put(Box b, Object value) { - if (stob(value) == ((b.flags & ABSOLUTE_FLAG) != 0)) return; - if (stob(value)) b.flags |= ABSOLUTE_FLAG; else b.flags &= ~ABSOLUTE_FLAG; - if ((b.flags & ABSOLUTE_FLAG) != 0) { b.x = 0; b.y = 0; } + if (stob(value) == ((b.flags & NOTPACKED_FLAG) == 0)) return; + if (!stob(value)) b.flags |= NOTPACKED_FLAG; else b.flags &= ~NOTPACKED_FLAG; + if ((b.flags & NOTPACKED_FLAG) != 0) { b.x = 0; b.y = 0; } if (b.parent != null) MARK_FOR_REFLOW_b_parent; } }); @@ -1366,24 +1356,6 @@ public final class Box extends JS.Scope { specialBoxProperties.put("PosChange", new SpecialBoxProperty()); specialBoxProperties.put("SizeChange", new SpecialBoxProperty()); - //#repeat hpad/vpad - specialBoxProperties.put("hpad", new SpecialBoxProperty() { - public Object get(Box b) { - if (b.redirect == null) return new Integer(0); - if (b.redirect != b) return get(b.redirect); - return new Integer(b.hpad); - } - public void put(Box b, Object value) { - if (b.redirect == null) return; - if (b.redirect != b) { put(b.redirect, value); return; } - int newval = stoi(value); - if (newval == b.hpad) return; - b.hpad = newval; - MARK_FOR_REFLOW_b; - } - }); - //#end - //#repeat minwidth/minheight maxwidth/maxheight specialBoxProperties.put("minwidth", new SpecialBoxProperty() { public Object get(Box b) { return new Integer(b.minwidth); } @@ -1444,6 +1416,41 @@ public final class Box extends JS.Scope { */ }); } + + private static abstract class ColorBoxProperty extends SpecialBoxProperty { + public abstract int getColor(Box b); + public abstract void putColor(Box b, int argb); + public Object get(Box b) { + if ((getColor(b) & 0xFF000000) == 0) return null; + String red = Integer.toHexString((getColor(b) & 0x00FF0000) >> 16); + String green = Integer.toHexString((getColor(b) & 0x0000FF00) >> 8); + String blue = Integer.toHexString(getColor(b) & 0x000000FF); + if (red.length() < 2) red = "0" + red; + if (blue.length() < 2) blue = "0" + blue; + if (green.length() < 2) green = "0" + green; + return "#" + red + green + blue; + } + public void put(Box b, Object value) { + int newcolor = getColor(b); + String s = value == null ? null : value.toString(); + if (value == null) newcolor = 0x00000000; + else if (s.length() > 0 && s.charAt(0) == '#') + try { + newcolor = 0xFF000000 | + (Integer.parseInt(s.substring(1, 3), 16) << 16) | + (Integer.parseInt(s.substring(3, 5), 16) << 8) | + Integer.parseInt(s.substring(5, 7), 16); + } catch (NumberFormatException e) { + Log.log(this, "invalid color " + s); + return; + } + else if (org.xwt.translators.SVG.colors.get(s) != null) + newcolor = 0xFF000000 | ((Integer)org.xwt.translators.SVG.colors.get(s)).intValue(); + if (newcolor == getColor(b)) return; + putColor(b, newcolor); + b.dirty(); + } + } } /** helper that converts a String to a boolean according to JavaScript coercion rules */