jeremias 2005/01/07 00:21:21 Modified: src/java/org/apache/fop/fo/properties CommonMarginBlock.java src/java/org/apache/fop/layoutmgr TraitSetter.java BlockLayoutManager.java Log: Bugfix for start-indent calculation for nested blocks. The inherited start-indent wasn't taken into account as described in 5.3.2 of the spec. Minor style and javadoc improvements on the way. Revision Changes Path 1.5 +34 -2 xml-fop/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java Index: CommonMarginBlock.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- CommonMarginBlock.java 28 Oct 2004 10:00:24 -0000 1.4 +++ CommonMarginBlock.java 7 Jan 2005 08:21:21 -0000 1.5 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -70,6 +70,16 @@ public Length endIndent; /** + * The inherited "start-indent" property. + */ + public Length inheritedStartIndent; + + /** + * The inherited "end-indent" property. + */ + public Length inheritedEndIndent; + + /** * Create a CommonMarginBlock object. * @param pList The PropertyList with propery values. */ @@ -84,5 +94,27 @@ startIndent = pList.get(Constants.PR_START_INDENT).getLength(); endIndent = pList.get(Constants.PR_END_INDENT).getLength(); + + if (!pList.getFObj().generatesReferenceAreas()) { + inheritedStartIndent = pList.getParentPropertyList() + .get(Constants.PR_START_INDENT).getLength(); + inheritedEndIndent = pList.getParentPropertyList() + .get(Constants.PR_END_INDENT).getLength(); + } + } + + /** @see java.lang.Object#toString() */ + public String toString() { + return "CommonMarginBlock:\n" + + "Margins (top, bottom, left, right): (" + + marginTop + ", " + marginBottom + ", " + + marginLeft + ", " + marginRight + ")\n" + + "Space (before, after): (" + + spaceBefore + ", " + spaceAfter + ")\n" + + "Indents (start, end): (" + + startIndent + ", " + endIndent + ")\n" + + "Indents inherited (start, end): (" + + inheritedStartIndent + ", " + inheritedEndIndent + ")\n"; } + } 1.11 +33 -22 xml-fop/src/java/org/apache/fop/layoutmgr/TraitSetter.java Index: TraitSetter.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/TraitSetter.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- TraitSetter.java 20 Oct 2004 11:55:32 -0000 1.10 +++ TraitSetter.java 7 Jan 2005 08:21:21 -0000 1.11 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,6 +33,8 @@ * Sets border and padding traits on areas. * @param area area to set the traits on * @param bpProps border and padding properties + * @param bNotFirst True if the area is not the first area + * @param bNotLast True if the area is not the last area */ public static void setBorderPaddingTraits(Area area, CommonBorderPaddingBackground bpProps, boolean bNotFirst, boolean bNotLast) { @@ -96,45 +98,45 @@ * Add borders to an area. * Layout managers that create areas with borders can use this to * add the borders to the area. - * @param curBlock area to set the traits on + * @param area the area to set the traits on. * @param bordProps border properties */ - public static void addBorders(Area curBlock, CommonBorderPaddingBackground bordProps) { + public static void addBorders(Area area, CommonBorderPaddingBackground bordProps) { BorderProps bps = getBorderProps(bordProps, CommonBorderPaddingBackground.BEFORE); if (bps.width != 0) { - curBlock.addTrait(Trait.BORDER_BEFORE, bps); + area.addTrait(Trait.BORDER_BEFORE, bps); } bps = getBorderProps(bordProps, CommonBorderPaddingBackground.AFTER); if (bps.width != 0) { - curBlock.addTrait(Trait.BORDER_AFTER, bps); + area.addTrait(Trait.BORDER_AFTER, bps); } bps = getBorderProps(bordProps, CommonBorderPaddingBackground.START); if (bps.width != 0) { - curBlock.addTrait(Trait.BORDER_START, bps); + area.addTrait(Trait.BORDER_START, bps); } bps = getBorderProps(bordProps, CommonBorderPaddingBackground.END); if (bps.width != 0) { - curBlock.addTrait(Trait.BORDER_END, bps); + area.addTrait(Trait.BORDER_END, bps); } int padding = bordProps.getPadding(CommonBorderPaddingBackground.START, false); if (padding != 0) { - curBlock.addTrait(Trait.PADDING_START, new java.lang.Integer(padding)); + area.addTrait(Trait.PADDING_START, new java.lang.Integer(padding)); } padding = bordProps.getPadding(CommonBorderPaddingBackground.END, false); if (padding != 0) { - curBlock.addTrait(Trait.PADDING_END, new java.lang.Integer(padding)); + area.addTrait(Trait.PADDING_END, new java.lang.Integer(padding)); } padding = bordProps.getPadding(CommonBorderPaddingBackground.BEFORE, false); if (padding != 0) { - curBlock.addTrait(Trait.PADDING_BEFORE, new java.lang.Integer(padding)); + area.addTrait(Trait.PADDING_BEFORE, new java.lang.Integer(padding)); } padding = bordProps.getPadding(CommonBorderPaddingBackground.AFTER, false); if (padding != 0) { - curBlock.addTrait(Trait.PADDING_AFTER, new java.lang.Integer(padding)); + area.addTrait(Trait.PADDING_AFTER, new java.lang.Integer(padding)); } } @@ -150,10 +152,10 @@ * Add background to an area. * Layout managers that create areas with a background can use this to * add the background to the area. - * @param curBlock the current block + * @param area the area to set the traits on * @param backProps the background properties */ - public static void addBackground(Area curBlock, CommonBorderPaddingBackground backProps) { + public static void addBackground(Area area, CommonBorderPaddingBackground backProps) { Trait.Background back = new Trait.Background(); back.setColor(backProps.backgroundColor); @@ -169,7 +171,7 @@ } if (back.getColor() != null || back.getURL() != null) { - curBlock.addTrait(Trait.BACKGROUND, back); + area.addTrait(Trait.BACKGROUND, back); } } @@ -177,29 +179,38 @@ * Add space to a block area. * Layout managers that create block areas can use this to add space * outside of the border rectangle to the area. - * @param curBlock the current block. + * @param area the area to set the traits on. + * @param bpProps the border, padding and background properties * @param marginProps the margin properties. */ - public static void addMargins(Area curBlock, + public static void addMargins(Area area, CommonBorderPaddingBackground bpProps, CommonMarginBlock marginProps) { - int spaceStart = marginProps.startIndent.getValue() + int spaceStart = marginProps.startIndent.getValue() + - marginProps.inheritedStartIndent.getValue() - bpProps.getBorderStartWidth(false) - bpProps.getPaddingStart(false); if (spaceStart != 0) { - curBlock.addTrait(Trait.SPACE_START, new Integer(spaceStart)); + area.addTrait(Trait.SPACE_START, new Integer(spaceStart)); } int spaceEnd = marginProps.endIndent.getValue() + - marginProps.inheritedEndIndent.getValue() - bpProps.getBorderEndWidth(false) - bpProps.getPaddingEnd(false); if (spaceEnd != 0) { - curBlock.addTrait(Trait.SPACE_END, new Integer(spaceEnd)); + area.addTrait(Trait.SPACE_END, new Integer(spaceEnd)); } } - public static void addBreaks(Area curArea, int breakBefore, int breakAfter) { - curArea.addTrait(Trait.BREAK_AFTER, new Integer(breakAfter)); - curArea.addTrait(Trait.BREAK_BEFORE, new Integer(breakBefore)); + /** + * Sets the traits for breaks on an area. + * @param area the area to set the traits on. + * @param breakBefore the value for break-before + * @param breakAfter the value for break-after + */ + public static void addBreaks(Area area, int breakBefore, int breakAfter) { + area.addTrait(Trait.BREAK_AFTER, new Integer(breakAfter)); + area.addTrait(Trait.BREAK_BEFORE, new Integer(breakBefore)); } } 1.35 +41 -11 xml-fop/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java Index: BlockLayoutManager.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- BlockLayoutManager.java 7 Dec 2004 20:11:21 -0000 1.34 +++ BlockLayoutManager.java 7 Jan 2005 08:21:21 -0000 1.35 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,6 @@ package org.apache.fop.layoutmgr; import java.util.ListIterator; -import java.util.ArrayList; import java.util.List; import org.apache.fop.datatypes.PercentBase; @@ -39,6 +38,7 @@ private Block curBlockArea; + /** Iterator over the child layout managers. */ protected ListIterator proxyLMiter; /* holds the (one-time use) fo:block space-before @@ -61,8 +61,13 @@ private int iStartPos = 0; + /** The list of child BreakPoss instances. */ protected List childBreaks = new java.util.ArrayList(); + /** + * Creates a new BlockLayoutManager. + * @param inBlock the block FO object to create the layout manager for. + */ public BlockLayoutManager(org.apache.fop.fo.flow.Block inBlock) { super(inBlock); fobj = inBlock; @@ -98,7 +103,7 @@ public ProxyLMiter() { super(BlockLayoutManager.this); - listLMs = new ArrayList(10); + listLMs = new java.util.ArrayList(10); } public boolean hasNext() { @@ -143,7 +148,7 @@ private LineLayoutManager createLineManager(LayoutManager firstlm) { LineLayoutManager llm; llm = new LineLayoutManager(fobj, lineHeight, lead, follow, middleShift); - List inlines = new ArrayList(); + List inlines = new java.util.ArrayList(); inlines.add(firstlm); while (proxyLMiter.hasNext()) { LayoutManager lm = (LayoutManager) proxyLMiter.next(); @@ -158,12 +163,18 @@ return llm; } + /** + * @see org.apache.fop.layoutmgr.LayoutManager#getNextBreakPoss(org.apache.fop.layoutmgr.LayoutContext) + */ public BreakPoss getNextBreakPoss(LayoutContext context) { LayoutManager curLM; // currently active LM int ipd = context.getRefIPD(); - int iIndents = fobj.getCommonMarginBlock().startIndent.getValue() + fobj.getCommonMarginBlock().endIndent.getValue(); - int bIndents = fobj.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false); + int iIndents = fobj.getCommonMarginBlock().startIndent.getValue(); + iIndents += fobj.getCommonMarginBlock().endIndent.getValue(); + iIndents -= fobj.getCommonMarginBlock().inheritedStartIndent.getValue(); + iIndents -= fobj.getCommonMarginBlock().inheritedEndIndent.getValue(); + //int bIndents = fobj.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false); ipd -= iIndents; MinOptMax stackSize = new MinOptMax(); @@ -258,6 +269,9 @@ return breakPoss; } + /** + * @see org.apache.fop.layoutmgr.LayoutManager#addAreas(org.apache.fop.layoutmgr.PositionIterator, org.apache.fop.layoutmgr.LayoutContext) + */ public void addAreas(PositionIterator parentIter, LayoutContext layoutContext) { getParentArea(null); @@ -309,16 +323,22 @@ * Finally, based on the dimensions of the parent area, it initializes * its own area. This includes setting the content IPD and the maximum * BPD. + * @param childArea area to get the parent area for */ public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); // set traits - TraitSetter.addBorders(curBlockArea, fobj.getCommonBorderPaddingBackground()); - TraitSetter.addBackground(curBlockArea, fobj.getCommonBorderPaddingBackground()); - TraitSetter.addMargins(curBlockArea, fobj.getCommonBorderPaddingBackground(), fobj.getCommonMarginBlock()); - TraitSetter.addBreaks(curBlockArea, fobj.getBreakBefore(), fobj.getBreakAfter()); + TraitSetter.addBorders(curBlockArea, + fobj.getCommonBorderPaddingBackground()); + TraitSetter.addBackground(curBlockArea, + fobj.getCommonBorderPaddingBackground()); + TraitSetter.addMargins(curBlockArea, + fobj.getCommonBorderPaddingBackground(), + fobj.getCommonMarginBlock()); + TraitSetter.addBreaks(curBlockArea, + fobj.getBreakBefore(), fobj.getBreakAfter()); // Set up dimensions // Must get dimensions from parent area @@ -337,13 +357,20 @@ if (parentwidth == 0) { parentwidth = referenceIPD; } - parentwidth -= fobj.getCommonMarginBlock().startIndent.getValue() + fobj.getCommonMarginBlock().endIndent.getValue(); + parentwidth -= fobj.getCommonMarginBlock().startIndent.getValue(); + parentwidth -= fobj.getCommonMarginBlock().endIndent.getValue(); + parentwidth += fobj.getCommonMarginBlock().inheritedStartIndent.getValue(); + parentwidth += fobj.getCommonMarginBlock().inheritedEndIndent.getValue(); + curBlockArea.setIPD(parentwidth); setCurrentArea(curBlockArea); // ??? for generic operations } return curBlockArea; } + /** + * @see org.apache.fop.layoutmgr.LayoutManager#addChild(org.apache.fop.area.Area) + */ public void addChild(Area childArea) { if (curBlockArea != null) { if (childArea instanceof LineArea) { @@ -354,6 +381,9 @@ } } + /** + * @see org.apache.fop.layoutmgr.LayoutManager#resetPosition(org.apache.fop.layoutmgr.Position) + */ public void resetPosition(Position resetPos) { if (resetPos == null) { reset(null);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]