You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ss...@apache.org on 2018/07/13 10:29:57 UTC

svn commit: r1835810 [1/2] - in /xmlgraphics/fop/trunk: fop-core/src/main/java/org/apache/fop/area/ fop-core/src/main/java/org/apache/fop/area/inline/ fop-core/src/main/java/org/apache/fop/fo/ fop-core/src/main/java/org/apache/fop/fo/flow/ fop-core/src...

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-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org