Author: ssteiner Date: Fri Jul 13 10:29:57 2018 New Revision: 1835810 URL: http://svn.apache.org/viewvc?rev=1835810&view=rev Log: FOP-1760: Add change bar generation
Added: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/inline/InlineBlock.java - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop-core/src/main/java/org/apache/fop/area/inline/InlineBlock.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/ChangeBar.java - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop-core/src/main/java/org/apache/fop/fo/flow/ChangeBar.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/ChangeBarBegin.java - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop-core/src/main/java/org/apache/fop/fo/flow/ChangeBarBegin.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/ChangeBarEnd.java - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop-core/src/main/java/org/apache/fop/fo/flow/ChangeBarEnd.java xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_block.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_block.xml xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_inline.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_inline.xml xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_list.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_list.xml xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_overlapped.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_overlapped.xml xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_placement-rtl.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_placement-rtl.xml xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_placement.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_placement.xml xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_style.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_style.xml xmlgraphics/fop/trunk/fop/test/layoutengine/standard-testcases/change-bar_table.xml - copied unchanged from r1835807, xmlgraphics/fop/branches/Temp_ChangeBars2/fop/test/layoutengine/standard-testcases/change-bar_table.xml Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Area.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/AreaTreeParser.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Span.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/inline/TextArea.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOElementMapping.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FONode.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOText.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOTreeBuilder.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOValidationEventProducer.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FObj.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/table/TableRow.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/PageSequence.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/Root.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/AbstractPageNumberCitationLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineStackingLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/RowPainter.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractPathOrientedRenderer.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractRenderer.java xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/xml/XMLRenderer.java xmlgraphics/fop/trunk/fop/src/documentation/intermediate-format-ng/fop-intermediate-format-ng-datatypes.xsd Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Area.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Area.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Area.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Area.java Fri Jul 13 10:29:57 2018 @@ -20,12 +20,14 @@ package org.apache.fop.area; import java.io.Serializable; +import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.fop.fo.flow.ChangeBar; import org.apache.fop.traits.BorderProps; import org.apache.fop.traits.WritingModeTraitsGetter; @@ -129,6 +131,29 @@ public class Area extends AreaTreeObject protected static final Log log = LogFactory.getLog(Area.class); /** + * The active change bar list + */ + private List<ChangeBar> changeBarList; + + /** + * Returns the active change bar list. + * + * @return The active change bar list + */ + public List<ChangeBar> getChangeBarList() { + return changeBarList; + } + + /** + * Sets the active change bar list. + * + * @param changeBarList The active change bar list + */ + public void setChangeBarList(List<ChangeBar> changeBarList) { + this.changeBarList = changeBarList; + } + + /** * Get the area class of this area. * * @return the area class Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/AreaTreeParser.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/AreaTreeParser.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/AreaTreeParser.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/AreaTreeParser.java Fri Jul 13 10:29:57 2018 @@ -66,6 +66,7 @@ import org.apache.fop.area.inline.Contai import org.apache.fop.area.inline.ForeignObject; import org.apache.fop.area.inline.Image; import org.apache.fop.area.inline.InlineArea; +import org.apache.fop.area.inline.InlineBlock; import org.apache.fop.area.inline.InlineBlockParent; import org.apache.fop.area.inline.InlineParent; import org.apache.fop.area.inline.InlineViewport; @@ -80,6 +81,7 @@ import org.apache.fop.fo.extensions.Exte import org.apache.fop.fonts.Font; import org.apache.fop.fonts.FontInfo; import org.apache.fop.traits.BorderProps; +import org.apache.fop.traits.Direction; import org.apache.fop.traits.Visibility; import org.apache.fop.util.ColorUtil; import org.apache.fop.util.ContentHandlerFactory; @@ -190,6 +192,7 @@ public class AreaTreeParser { makers.put("block", new BlockMaker()); makers.put("lineArea", new LineAreaMaker()); makers.put("inline", new InlineMaker()); + makers.put("inlineblock", new InlineBlockMaker()); makers.put("inlineparent", new InlineParentMaker()); makers.put("inlineblockparent", new InlineBlockParentMaker()); makers.put("text", new TextMaker()); @@ -594,6 +597,17 @@ public class AreaTreeParser { BodyRegion body = getCurrentBodyRegion(); Span span = new Span(columnCount, body.getColumnGap(), ipd); + + String blockDirection = attributes.getValue("block-progression-direction"); + if (blockDirection != null) { + span.addTrait(Trait.BLOCK_PROGRESSION_DIRECTION, Direction.valueOf(blockDirection)); + } + + String inlineDirection = attributes.getValue("inline-progression-direction"); + if (inlineDirection != null) { + span.addTrait(Trait.INLINE_PROGRESSION_DIRECTION, Direction.valueOf(inlineDirection)); + } + transferForeignObjects(attributes, span); setAreaAttributes(attributes, span); body.getMainReference().getSpans().add(span); @@ -723,6 +737,34 @@ public class AreaTreeParser { } } + private class InlineBlockMaker extends AbstractMaker { + + public void startElement(Attributes attributes) { + + Block block = new Block(); + + if (attributes.getValue("left-offset") != null) { + block.setXOffset(XMLUtil.getAttributeAsInt(attributes, "left-offset", 0)); + } + if (attributes.getValue("top-offset") != null) { + block.setYOffset(XMLUtil.getAttributeAsInt(attributes, "top-offset", 0)); + } + transferForeignObjects(attributes, block); + setAreaAttributes(attributes, block); + setTraits(attributes, block, SUBSET_COMMON); + setTraits(attributes, block, SUBSET_BOX); + setTraits(attributes, block, SUBSET_COLOR); + Area parent = (Area)areaStack.peek(); + InlineBlock inlineBlock = new InlineBlock(block); + parent.addChildArea(inlineBlock); + areaStack.push(inlineBlock); + } + + public void endElement() { + assertObjectOfClass(areaStack.pop(), InlineBlock.class); + } + } + private class InlineParentMaker extends AbstractMaker { public void startElement(Attributes attributes) { Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Span.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Span.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Span.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/Span.java Fri Jul 13 10:29:57 2018 @@ -82,6 +82,15 @@ public class Span extends Area { } /** + * Get the column gap for this span area. + * + * @return the column gap for this span area + */ + public int getColumnGap() { + return colGap; + } + + /** * Get the width of a single column within this Span * * @return the width of a single column @@ -206,6 +215,8 @@ public class Span extends Area { } break; } + addTrait(Trait.INLINE_PROGRESSION_DIRECTION, wmtg.getInlineProgressionDirection()); + addTrait(Trait.BLOCK_PROGRESSION_DIRECTION, wmtg.getBlockProgressionDirection()); } /** {@inheritDoc} */ Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/inline/TextArea.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/inline/TextArea.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/inline/TextArea.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/area/inline/TextArea.java Fri Jul 13 10:29:57 2018 @@ -95,6 +95,7 @@ public class TextArea extends AbstractTe WordArea wordArea = new WordArea( blockProgressionOffset, minWordLevel, word, letterAdjust, levels, gposAdjustments); wordArea.setIPD(ipd); + wordArea.setChangeBarList(getChangeBarList()); addChildArea(wordArea); wordArea.setParentArea(this); updateLevel(minWordLevel); @@ -113,6 +114,7 @@ public class TextArea extends AbstractTe char space, int ipd, boolean adjustable, int blockProgressionOffset, int level) { SpaceArea spaceArea = new SpaceArea(blockProgressionOffset, level, space, adjustable); spaceArea.setIPD(ipd); + spaceArea.setChangeBarList(getChangeBarList()); addChildArea(spaceArea); spaceArea.setParentArea(this); updateLevel(level); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOElementMapping.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOElementMapping.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOElementMapping.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOElementMapping.java Fri Jul 13 10:29:57 2018 @@ -141,6 +141,10 @@ public class FOElementMapping extends El foObjs.put("marker", new MarkerMaker()); foObjs.put("retrieve-marker", new RetrieveMarkerMaker()); foObjs.put("retrieve-table-marker", new RetrieveTableMarkerMaker()); + + // change bars + foObjs.put("change-bar-begin", new ChangeBarBeginMaker()); + foObjs.put("change-bar-end", new ChangeBarEndMaker()); } } @@ -527,4 +531,16 @@ public class FOElementMapping extends El return new org.apache.fop.fo.flow.RetrieveTableMarker(parent); } } + + static class ChangeBarBeginMaker extends ElementMapping.Maker { + public FONode make(FONode parent) { + return new org.apache.fop.fo.flow.ChangeBarBegin(parent); + } + } + + static class ChangeBarEndMaker extends ElementMapping.Maker { + public FONode make(FONode parent) { + return new org.apache.fop.fo.flow.ChangeBarEnd(parent); + } + } } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FONode.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FONode.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FONode.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FONode.java Fri Jul 13 10:29:57 2018 @@ -20,6 +20,7 @@ package org.apache.fop.fo; // Java +import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Stack; @@ -42,6 +43,7 @@ import org.apache.fop.fo.extensions.Exte import org.apache.fop.fo.extensions.ExtensionElementMapping; import org.apache.fop.fo.extensions.InternalElementMapping; import org.apache.fop.fo.extensions.svg.SVGElementMapping; +import org.apache.fop.fo.flow.ChangeBar; import org.apache.fop.fo.pagination.Root; import org.apache.fop.util.CharUtilities; import org.apache.fop.util.ContentHandlerFactory; @@ -63,6 +65,12 @@ public abstract class FONode implements /** pointer to the sibling nodes */ protected FONode[] siblings; + /** The list of active change bars for the given node */ + protected List<ChangeBar> nodeChangeBarList; + + /** The list of active change bars for the start of the given node */ + protected List<ChangeBar> startOfNodeChangeBarList; + /** * Marks the location of this object from the input FO * <br>Call <code>locator.getSystemId()</code>, @@ -174,6 +182,18 @@ public abstract class FONode implements } /** + * Tests if the given element is a change bar element. + * + * @param namespaceURI The name space of the element + * @param localName The local name of the element + * @return A boolean value true if the given element is a change bar element + */ + public boolean isChangeBarElement(String namespaceURI, String localName) { + return FO_URI.equals(namespaceURI) + && (localName.equals("change-bar-begin") || localName.equals("change-bar-end")); + } + + /** * Returns the user agent that is associated with the * tree's <code>FOEventHandler</code>. * @@ -1083,6 +1103,15 @@ public abstract class FONode implements } /** + * Returns the list of active change bars. + * + * @return The list of active change bars + */ + public List<ChangeBar> getChangeBarList() { + return nodeChangeBarList; + } + + /** * Sets the structure tree element. * * @param structureTreeElement set. Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java Fri Jul 13 10:29:57 2018 @@ -322,6 +322,7 @@ public final class FOPropertyMapping imp gp.createTableProperties(); gp.createWritingModeProperties(); gp.createMiscProperties(); + gp.createChangeBarProperties(); // Hardcode the subproperties. addSubpropMakerName("length", CP_LENGTH); @@ -2588,6 +2589,56 @@ public final class FOPropertyMapping imp addPropertyMaker("writing-mode", m); } + private void createChangeBarProperties() { + PropertyMaker m; + + // change-bar-class + m = new StringProperty.Maker(PR_CHANGE_BAR_CLASS); + m.setInherited(false); + m.setDefault(""); + addPropertyMaker("change-bar-class", m); + + // change-bar-color + m = new ColorProperty.Maker(PR_CHANGE_BAR_COLOR); + + m.setInherited(true); + // TODO: fall back to "color" property + m.setDefault("black"); + addPropertyMaker("change-bar-color", m); + + // change-bar-placement + m = new EnumProperty.Maker(PR_CHANGE_BAR_PLACEMENT); + m.setInherited(true); + m.setDefault("start"); + m.addEnum("start", getEnumProperty(EN_START, "START")); + m.addEnum("end", getEnumProperty(EN_END, "END")); + m.addEnum("left", getEnumProperty(EN_LEFT, "LEFT")); + m.addEnum("right", getEnumProperty(EN_RIGHT, "RIGHT")); + m.addEnum("inside", getEnumProperty(EN_INSIDE, "INSIDE")); + m.addEnum("outside", getEnumProperty(EN_OUTSIDE, "OUTSIDE")); + m.addEnum("alternate", getEnumProperty(EN_ALTERNATE, "ALTERNATE")); + addPropertyMaker("change-bar-placement", m); + + // change-bar-style + m = new EnumProperty.Maker(PR_CHANGE_BAR_STYLE); + m.useGeneric(genericBorderStyle); + m.setInherited(true); + m.setDefault("solid"); + addPropertyMaker("change-bar-style", m); + + // change-bar-width + m = new LengthProperty.Maker(PR_CHANGE_BAR_WIDTH); + m.setInherited(true); + m.setDefault("6pt"); + addPropertyMaker("change-bar-width", m); + + // change-bar-offset + m = new LengthProperty.Maker(PR_CHANGE_BAR_OFFSET); + m.setInherited(true); + m.setDefault("6pt"); + addPropertyMaker("change-bar-offset", m); + } + private void createMiscProperties() { PropertyMaker m; Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOText.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOText.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOText.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOText.java Fri Jul 13 10:29:57 2018 @@ -33,6 +33,7 @@ import org.apache.fop.apps.FOPException; import org.apache.fop.complexscripts.bidi.DelimitedTextRange; import org.apache.fop.datatypes.Length; import org.apache.fop.fo.flow.Block; +import org.apache.fop.fo.pagination.PageSequence; import org.apache.fop.fo.properties.CommonFont; import org.apache.fop.fo.properties.CommonHyphenation; import org.apache.fop.fo.properties.CommonTextDecoration; @@ -109,6 +110,11 @@ public class FOText extends FONode imple */ public FOText(FONode parent) { super(parent); + + PageSequence pageSequence = getRoot().getLastPageSequence(); + if (pageSequence != null && pageSequence.hasChangeBars()) { + nodeChangeBarList = getRoot().getLastPageSequence().getClonedChangeBarList(); + } } /** {@inheritDoc} */ Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOTreeBuilder.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOTreeBuilder.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOTreeBuilder.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOTreeBuilder.java Fri Jul 13 10:29:57 2018 @@ -273,7 +273,9 @@ public class FOTreeBuilder extends Defau if (currentFObj.getNamespaceURI().equals(FOElementMapping.URI) || currentFObj.getNamespaceURI().equals(ExtensionElementMapping.URI) || currentFObj.getNamespaceURI().equals(PDFElementMapping.NAMESPACE)) { - currentFObj.validateChildNode(locator, namespaceURI, localName); + if (!currentFObj.isChangeBarElement(namespaceURI, localName)) { + currentFObj.validateChildNode(locator, namespaceURI, localName); + } } } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOValidationEventProducer.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOValidationEventProducer.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOValidationEventProducer.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FOValidationEventProducer.java Fri Jul 13 10:29:57 2018 @@ -382,6 +382,47 @@ public interface FOValidationEventProduc QName offendingNode, Locator loc); /** + * A class for change bars is not unique. + * @param source the event source + * @param elementName the name of the context node + * @param name the class name + * @param loc the location of the error or null + * @event.severity FATAL + */ + void changeBarClassNotUnique(Object source, String elementName, String name, + Locator loc); + + /** + * Change bars were not stacked correctly + * @param source the event source + * @param elementName the name of the context node + * @param beginName the class name of the beginning change bar + * @param endName the class name of the ending change bar + * @param loc the location of the error or null + * @event.severity FATAL + */ + void changeBarWrongStacking(Object source, String elementName, String beginName, + String endName, Locator loc); + + /** + * Change bar ended without a start of bar occurred + * @param source the event source + * @param elementName the name of the context node + * @param loc the location of the error or null + * @event.severity FATAL + */ + void changeBarNoBegin(Object source, String elementName, Locator loc); + + /** + * Change bar not descendant of fo:flow or fo:static-content + * @param source the event source + * @param elementName the name of the context node + * @param loc the location of the error or null + * @event.severity FATAL + */ + void changeBarWrongAncestor(Object source, String elementName, Locator loc); + + /** * Alternate text is missing for a graphic element. * * @param source the event source Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FObj.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FObj.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FObj.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/FObj.java Fri Jul 13 10:29:57 2018 @@ -21,6 +21,7 @@ package org.apache.fop.fo; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -34,7 +35,9 @@ import org.apache.xmlgraphics.util.QName import org.apache.fop.apps.FOPException; import org.apache.fop.fo.extensions.ExtensionAttachment; +import org.apache.fop.fo.flow.ChangeBar; import org.apache.fop.fo.flow.Marker; +import org.apache.fop.fo.pagination.PageSequence; import org.apache.fop.fo.properties.Property; import org.apache.fop.fo.properties.PropertyMaker; @@ -182,6 +185,39 @@ public abstract class FObj extends FONod if (id != null) { checkId(id); } + + PageSequence pageSequence = getRoot().getLastPageSequence(); + if (pageSequence != null && pageSequence.hasChangeBars()) { + startOfNodeChangeBarList = pageSequence.getClonedChangeBarList(); + } + } + + /** + * {@inheritDoc} + * @throws FOPException FOP Exception + */ + public void endOfNode() throws FOPException { + + List<ChangeBar> endOfNodeChangeBarList = null; + + PageSequence pageSequence = getRoot().getLastPageSequence(); + if (pageSequence != null) { + endOfNodeChangeBarList = pageSequence.getClonedChangeBarList(); + } + + if (startOfNodeChangeBarList != null && endOfNodeChangeBarList != null) { + + nodeChangeBarList = new LinkedList<ChangeBar>(endOfNodeChangeBarList); + nodeChangeBarList.retainAll(startOfNodeChangeBarList); + + if (nodeChangeBarList.isEmpty()) { + nodeChangeBarList = null; + } + + startOfNodeChangeBarList = null; + } + + super.endOfNode(); } /** @@ -492,6 +528,8 @@ public abstract class FObj extends FONod protected boolean isInlineItem(String nsURI, String lName) { return (FO_URI.equals(nsURI) && ("bidi-override".equals(lName) + || "change-bar-begin".equals(lName) + || "change-bar-end".equals(lName) || "character".equals(lName) || "external-graphic".equals(lName) || "instream-foreign-object".equals(lName) Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/table/TableRow.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/table/TableRow.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/table/TableRow.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/flow/table/TableRow.java Fri Jul 13 10:29:57 2018 @@ -90,9 +90,11 @@ public class TableRow extends TableCellC /** {@inheritDoc} */ protected void addChildNode(FONode child) throws FOPException { if (!inMarker()) { - TableCell cell = (TableCell) child; - TablePart part = (TablePart) getParent(); - addTableCellChild(cell, part.isFirst(this)); + if (child instanceof TableCell) { + TableCell cell = (TableCell) child; + TablePart part = (TablePart) getParent(); + addTableCellChild(cell, part.isFirst(this)); + } } super.addChildNode(child); } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/PageSequence.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/PageSequence.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/PageSequence.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/PageSequence.java Fri Jul 13 10:29:57 2018 @@ -19,6 +19,8 @@ package org.apache.fop.fo.pagination; +import java.util.LinkedList; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Stack; @@ -31,6 +33,7 @@ import org.apache.fop.datatypes.Numeric; import org.apache.fop.fo.FONode; import org.apache.fop.fo.PropertyList; import org.apache.fop.fo.ValidationException; +import org.apache.fop.fo.flow.ChangeBar; import org.apache.fop.fo.properties.CommonHyphenation; import org.apache.fop.traits.Direction; import org.apache.fop.traits.WritingMode; @@ -78,6 +81,11 @@ public class PageSequence extends Abstra private Flow mainFlow; /** + * Active change bars + */ + private final List<ChangeBar> changeBarList = new LinkedList<ChangeBar>(); + + /** * Create a PageSequence instance that is a child of the * given {@link FONode}. * @@ -118,6 +126,7 @@ public class PageSequence extends Abstra masterReference, getLocator()); } } + getRoot().addPageSequence(this); getFOEventHandler().startPageSequence(this); } @@ -464,4 +473,73 @@ public class PageSequence extends Abstra return pageSequenceMaster.getLastSimplePageMaster(isOddPage, isFirstPage, isBlank, getMainFlow() .getFlowName()); } + + /** + * Adds the specified change bar to the active change bar list. + * + * @param changeBarBegin The starting change bar element + */ + public void pushChangeBar(ChangeBar changeBarBegin) { + changeBarList.add(changeBarBegin); + } + + /** + * Removes the couple of the specified change bar from the active change bar list. + * + * @param changeBarEnd The ending change bar element + */ + public void popChangeBar(ChangeBar changeBarEnd) { + ChangeBar changeBarBegin = getChangeBarBegin(changeBarEnd); + if (changeBarBegin != null) { + changeBarList.remove(changeBarBegin); + } + } + + /** + * Returns the starting counterpart of the specified ending change bar. + * + * @param changeBarEnd The ending change bar element + * @return The starting counterpart of the specified ending change bar + */ + public ChangeBar getChangeBarBegin(ChangeBar changeBarEnd) { + if (changeBarList.isEmpty()) { + return null; + } else { + String changeBarClass = changeBarEnd.getChangeBarClass(); + for (int i = changeBarList.size() - 1; i >= 0; i--) { + ChangeBar changeBar = changeBarList.get(i); + if (changeBar.getChangeBarClass().equals(changeBarClass)) { + return changeBar; + } + } + } + return null; + } + + /** + * Tests if there are any active change bars. + * + * @return A boolean value true if there are any active change bars + */ + public boolean hasChangeBars() { + return !changeBarList.isEmpty(); + } + + /** + * Returns the list of active change bars. + * + * @return The list of active change bars + */ + public List<ChangeBar> getChangeBarList() { + return changeBarList; + } + + /** + * Returns the copy of active change bars list. + * + * @return The list containing a copy of the active change bars + */ + public List<ChangeBar> getClonedChangeBarList() { + return new LinkedList<ChangeBar>(changeBarList); + } } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/Root.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/Root.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/Root.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/pagination/Root.java Fri Jul 13 10:29:57 2018 @@ -282,6 +282,28 @@ public class Root extends FObj implement } /** + * Adds the specified page sequence. + * + * @param pageSequence The page sequence to add + */ + public void addPageSequence(PageSequence pageSequence) { + pageSequences.add(pageSequence); + } + + /** + * Returns the last page sequence (current while parsing). + * + * @return The last page sequence or null + */ + public PageSequence getLastPageSequence() { + if (getPageSequenceCount() > 0) { + return pageSequences.get(getPageSequenceCount() - 1); + } else { + return null; + } + } + + /** * Returns the associated LayoutMasterSet. * @return the LayoutMasterSet instance */ Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFac import org.apache.fop.datatypes.LengthBase; import org.apache.fop.datatypes.PercentBaseContext; import org.apache.fop.fo.FObj; +import org.apache.fop.fo.flow.ChangeBar; /** * The base class for nearly all LayoutManagers. @@ -257,6 +258,19 @@ public abstract class AbstractBaseLayout return fobj; } + /** + * Returns the active change bar list. + * + * @return The active change bar list + */ + public List<ChangeBar> getChangeBarList() { + if (fobj == null) { + return null; + } else { + return fobj.getChangeBarList(); + } + } + /** {@inheritDoc} */ public void reset() { throw new UnsupportedOperationException("Not implemented"); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -854,6 +854,7 @@ public class BlockContainerLayoutManager int level = getBlockContainerFO().getBidiLevel(); viewportBlockArea = new BlockViewport(allowBPDUpdate); + viewportBlockArea.setChangeBarList(getChangeBarList()); viewportBlockArea.addTrait(Trait.IS_VIEWPORT_AREA, Boolean.TRUE); if (level >= 0) { viewportBlockArea.setBidiLevel(level); @@ -892,6 +893,7 @@ public class BlockContainerLayoutManager } referenceArea = new Block(); + referenceArea.setChangeBarList(getChangeBarList()); referenceArea.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE); if (level >= 0) { referenceArea.setBidiLevel(level); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -357,6 +357,7 @@ public class BlockLayoutManager extends public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); curBlockArea.setIPD(super.getContentAreaIPD()); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -124,6 +124,7 @@ public abstract class BlockStackingLayou int sp = TraitSetter.getEffectiveSpace(adjust, minoptmax); if (sp != 0) { Block spacer = new Block(); + spacer.setChangeBarList(getChangeBarList()); spacer.setBPD(sp); parentLayoutManager.addChildArea(spacer); } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -178,6 +178,7 @@ public class ExternalDocumentLayoutManag Dimension imageSize = this.imageLayout.getViewportSize(); Block blockArea = new Block(); + blockArea.setChangeBarList(getChangeBarList()); blockArea.setIPD(imageSize.width); LineArea lineArea = new LineArea(); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/LayoutManagerMapping.java Fri Jul 13 10:29:57 2018 @@ -39,6 +39,8 @@ import org.apache.fop.fo.flow.BasicLink; import org.apache.fop.fo.flow.BidiOverride; import org.apache.fop.fo.flow.Block; import org.apache.fop.fo.flow.BlockContainer; +import org.apache.fop.fo.flow.ChangeBarBegin; +import org.apache.fop.fo.flow.ChangeBarEnd; import org.apache.fop.fo.flow.Character; import org.apache.fop.fo.flow.ExternalGraphic; import org.apache.fop.fo.flow.Float; @@ -146,6 +148,8 @@ public class LayoutManagerMapping implem registerMaker(TableHeader.class, new Maker()); registerMaker(Wrapper.class, new WrapperLayoutManagerMaker()); registerMaker(Title.class, new InlineLayoutManagerMaker()); + registerMaker(ChangeBarBegin.class, new Maker()); + registerMaker(ChangeBarEnd.class, new Maker()); registerMaker(MultiCase.class, new MultiCaseLayoutManagerMaker()); registerMaker(MultiSwitch.class, new MultiSwitchLayoutManagerMaker()); registerMaker(Float.class, new FloatLayoutManagerMaker()); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/AbstractPageNumberCitationLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/AbstractPageNumberCitationLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/AbstractPageNumberCitationLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/AbstractPageNumberCitationLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -133,6 +133,7 @@ public abstract class AbstractPageNumber getPSLM().addUnresolvedArea(citation.getRefId(), unresolved); text = unresolved; } + text.setChangeBarList(getChangeBarList()); setTraits(text); return text; } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -75,6 +75,7 @@ public class CharacterLayoutManager exte private TextArea createCharacterArea() { Character fobj = (Character) this.fobj; TextArea text = new TextArea(); + text.setChangeBarList(getChangeBarList()); char ch = fobj.getCharacter(); int ipd = font.getCharWidth(ch); int blockProgressionOffset = 0; Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ContentLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -84,6 +84,7 @@ public class ContentLayoutManager extend // get breaks then add areas to title this.parentLM = pslm; holder = new LineArea(); + holder.setChangeBarList(getChangeBarList()); // setUserAgent(foTitle.getUserAgent()); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -42,7 +42,9 @@ public class ExternalGraphicLayoutManage /** {@inheritDoc} */ protected Area getChildArea() { - return new Image(((ExternalGraphic) fobj).getSrc()); + Image im = new Image(((ExternalGraphic) fobj).getSrc()); + im.setChangeBarList(getChangeBarList()); + return im; } } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -206,9 +206,11 @@ public class InlineLayoutManager extends InlineArea area; if (isInline) { area = createInlineParent(); + area.setChangeBarList(getChangeBarList()); area.setBlockProgressionOffset(0); } else { area = new InlineBlockParent(); + area.setChangeBarList(getChangeBarList()); } if (fobj instanceof Inline || fobj instanceof BasicLink) { TraitSetter.setProducerID(area, fobj.getId()); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineStackingLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineStackingLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineStackingLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InlineStackingLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -181,6 +181,7 @@ public abstract class InlineStackingLayo if (iAdjust != 0) { //getLogger().debug("Add leading space: " + iAdjust); Space ls = new Space(); + ls.setChangeBarList(getChangeBarList()); ls.setIPD(iAdjust); int level = parentArea.getBidiLevel(); if (level >= 0) { Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java Fri Jul 13 10:29:57 2018 @@ -46,7 +46,9 @@ public class InstreamForeignObjectLM ext org.w3c.dom.Document doc = child.getDOMDocument(); String ns = child.getNamespaceURI(); - return new ForeignObject(doc, ns); + ForeignObject obj = new ForeignObject(doc, ns); + obj.setChangeBarList(getChangeBarList()); + return obj; } } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LeaderLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -217,6 +217,10 @@ public class LeaderLayoutManager extends leaderArea.setBidiLevel(fobj.getBidiLevelRecursive()); } } + + assert leaderArea != null; + leaderArea.setChangeBarList(getChangeBarList()); + TraitSetter.setProducerID(leaderArea, fobj.getId()); return leaderArea; } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -1504,6 +1504,8 @@ public class LineLayoutManager extends I LineArea lineArea = new LineArea( (lbp.getLeafPos() < seq.size() - 1 ? textAlignment : textAlignmentLast), lbp.difference, lbp.availableStretch, lbp.availableShrink); + lineArea.setChangeBarList(getChangeBarList()); + if (lbp.startIndent != 0) { lineArea.addTrait(Trait.START_INDENT, lbp.startIndent); } @@ -1619,6 +1621,7 @@ public class LineLayoutManager extends I } LineArea lineArea = new LineArea(); + lineArea.setChangeBarList(getChangeBarList()); setCurrentArea(lineArea); LayoutContext lc = LayoutContext.newInstance(); lc.setAlignmentContext(alignmentContext); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -32,6 +32,7 @@ import org.apache.fop.area.Trait; import org.apache.fop.area.inline.TextArea; import org.apache.fop.fo.Constants; import org.apache.fop.fo.FOText; +import org.apache.fop.fo.flow.ChangeBar; import org.apache.fop.fonts.Font; import org.apache.fop.fonts.FontSelector; import org.apache.fop.fonts.GlyphMapping; @@ -312,6 +313,7 @@ public class TextLayoutManager extends L TextArea textArea = new TextAreaBuilder(realWidth, totalAdjust, context, firstMappingIndex, lastMappingIndex, context.isLastArea(), mapping.font).build(); + textArea.setChangeBarList(getChangeBarList()); // wordSpaceDim is computed in relation to wordSpaceIPD.opt // but the renderer needs to know the adjustment in relation @@ -411,6 +413,7 @@ public class TextLayoutManager extends L textArea = new TextArea(width.getStretch(), width.getShrink(), adjust); } + textArea.setChangeBarList(getChangeBarList()); } private void setInlineProgressionDimension() { @@ -1457,6 +1460,15 @@ public class TextLayoutManager extends L } + @Override + public List<ChangeBar> getChangeBarList() { + if (foText == null) { + return null; + } else { + return foText.getChangeBarList(); + } + } + /** {@inheritDoc} */ public String toString() { return super.toString() + "{" Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -68,10 +68,12 @@ public class WrapperLayoutManager extend if (parentLayoutManager instanceof BlockStackingLayoutManager && !(parentLayoutManager instanceof BlockLayoutManager)) { Block helperBlock = new Block(); + helperBlock.setChangeBarList(getChangeBarList()); TraitSetter.setProducerID(helperBlock, fobj.getId()); parentLayoutManager.addChildArea(helperBlock); } else { InlineArea area = getEffectiveArea(context); + area.setChangeBarList(getChangeBarList()); parentLayoutManager.addChildArea(area); } } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -216,6 +216,7 @@ public class ListBlockLayoutManager exte public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); // Set up dimensions // Must get dimensions from parent area Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -176,6 +176,7 @@ public class ListItemContentLayoutManage public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); curBlockArea.setPositioning(Block.ABSOLUTE); // set position curBlockArea.setXOffset(xOffset); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -739,6 +739,7 @@ public class ListItemLayoutManager exten public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); // Set up dimensions /*Area parentArea =*/ parentLayoutManager.getParentArea(curBlockArea); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/RowPainter.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/RowPainter.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/RowPainter.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/RowPainter.java Fri Jul 13 10:29:57 2018 @@ -468,6 +468,7 @@ class RowPainter { //generate the block area Block block = new Block(); + block.setChangeBarList(tclm.getTableLM().getFObj().getChangeBarList()); block.setPositioning(Block.ABSOLUTE); block.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE); block.setIPD(ipd); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableAndCaptionLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -179,6 +179,8 @@ public class TableAndCaptionLayoutManage public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); + // Set up dimensions // Must get dimensions from parent area Area parentArea = parentLayoutManager.getParentArea(curBlockArea); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCaptionLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -175,6 +175,8 @@ public class TableCaptionLayoutManager e public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); + // Set up dimensions // Must get dimensions from parent area Area parentArea = parentLayoutManager.getParentArea(curBlockArea); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -529,11 +529,13 @@ public class TableCellLayoutManager exte if (usedBPD < cellBPD) { if (getTableCell().getDisplayAlign() == EN_CENTER) { Block space = new Block(); + space.setChangeBarList(getChangeBarList()); space.setBPD((cellBPD - usedBPD) / 2); space.setBidiLevel(getTableCell().getBidiLevelRecursive()); curBlockArea.addBlock(space); } else if (getTableCell().getDisplayAlign() == EN_AFTER) { Block space = new Block(); + space.setChangeBarList(getChangeBarList()); space.setBPD(cellBPD - usedBPD); space.setBidiLevel(getTableCell().getBidiLevelRecursive()); curBlockArea.addBlock(space); @@ -620,6 +622,7 @@ public class TableCellLayoutManager exte boolean outer, int level) { if (blocks[i][j] == null) { blocks[i][j] = new Block(); + blocks[i][j].setChangeBarList(getChangeBarList()); blocks[i][j].addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE); blocks[i][j].setPositioning(Block.ABSOLUTE); blocks[i][j].setBidiLevel(level); @@ -651,6 +654,7 @@ public class TableCellLayoutManager exte int paddingEnd = padding.getPaddingEnd(false, this); Block block = new Block(); + block.setChangeBarList(getChangeBarList()); TraitSetter.setProducerID(block, getTable().getId()); block.setPositioning(Block.ABSOLUTE); block.setIPD(cellIPD + paddingStart + paddingEnd); @@ -677,6 +681,7 @@ public class TableCellLayoutManager exte public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); curBlockArea.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE); TraitSetter.setProducerID(curBlockArea, getTableCell().getId()); curBlockArea.setPositioning(Block.ABSOLUTE); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java Fri Jul 13 10:29:57 2018 @@ -438,6 +438,8 @@ public class TableLayoutManager extends public Area getParentArea(Area childArea) { if (curBlockArea == null) { curBlockArea = new Block(); + curBlockArea.setChangeBarList(getChangeBarList()); + // Set up dimensions // Must get dimensions from parent area /*Area parentArea =*/ parentLayoutManager.getParentArea(curBlockArea); Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractPathOrientedRenderer.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractPathOrientedRenderer.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractPathOrientedRenderer.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractPathOrientedRenderer.java Fri Jul 13 10:29:57 2018 @@ -736,6 +736,7 @@ public abstract class AbstractPathOrient // save position and offset int saveIP = currentIPPosition; int saveBP = currentBPPosition; + int saveBO = getBeginOffset(); //Establish a new coordinate system AffineTransform at = new AffineTransform(); @@ -743,6 +744,8 @@ public abstract class AbstractPathOrient at.translate(block.getXOffset(), block.getYOffset()); at.translate(0, block.getSpaceBefore()); + setBeginOffset(saveBO - block.getXOffset()); + if (!at.isIdentity()) { establishTransformationMatrix(at); } @@ -760,6 +763,8 @@ public abstract class AbstractPathOrient restoreGraphicsState(); } + setBeginOffset(saveBO); + // stacked and relative blocks effect stacking currentIPPosition = saveIP; currentBPPosition = saveBP; Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractRenderer.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractRenderer.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractRenderer.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/AbstractRenderer.java Fri Jul 13 10:29:57 2018 @@ -41,6 +41,7 @@ import org.apache.fop.apps.FOUserAgent; import org.apache.fop.area.Area; import org.apache.fop.area.BeforeFloat; import org.apache.fop.area.Block; +import org.apache.fop.area.BlockParent; import org.apache.fop.area.BlockViewport; import org.apache.fop.area.BodyRegion; import org.apache.fop.area.CTM; @@ -61,6 +62,7 @@ import org.apache.fop.area.inline.Filled import org.apache.fop.area.inline.ForeignObject; import org.apache.fop.area.inline.Image; import org.apache.fop.area.inline.InlineArea; +import org.apache.fop.area.inline.InlineBlock; import org.apache.fop.area.inline.InlineBlockParent; import org.apache.fop.area.inline.InlineParent; import org.apache.fop.area.inline.InlineViewport; @@ -70,7 +72,11 @@ import org.apache.fop.area.inline.SpaceA import org.apache.fop.area.inline.TextArea; import org.apache.fop.area.inline.WordArea; import org.apache.fop.fo.Constants; +import org.apache.fop.fo.flow.ChangeBar; +import org.apache.fop.fo.properties.Property; import org.apache.fop.fonts.FontInfo; +import org.apache.fop.traits.BorderProps; +import org.apache.fop.traits.Direction; import org.apache.fop.traits.Visibility; /** @@ -111,7 +117,74 @@ public abstract class AbstractRenderer */ protected int containingIPPosition; - /** the currently active PageViewport */ + /** + * The "start edge" IP Position of the current column (for change bars) + */ + protected int columnStartIPPosition; + + /** + * The "end edge" IP Position of the current column (for change bars) + */ + protected int columnEndIPPosition; + + /** + * The "left" position of the current column (for change bars) + */ + protected int columnLeftIPPosition; + + /** + * The "right" position of the current column (for change bars) + */ + protected int columnRightIPPosition; + + /** + * The number of columns in the span (for change bars) + */ + protected int columnCount; + + /** + * The index number of the current column (for change bars) + */ + protected int columnIndex; + + /** + * The column width (for change bars) + */ + protected int columnWidth; + + /** + * The size of column gap (for change bars) + */ + protected int columnGap; + + /** + * The block progression direction (for change bars) + */ + protected Direction blockProgressionDirection; + + /** + * The inline progression direction (for change bars) + */ + protected Direction inlineProgressionDirection; + + /** + * Is binding on start edge of column? + */ + protected boolean bindingOnStartEdge; + + /** + * Is binding on end edge of column? + */ + protected boolean bindingOnEndEdge; + + /** + * The IP begin offset of coordinate 0 + */ + private int beginOffset; + + /** + * the currently active PageViewport + */ protected PageViewport currentPageViewport; /* warned XML handlers */ @@ -407,36 +480,95 @@ public abstract class AbstractRenderer * that are positioned into columns. * </p> * - * @param mr The main reference area + * @param mainReference The main reference area */ - protected void renderMainReference(MainReference mr) { + protected void renderMainReference(MainReference mainReference) { Span span = null; - List spans = mr.getSpans(); + List spans = mainReference.getSpans(); int saveBPPos = currentBPPosition; - int saveSpanBPPos = saveBPPos; int saveIPPos = currentIPPosition; + int saveSpanBPPos = saveBPPos; + for (Object span1 : spans) { span = (Span) span1; + + columnCount = span.getColumnCount(); + columnGap = span.getColumnGap(); + columnWidth = span.getColumnWidth(); + + blockProgressionDirection = (Direction) span.getTrait(Trait.BLOCK_PROGRESSION_DIRECTION); + inlineProgressionDirection = (Direction) span.getTrait(Trait.INLINE_PROGRESSION_DIRECTION); + int level = span.getBidiLevel(); if (level < 0) { level = 0; } if ((level & 1) == 1) { currentIPPosition += span.getIPD(); - currentIPPosition += mr.getColumnGap(); + currentIPPosition += columnGap; } - for (int c = 0; c < span.getColumnCount(); c++) { - NormalFlow flow = span.getNormalFlow(c); + + for (columnIndex = 0; columnIndex < columnCount; columnIndex++) { + + NormalFlow flow = span.getNormalFlow(columnIndex); + + boolean isLeftToRight = (inlineProgressionDirection == null) + || (inlineProgressionDirection.getEnumValue() == Constants.EN_LR); + if (flow != null) { + + // if direction is right to left, then end is left edge, + // else end is right edge (for top-bottom/bottom-top block + // progression directions) + + // binding edge is on left edge for odd pages and + // on right edge for even pages + + int pageIndex = currentPageViewport.getPageIndex(); + + bindingOnStartEdge = false; + bindingOnEndEdge = false; + + if (isLeftToRight) { + + columnStartIPPosition = 0; + columnEndIPPosition = columnWidth; + columnLeftIPPosition = 0; + columnRightIPPosition = columnWidth; + + if (blockProgressionDirection == null || blockProgressionDirection.isVertical()) { + if (pageIndex % 2 == 0) { + bindingOnStartEdge = true; + } else { + bindingOnEndEdge = true; + } + } + + } else { + + columnStartIPPosition = columnWidth; + columnEndIPPosition = 0; + columnLeftIPPosition = 0; + columnRightIPPosition = columnWidth; + + if (blockProgressionDirection == null || blockProgressionDirection.isVertical()) { + if (pageIndex % 2 == 0) { + bindingOnEndEdge = true; + } else { + bindingOnStartEdge = true; + } + } + } + currentBPPosition = saveSpanBPPos; if ((level & 1) == 1) { currentIPPosition -= flow.getIPD(); - currentIPPosition -= mr.getColumnGap(); + currentIPPosition -= columnGap; } renderFlow(flow); if ((level & 1) == 0) { currentIPPosition += flow.getIPD(); - currentIPPosition += mr.getColumnGap(); + currentIPPosition += columnGap; } } } @@ -504,7 +636,6 @@ public abstract class AbstractRenderer endVParea(); // clip if necessary - currentIPPosition = saveIP; currentBPPosition = saveBP; } else { @@ -584,6 +715,18 @@ public abstract class AbstractRenderer */ protected void renderBlock(Block block) { assert block != null; + List<ChangeBar> changeBarList = block.getChangeBarList(); + + if (changeBarList != null && !changeBarList.isEmpty()) { + int saveIP = currentIPPosition; + int saveBP = currentBPPosition; + + drawChangeBars(block, changeBarList); + + currentIPPosition = saveIP; + currentBPPosition = saveBP; + } + List children = block.getChildAreas(); boolean inNewLayer = false; if (maybeStartLayer(block)) { @@ -628,7 +771,17 @@ public abstract class AbstractRenderer } /** + * Renders an inline block area. + * + * @param inlineBlock The inline block area + */ + protected void renderInlineBlock(InlineBlock inlineBlock) { + renderBlock(inlineBlock.getBlock()); + } + + /** * Establish new optional content group layer. + * * @param layer name of layer */ protected abstract void startLayer(String layer); @@ -699,6 +852,11 @@ public abstract class AbstractRenderer * @param inlineArea inline area text to render */ protected void renderInlineArea(InlineArea inlineArea) { + List<ChangeBar> changeBarList = inlineArea.getChangeBarList(); + + if (changeBarList != null && !changeBarList.isEmpty()) { + drawChangeBars(inlineArea, changeBarList); + } if (inlineArea instanceof TextArea) { renderText((TextArea) inlineArea); //} else if (inlineArea instanceof Character) { @@ -707,6 +865,8 @@ public abstract class AbstractRenderer renderWord((WordArea) inlineArea); } else if (inlineArea instanceof SpaceArea) { renderSpace((SpaceArea) inlineArea); + } else if (inlineArea instanceof InlineBlock) { + renderInlineBlock((InlineBlock) inlineArea); } else if (inlineArea instanceof InlineParent) { renderInlineParent((InlineParent) inlineArea); } else if (inlineArea instanceof InlineBlockParent) { @@ -757,6 +917,16 @@ public abstract class AbstractRenderer List children = text.getChildAreas(); int saveIP = currentIPPosition; int saveBP = currentBPPosition; + + List<ChangeBar> changeBarList = text.getChangeBarList(); + + if (changeBarList != null && !changeBarList.isEmpty()) { + drawChangeBars(text, changeBarList); + + currentIPPosition = saveIP; + currentBPPosition = saveBP; + } + for (Object aChildren : children) { InlineArea inline = (InlineArea) aChildren; renderInlineArea(inline); @@ -877,6 +1047,11 @@ public abstract class AbstractRenderer * (todo) Make renderImage() protected */ public void renderImage(Image image, Rectangle2D pos) { + List<ChangeBar> changeBarList = image.getChangeBarList(); + + if (changeBarList != null && !changeBarList.isEmpty()) { + drawChangeBars(image, changeBarList); + } // Default: do nothing. // Some renderers (ex. Text) don't support images. } @@ -903,6 +1078,12 @@ public abstract class AbstractRenderer * (todo) Make renderForeignObject() protected */ protected void renderForeignObject(ForeignObject fo, Rectangle2D pos) { + List<ChangeBar> changeBarList = fo.getChangeBarList(); + + if (changeBarList != null && !changeBarList.isEmpty()) { + drawChangeBars(fo, changeBarList); + } + // Default: do nothing. // Some renderers (ex. Text) don't support foreign objects. } @@ -975,4 +1156,191 @@ public abstract class AbstractRenderer matrix[5] = Math.round(matrix[5] * 1000); return new AffineTransform(matrix); } + + /** + * Draws all change bars associated with an area. + * + * @param area The area to draw change bars for + * @param changeBarList The list of change bars affecting the area + */ + protected void drawChangeBars(Area area, List<ChangeBar> changeBarList) { + + if (area.getTraitAsBoolean(Trait.IS_REFERENCE_AREA)) { + return; + } + + Block changeBarArea; + + int saveIP = currentIPPosition; + int saveBP = currentBPPosition; + + int currentColumnStartIP = columnStartIPPosition; + int currentColumnEndIP = columnEndIPPosition; + int currentColumnLeftIP = columnLeftIPPosition; + int currentColumnRightIP = columnRightIPPosition; + + for (ChangeBar changeBar : changeBarList) { + + boolean isLeftToRight = (inlineProgressionDirection == null) + || (inlineProgressionDirection.getEnumValue() == Constants.EN_LR); + + changeBarArea = new Block(); + + // currentIPPosition is reset to zero so from now on all multicolumn + // dimensions has to be calculated relatively to the given column + currentIPPosition = 0; + currentBPPosition = saveBP; + + int changeBarWidth = changeBar.getWidth().getValue(); + int changeBarOffset = changeBar.getOffset().getValue(); + + if (isLeftToRight) { + currentColumnStartIP = columnStartIPPosition - changeBarWidth; + currentColumnLeftIP = columnLeftIPPosition - changeBarWidth; + } else { + currentColumnEndIP = columnEndIPPosition - changeBarWidth; + currentColumnLeftIP = columnLeftIPPosition - changeBarWidth; + } + + // xOffset by default is negative width for change bars placed on the + // start edge (overriden if placement is at the end edge) + int xOffset = currentColumnStartIP; + + // xScale is for adding or subtracting the offset of the change bar + // depending on placing the bar towards or away from the edge it is + // bound to + int xScale = -1; + + // determines currentIPPosition based on placement + switch (changeBar.getPlacement()) { + case EN_START: + xOffset = currentColumnStartIP; + xScale = -1; + break; + case EN_END: + xOffset = currentColumnEndIP; + xScale = 1; + break; + case EN_LEFT: + xOffset = currentColumnLeftIP; + xScale = (isLeftToRight) ? -1 : 1; + break; + case EN_RIGHT: + xOffset = currentColumnRightIP; + xScale = (isLeftToRight) ? 1 : -1; + break; + case EN_INSIDE: + if (bindingOnStartEdge) { + xOffset = currentColumnStartIP; + xScale = -1; + } else if (bindingOnEndEdge) { + xOffset = currentColumnEndIP; + xScale = 1; + } else { + xOffset = currentColumnStartIP; + xScale = -1; + } + break; + case EN_OUTSIDE: + if (bindingOnStartEdge) { + xOffset = columnEndIPPosition; + xScale = 1; + } else if (bindingOnEndEdge) { + xOffset = columnStartIPPosition; + xScale = -1; + } else { + xOffset = columnStartIPPosition; + xScale = -1; + } + break; + case EN_ALTERNATE: + if (columnCount == 2) { + if (columnIndex == 0) { + xOffset = columnStartIPPosition; + xScale = -1; + } else { + xOffset = columnEndIPPosition; + xScale = 1; + } + } else { + if (bindingOnStartEdge) { + xOffset = columnEndIPPosition; + xScale = 1; + } else if (bindingOnEndEdge) { + xOffset = columnStartIPPosition; + xScale = -1; + } else { + xOffset = columnStartIPPosition; + xScale = -1; + } + } + break; + default: + break; + } + + if (isLeftToRight) { + xOffset += xScale * changeBarOffset; + } else { + xOffset -= xScale * changeBarOffset; + } + + xOffset += getBeginOffset(); + + // Change bar area has 0 ipd, class xsl-absolute, no margin or padding + changeBarArea.setAreaClass(Area.CLASS_ABSOLUTE); + changeBarArea.setIPD(0); + + BorderProps props = BorderProps.makeRectangular( + changeBar.getStyle(), changeBarWidth, changeBar.getColor(), + BorderProps.Mode.SEPARATE); + + changeBarArea.addTrait(Trait.BORDER_START, props); + changeBarArea.addTrait(Trait.BORDER_END, props); + + changeBarArea.setXOffset(xOffset); + + int areaHeight = area.getAllocBPD(); + + if (area instanceof BlockParent) { + changeBarArea.setBPD(areaHeight); + changeBarArea.setYOffset(((BlockParent) area).getYOffset()); + renderBlock(changeBarArea); + + } else { + if (areaHeight > 0) { + Property p = changeBar.getLineHeight().getOptimum(DummyPercentBaseContext.getInstance()); + int lineHeight = p.getLength().getValue(); + changeBarArea.setBPD(lineHeight); + changeBarArea.setYOffset(areaHeight - lineHeight); + } + renderInlineBlock(new InlineBlock(changeBarArea)); + } + + // restore position on page + currentIPPosition = saveIP; + currentBPPosition = saveBP; + } + } + + /** + * Returns the begin offset of the inline begin (changes by reference area + * transforms). + * + * @return the offset from current coordinate system 0 that the IP begin is + * at + */ + protected int getBeginOffset() { + return beginOffset; + } + + /** + * Sets the begin offset for inline progression begin (changes by reference + * area tranforms). + * + * @param offset the new offset from IPP 0 that true IP start is at + */ + protected void setBeginOffset(int offset) { + beginOffset = offset; + } } Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/xml/XMLRenderer.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/xml/XMLRenderer.java?rev=1835810&r1=1835809&r2=1835810&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/xml/XMLRenderer.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/xml/XMLRenderer.java Fri Jul 13 10:29:57 2018 @@ -72,6 +72,7 @@ import org.apache.fop.area.inline.Contai import org.apache.fop.area.inline.ForeignObject; import org.apache.fop.area.inline.Image; import org.apache.fop.area.inline.InlineArea; +import org.apache.fop.area.inline.InlineBlock; import org.apache.fop.area.inline.InlineBlockParent; import org.apache.fop.area.inline.InlineParent; import org.apache.fop.area.inline.InlineViewport; @@ -692,6 +693,26 @@ public class XMLRenderer extends Abstrac endElement("block"); } + /** {@inheritDoc} */ + @Override + protected void renderInlineBlock(InlineBlock inlineBlock) { + Block block = inlineBlock.getBlock(); + atts.clear(); + addAreaAttributes(block); + addTraitAttributes(block); + if (block.getXOffset() != 0) { + addAttribute("left-offset", block.getXOffset()); + } + if (block.getYOffset() != 0) { + addAttribute("top-offset", block.getYOffset()); + } + startElement("inlineblock", atts); + if (block.getChildAreas() != null) { + renderBlocks(null, block.getChildAreas()); + } + endElement("inlineblock"); + } + /** * {@inheritDoc} */ @@ -943,6 +964,4 @@ public class XMLRenderer extends Abstrac addAttribute("reversed", "true"); } } - - } --------------------------------------------------------------------- To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org