package org.apache.fop.layoutmgr.inline;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.util.List;
import org.apache.fop.area.Area;
import org.apache.fop.area.inline.InlineArea;
import org.apache.fop.area.inline.InlineViewport;
import org.apache.fop.datatypes.LengthBase;
import org.apache.fop.fo.FObj;
import org.apache.fop.fo.flow.AbstractGraphics;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.layoutmgr.LayoutContext;
import org.apache.fop.layoutmgr.TraitSetter;
public abstract class AbstractGraphicsLayoutManager extends LeafNodeLayoutManager {
public AbstractGraphicsLayoutManager(AbstractGraphics node) {
super(node);
}
private InlineViewport getInlineArea() {
final AbstractGraphics fobj = (AbstractGraphics)this.fobj;
Dimension intrinsicSize = new Dimension(
fobj.getIntrinsicWidth(),
fobj.getIntrinsicHeight());
int bidiLevel = fobj.getBidiLevel();
ImageLayout imageLayout = new ImageLayout(fobj, this, intrinsicSize);
Rectangle placement = imageLayout.getPlacement();
CommonBorderPaddingBackground borderProps = fobj.getCommonBorderPaddingBackground();
setCommonBorderPaddingBackground(borderProps);
int beforeBPD = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
beforeBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE, false);
placement.y += beforeBPD;
if ((bidiLevel == -1) || ((bidiLevel & 1) == 0)) {
int startIPD = borderProps.getPadding(CommonBorderPaddingBackground.START, false, this);
startIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.START, false);
placement.x += startIPD;
} else {
int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false, this);
endIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, false);
placement.x += endIPD;
}
Area viewportArea = getChildArea();
TraitSetter.setProducerID(viewportArea, fobj.getId());
transferForeignAttributes(viewportArea);
InlineViewport vp = new InlineViewport(viewportArea, bidiLevel);
TraitSetter.setProducerID(vp, fobj.getId());
vp.setIPD(imageLayout.getViewportSize().width);
vp.setBPD(imageLayout.getViewportSize().height);
vp.setContentPosition(placement);
vp.setClip(imageLayout.isClipped());
vp.setBlockProgressionOffset(0);
TraitSetter.addBorders(vp, borderProps
, false, false, false, false, this);
TraitSetter.addPadding(vp, borderProps
, false, false, false, false, this);
TraitSetter.addBackground(vp, borderProps, this);
return vp;
}
public List getNextKnuthElements(LayoutContext context,
int alignment) {
InlineViewport areaCurrent = getInlineArea();
setCurrentArea(areaCurrent);
return super.getNextKnuthElements(context, alignment);
}
@Override
protected InlineArea getEffectiveArea(LayoutContext layoutContext) {
InlineArea area = curArea != null ? curArea : getInlineArea();
curArea = null;
if (!layoutContext.treatAsArtifact()) {
TraitSetter.addStructureTreeElement(area, ((AbstractGraphics) fobj).getStructureTreeElement());
}
return area;
}
protected AlignmentContext makeAlignmentContext(LayoutContext context) {
final AbstractGraphics fobj = (AbstractGraphics)this.fobj;
return new AlignmentContext(
get(context).getAllocBPD()
, fobj.getAlignmentAdjust()
, fobj.getAlignmentBaseline()
, fobj.getBaselineShift()
, fobj.getDominantBaseline()
, context.getAlignmentContext()
);
}
protected abstract Area getChildArea();
public int getBaseLength(int lengthBase, FObj fobj) {
switch (lengthBase) {
case LengthBase.IMAGE_INTRINSIC_WIDTH:
return ((AbstractGraphics)fobj).getIntrinsicWidth();
case LengthBase.IMAGE_INTRINSIC_HEIGHT:
return ((AbstractGraphics)fobj).getIntrinsicHeight();
case LengthBase.ALIGNMENT_ADJUST:
return get(null).getBPD();
default:
return super.getBaseLength(lengthBase, fobj);
}
}
}