protected void drawChangeBars()

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;
        }
    }