in fop-core/src/main/java/org/apache/fop/render/AbstractRenderer.java [1166:1324]
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;
}
}