This fixes a minor issue in BlockView and cleans up some code. 2006-11-09 Roman Kennke <[EMAIL PROTECTED]>
* javax/swing/text/html/BlockView.java (cssHeight): Removed. (cssWidth): Removed. (cssSpans): New field. Replaces the two fields above. (BlockView): Allocate cssSpans array. (layoutMinorAxis): Fetch and use child span, not this view's span. (setCSSSpan): Adjusted to use cssSpans array. (setPropertiesFromAttributes): Adjusted to use cssSpans array. /Roman
Index: javax/swing/text/html/BlockView.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/html/BlockView.java,v retrieving revision 1.4 diff -u -1 -5 -r1.4 BlockView.java --- javax/swing/text/html/BlockView.java 5 Nov 2006 20:23:12 -0000 1.4 +++ javax/swing/text/html/BlockView.java 9 Nov 2006 16:39:11 -0000 @@ -57,49 +57,47 @@ */ public class BlockView extends BoxView { /** * The attributes for this view. */ private AttributeSet attributes; /** * The box painter for this view. */ private StyleSheet.BoxPainter painter; /** - * The width as specified in the stylesheet, null if not specified. + * The width and height as specified in the stylesheet, null if not + * specified. The first value is the X_AXIS, the second the Y_AXIS. You + * can index this directly by the X_AXIS and Y_AXIS constants. */ - private Length cssWidth; - - /** - * The height as specified in the stylesheet, null if not specified. - */ - private Length cssHeight; + private Length[] cssSpans; /** * Creates a new view that represents an html box. * This can be used for a number of elements. * * @param elem - the element to create a view for * @param axis - either View.X_AXIS or View.Y_AXIS */ public BlockView(Element elem, int axis) { super(elem, axis); + cssSpans = new Length[2]; } /** * Creates the parent view for this. It is called before * any other methods, if the parent view is working properly. * Implemented to forward to the superclass and call * setPropertiesFromAttributes to set the paragraph * properties. * * @param parent - the new parent, or null if the view * is being removed from a parent it was added to. */ public void setParent(View parent) { super.setParent(parent); @@ -129,31 +127,31 @@ // If we have set the span from CSS, then we need to adjust // the margins. SizeRequirements parent = super.calculateMajorAxisRequirements(axis, null); int margin = axis == X_AXIS ? getLeftInset() + getRightInset() : getTopInset() + getBottomInset(); r.minimum -= margin; r.preferred -= margin; r.maximum -= margin; constrainSize(axis, r, parent); } else r = super.calculateMajorAxisRequirements(axis, r); return r; } - + /** * Calculates the requirements along the minor axis. * This is implemented to call the superclass and then * adjust it if the CSS width or height attribute is specified * and applicable. * * @param axis - the axis to check the requirements for. * @param r - the SizeRequirements. If null, one is created. * @return the new SizeRequirements object. */ protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) { if (r == null) r = new SizeRequirements(); @@ -177,49 +175,40 @@ } /** * Sets the span on the SizeRequirements object according to the * according CSS span value, when it is set. * * @param r the size requirements * @param axis the axis * * @return <code>true</code> when the CSS span has been set, * <code>false</code> otherwise */ private boolean setCSSSpan(SizeRequirements r, int axis) { boolean ret = false; - if (axis == X_AXIS) + Length span = cssSpans[axis]; + // We can't set relative CSS spans here because we don't know + // yet about the allocated span. Instead we use the view's + // normal requirements. + if (span != null && ! span.isPercentage()) { - if (cssWidth != null && ! cssWidth.isPercentage()) - { - r.minimum = (int) cssWidth.getValue(); - r.preferred = (int) cssWidth.getValue(); - r.maximum = (int) cssWidth.getValue(); - ret = true; - } - } - else - { - if (cssHeight != null && ! cssWidth.isPercentage()) - { - r.minimum = (int) cssHeight.getValue(); - r.preferred = (int) cssHeight.getValue(); - r.maximum = (int) cssHeight.getValue(); - ret = true; - } + r.minimum = (int) span.getValue(); + r.preferred = (int) span.getValue(); + r.maximum = (int) span.getValue(); + ret = true; } return ret; } /** * Constrains the <code>r</code> requirements according to * <code>min</code>. * * @param axis the axis * @param r the requirements to constrain * @param min the constraining requirements */ private void constrainSize(int axis, SizeRequirements r, SizeRequirements min) { @@ -238,60 +227,63 @@ * the allocations to the children along the minor axis. * * @param targetSpan - the total span given to the view, also * used to layout the children. * @param axis - the minor axis * @param offsets - the offsets from the origin of the view for * all the child views. This is a return value and is filled in by this * function. * @param spans - the span of each child view. This is a return value and is * filled in by this function. */ protected void layoutMinorAxis(int targetSpan, int axis, int[] offsets, int[] spans) { int viewCount = getViewCount(); - Length length = axis == X_AXIS ? cssWidth : cssHeight; + CSS.Attribute spanAtt = axis == X_AXIS ? CSS.Attribute.WIDTH + : CSS.Attribute.HEIGHT; for (int i = 0; i < viewCount; i++) { View view = getView(i); int min = (int) view.getMinimumSpan(axis); int max; - // Handle percentage span value. - if (length != null && length.isPercentage()) + // Handle CSS span value of child. + AttributeSet atts = view.getAttributes(); + Length length = (Length) atts.getAttribute(spanAtt); + if (length != null) { min = Math.max((int) length.getValue(targetSpan), min); max = min; } else max = (int) view.getMaximumSpan(axis); if (max < targetSpan) { // Align child. float align = view.getAlignment(axis); offsets[i] = (int) ((targetSpan - max) * align); spans[i] = max; } else { offsets[i] = 0; spans[i] = Math.max(min, targetSpan); } } } - + /** * Paints using the given graphics configuration and shape. * This delegates to the css box painter to paint the * border and background prior to the interior. * * @param g - Graphics configuration * @param a - the Shape to render into. */ public void paint(Graphics g, Shape a) { Rectangle rect = a instanceof Rectangle ? (Rectangle) a : a.getBounds(); painter.paint(g, rect.x, rect.y, rect.width, rect.height, this); super.paint(g, a); } @@ -426,30 +418,30 @@ attributes = ss.getViewAttributes(this); // Fetch painter. painter = ss.getBoxPainter(attributes); // Update insets. if (attributes != null) { setInsets((short) painter.getInset(TOP, this), (short) painter.getInset(LEFT, this), (short) painter.getInset(BOTTOM, this), (short) painter.getInset(RIGHT, this)); } // Fetch width and height. - cssWidth = (Length) attributes.getAttribute(CSS.Attribute.WIDTH); - cssHeight = (Length) attributes.getAttribute(CSS.Attribute.HEIGHT); + cssSpans[X_AXIS] = (Length) attributes.getAttribute(CSS.Attribute.WIDTH); + cssSpans[Y_AXIS] = (Length) attributes.getAttribute(CSS.Attribute.HEIGHT); } - + /** * Gets the default style sheet. * * @return the style sheet */ protected StyleSheet getStyleSheet() { HTMLDocument doc = (HTMLDocument) getDocument(); return doc.getStyleSheet(); } }