Revision: 4792 http://sourceforge.net/p/vexi/code/4792 Author: clrg Date: 2015-05-09 09:29:30 +0000 (Sat, 09 May 2015) Log Message: ----------- Fixes for integrated layout
Modified Paths: -------------- branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp Modified: branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp =================================================================== --- branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp 2015-05-05 00:37:12 UTC (rev 4791) +++ branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp 2015-05-09 09:29:30 UTC (rev 4792) @@ -187,8 +187,8 @@ private final Box getRoot() { return parent == null ? this : parent.getRoot(); } - private final int getXInParent() { return parent==null ? 0 : ((parent.test(PACK) || parent.test(ALIGN_LEFT)) ? x : x+((parent.width-width)/(parent.test(ALIGN_RIGHT)?1:2))); } - private final int getYInParent() { return parent==null ? 0 : ((parent.test(PACK) || parent.test(ALIGN_TOP)) ? y : y+((parent.height-height)/(parent.test(ALIGN_BOTTOM)?1:2))); } + private final int getXInParent() { return parent==null ? 0 : ((parent.test(PACK) || parent.alignLeft()) ? x : x+((parent.width-width)/(parent.alignRight()?1:2))); } + private final int getYInParent() { return parent==null ? 0 : ((parent.test(PACK) || parent.alignTop()) ? y : y+((parent.height-height)/(parent.alignBottom()?1:2))); } private final int globalToLocalX(int x) { return parent==null ? x : parent.globalToLocalX(x - getXInParent()); } private final int globalToLocalY(int y) { return parent==null ? y : parent.globalToLocalY(y - getYInParent()); } private final int localToGlobalX(int x) { return parent==null ? x : parent.localToGlobalX(x + getXInParent()); } @@ -203,6 +203,10 @@ private final boolean inside(int x, int y) { return test(DISPLAY) && x >= 0 && y >= 0 && x < width && y < height; } private final boolean hasText() { return text != EMPTY_STRING; } + private final boolean alignTop() { return test(ALIGN_TOP); } + private final boolean alignLeft() { return test(ALIGN_LEFT); } + private final boolean alignRight() { return test(ALIGN_RIGHT); } + private final boolean alignBottom() { return test(ALIGN_BOTTOM); } // TRAPFLAGS helper functions private final void trap_setclear(int mask, boolean set) { if (set) set(mask); else clear(mask); } @@ -268,7 +272,7 @@ private static final int REFLOW = CONSTRAIN | CONSTRAIN_DESCENDENT | PLACE | PLACE_DESCENDENT; private static final int PACK = 0x00001000; - private static final int CLIP = 0x00002000; + private static final int GAIN = 0x00002000; // private static final int HAS_WIDTH_SLACK = 0x00004000; // private static final int HAS_HEIGHT_SLACK = 0x00008000; @@ -383,7 +387,7 @@ private Box parent = null; private Box redirect = this; - private int flags = DISPLAY | REFLOW | ORIENT | TILE_IMAGE | PACK | PLACE_CLEAN; + private int flags = DISPLAY | REFLOW | ORIENT | TILE_IMAGE | PACK | GAIN | PLACE_CLEAN; private int trapflags = 0; private BasicTree bt = null; @@ -730,7 +734,8 @@ } //#end - } else if (!test(CLIP)) { + } else if (test(GAIN)) { + // layered layout for (Box c = getChild(i=0); c != null; c = getChild(++i)) { if (!c.test(DISPLAY)) { continue; @@ -738,31 +743,15 @@ new_contentwidth = constrainToWidth(new_contentwidth, c); new_contentheight = constrainToHeight(new_contentheight, c); } + } else { + // place layout always has a content size of 0 } - //#repeat width/height WIDTH/HEIGHT - if (test(CLIP)) - new_contentwidth = max(new_contentwidth, textwidth) + padding.left + padding.right; -/* - if (test(CLIP)) { - if (new_contentwidth < maxwidth && new_contentwidth < minwidth) { - set(HAS_WIDTH_SLACK); - } else { - clear(HAS_WIDTH_SLACK); - } - } else { - if (new_contentwidth < maxwidth && (new_contentwidth < minwidth || new_contentwidth < textwidth || - (texture!=null && new_contentwidth < texture.getWidth()))) { - set(HAS_WIDTH_SLACK); - } else { - clear(HAS_WIDTH_SLACK); - } - new_contentwidth = max(new_contentwidth, textwidth); + //#repeat HSHRINK/VSHRINK width/height WIDTH/HEIGHT Width/Height left/top right/bottom + if (test(GAIN)) { + new_contentwidth = max(new_contentwidth, textwidth + padding.left + padding.right); } - new_contentwidth = min(maxwidth, max(minwidth, new_contentwidth)); -*/ - // assign contentwidth and mark for place in parent and placing of children if (new_contentwidth != contentwidth) { if (parent != null) { @@ -772,7 +761,7 @@ PUT_BOX_FIELD(SC_contentwidth,JSU.N(new_contentwidth),contentwidth=new_contentwidth,CONTENTWIDTH_TRAP) } else { // constrain contentwidth to frame width - if (getSurface()!=null && !test(SHRINK)) { + if (getSurface()!=null && !test(HSHRINK)) { new_contentwidth = min(getSurface().pendingWidth, new_contentwidth); } if (new_contentwidth != contentwidth) { @@ -805,22 +794,22 @@ set(PLACE_CLEAN); } - //#repeat HSHRINK/VSHRINK Width/Height getTargetX/getTargetY x/y tx/ty width/height left/top right/bottom - private final int getTargetWidth(final int availableWidth) { + //#repeat HSHRINK/VSHRINK Width/Height determineX/determineY x/y width/height left/top right/bottom + private final int determineWidth() { return test(HSHRINK) ? nominalWidth() - : max(contentwidth, min(maxwidth, availableWidth - x + : max(contentwidth, min(maxwidth, parent.width - x - max(margin.left, parent.padding.left) - max(margin.right, parent.padding.right))); } - private final int getTargetX(final int availableWidth, final int targetWidth, final boolean left, final boolean right) { - if (left) return margin.left; - if (right) return availableWidth - targetWidth - margin.right; + private final int determineX(final int new_width) { + if (parent.alignLeft()) return margin.left; + if (parent.alignRight()) return parent.width - new_width - margin.right; - int tx = (availableWidth - targetWidth) / 2; + int new_x = (parent.width - new_width) / 2; // honour margins - if (tx < margin.left) return margin.left; - if (availableWidth - tx - targetWidth < margin.right) - return availableWidth - margin.bottom; - return tx; + if (new_x < margin.left) return margin.left; + if (parent.width - new_x - new_width < margin.right) + return parent.width - margin.right; + return new_x; } //#end @@ -835,8 +824,8 @@ if (!child.test(DISPLAY)) { continue; } - child.tryResize(child.getTargetWidth(width), - child.getTargetHeight(height), + child.tryResize(child.determineWidth(), + child.determineHeight(), clean); } @@ -844,10 +833,6 @@ // pack children into available space int child_x = 0, child_y = 0; int child_width, child_height; - boolean top = test(ALIGN_TOP); - boolean left = test(ALIGN_LEFT); - boolean right = test(ALIGN_RIGHT); - boolean bottom = test(ALIGN_BOTTOM); if (test(ORIENT) == HORIZONTAL) { // horizontal stacking @@ -860,8 +845,8 @@ continue; } // height, y - child_height = child.getTargetHeight(height); - child_y = getTargetY(height, child_height, top, bottom); + child_height = child.determineHeight(); + child_y = child.determineY(child_height); // width, x child_width = child.nominalWidth(); child_x += max(prior_margin, child.margin.left); @@ -961,7 +946,7 @@ // if there is 'slack' (child boxes do not consume parent width) then // align determines whether we pack boxes to left, centre, or right - int offset_x = left ? 0 : (int)(((float)width-totalsize)/(float)(right?1:2)); + int offset_x = alignLeft() ? 0 : (int)(((float)width-totalsize)/(float)(alignRight()?1:2)); // we use total (a float) to keep tabs on final layout totals // so we do not get stray pixel sized gaps caused by rounding @@ -973,8 +958,8 @@ continue; } // height, y - child_height = child.getTargetHeight(height); - child_y = child.getTargetY(height, child_height, top, bottom); + child_height = child.determineHeight(); + child_y = child.determineY(child_height); // width, x totalsize += (float)max(prior_margin, child.margin.left); @@ -1007,8 +992,8 @@ continue; } // width, x - child_width = child.getTargetWidth(width); - child_x = child.getTargetX(width, child_width, left, right); + child_width = child.determineWidth(); + child_x = child.determineX(child_width); // height, y child_height = child.nominalHeight(); child_y += max(prior_margin, child.margin.top); @@ -1108,7 +1093,7 @@ // if there is 'slack' (child boxes do not consume parent width) then // align determines whether we pack boxes to left, centre, or right - int offset_y = top ? 0 : (int)(((float)height-totalsize)/(float)(bottom?1:2)); + int offset_y = alignTop() ? 0 : (int)(((float)height-totalsize)/(float)(alignBottom()?1:2)); // we use total (a float) to keep tabs on final layout totals // so we do not get stray pixel sized gaps caused by rounding @@ -1120,8 +1105,8 @@ continue; } // width, x - child_width = child.getTargetWidth(width); - child_x = child.getTargetX(width, child_width, left, right); + child_width = child.determineWidth(); + child_x = child.determineX(child_width); // height, y totalsize += (float)max(prior_margin, child.margin.top); @@ -1193,8 +1178,10 @@ if (hasText()) { int gap_x = width - textwidth; int gap_y = height - textheight; - int text_x = globalx + (test(ALIGN_RIGHT) ? gap_x : !test(ALIGN_LEFT) ? gap_x/2 : 0); - int text_y = globaly + (test(ALIGN_BOTTOM) ? gap_y : !test(ALIGN_TOP) ? gap_y/2 : 0); + int text_x = globalx + (alignLeft() ? padding.left + : alignRight() ? gap_x-padding.right : max(max(padding.left, padding.right), gap_x/2)); + int text_y = globaly + (alignTop() ? padding.top + : alignBottom() ? gap_y-padding.bottom : max(max(padding.top, padding.bottom), gap_y/2)); font.rasterizeGlyphs(text.toString(), buf, textcolor, text_x, text_y, cx1, cy1, cx2, cy2); } @@ -1555,10 +1542,8 @@ return; } long textsize = font.textsize(text.toString()); - int iwidth = (int)((textsize >>> 32) & 0xffffffff); - int iheight = (int)(textsize & 0xffffffffL); - textwidth = iwidth > Short.MAX_VALUE ? Short.MAX_VALUE : (short)iwidth; - textheight = iheight > Short.MAX_VALUE ? Short.MAX_VALUE : (short)iheight; + textwidth = (int)((textsize >>> 32) & 0xffffffff); + textheight = (int)(textsize & 0xffffffffL); } @@ -2235,7 +2220,7 @@ * */ case "layout": if (redirect == null) return null; - if (redirect == this) return test(PACK) ? SC_pack : (test(CLIP) ? SC_place : SC_layer); + if (redirect == this) return test(PACK) ? SC_pack : (test(GAIN) ? SC_layer : SC_place); return redirect.getAndTriggerTraps(SC_layout); /* <p><em>Read only</em> reflecting the number of children a box has.</p> @@ -2769,6 +2754,7 @@ setFont(fontstream, fontsize); } if (hasText()) { + textCalculateDimensions(); setConstrain(); dirty(); } @@ -2787,6 +2773,7 @@ setFont(font.stream, ps); } if (hasText()) { + textCalculateDimensions(); setConstrain(); dirty(); } @@ -2983,21 +2970,21 @@ case "layout": if (tryRedirect(name, value)) return; if (SC_place.equals(value)) { - if (!test(PACK) && test(CLIP)) { + if (!test(PACK) && !test(GAIN)) { return; } setConstrain(); setPlace(); clear(PACK); - set(CLIP); + clear(GAIN); } else if (SC_layer.equals(value)) { - if (!test(PACK) && !test(CLIP)) { + if (!test(PACK) && test(GAIN)) { return; } setConstrain(); setPlace(); clear(PACK); - clear(CLIP); + set(GAIN); } else if (SC_pack.equals(value)) { if (test(PACK)) { return; @@ -3005,7 +2992,7 @@ setConstrain(); setPlace(); set(PACK); - clear(CLIP); + set(GAIN); } else { throw new JSExn("Attempt to set Box property 'layout' to unsupported value '"+JSU.toString(value)+"'"); } @@ -3461,7 +3448,7 @@ /** change the parent of the box and fire relevant traps */ protected final void removeFromParent() throws JSExn { if (test(DISPLAY)) { - if (parent.test(PACK) || !parent.test(CLIP)) { + if (parent.test(PACK) || parent.test(GAIN)) { parent.setConstrain(); } parent.setPlace(); @@ -3544,7 +3531,7 @@ // requestReflow must happen after parent assignment otherwise calls // to setContrainInTree/setPlaceInTree are rendered ineffective requestReflow(); - if (newparent.test(PACK) || !newparent.test(CLIP)) { + if (newparent.test(PACK) || newparent.test(GAIN)) { newparent.setConstrain(); } newparent.setPlace(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn