package org.apache.fop.layoutmgr.inline;
import org.apache.fop.area.Trait;
import org.apache.fop.area.inline.InlineArea;
import org.apache.fop.area.inline.ResolvedPageNumber;
import org.apache.fop.fo.flow.PageNumber;
import org.apache.fop.fonts.Font;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.FontTriplet;
import org.apache.fop.layoutmgr.LayoutContext;
import org.apache.fop.layoutmgr.TraitSetter;
import org.apache.fop.traits.MinOptMax;
public class PageNumberLayoutManager extends LeafNodeLayoutManager {
private PageNumber fobj;
private Font font;
public PageNumberLayoutManager(PageNumber node) {
super(node);
fobj = node;
}
public void initialize() {
FontInfo fi = fobj.getFOEventHandler().getFontInfo();
FontTriplet[] fontkeys = fobj.getCommonFont().getFontState(fi);
font = fi.getFontInstance(fontkeys[0], fobj.getCommonFont().fontSize.getValue(this));
setCommonBorderPaddingBackground(fobj.getCommonBorderPaddingBackground());
}
protected AlignmentContext makeAlignmentContext(LayoutContext context) {
return new AlignmentContext(
font
, fobj.getLineHeight().getOptimum(this).getLength().getValue(this)
, fobj.getAlignmentAdjust()
, fobj.getAlignmentBaseline()
, fobj.getBaselineShift()
, fobj.getDominantBaseline()
, context.getAlignmentContext()
);
}
public InlineArea get(LayoutContext context) {
ResolvedPageNumber pn = new ResolvedPageNumber();
String str = getCurrentPV().getPageNumberString();
int width = getStringWidth(str);
int level = getBidiLevel();
pn.addWord(str, 0, level);
pn.setBidiLevel(level);
pn.setIPD(width);
pn.setBPD(font.getAscender() - font.getDescender());
pn.setBaselineOffset(font.getAscender());
TraitSetter.addFontTraits(pn, font);
pn.addTrait(Trait.COLOR, fobj.getColor());
TraitSetter.addTextDecoration(pn, fobj.getTextDecoration());
return pn;
}
protected InlineArea getEffectiveArea(LayoutContext layoutContext) {
ResolvedPageNumber baseArea = (ResolvedPageNumber)curArea;
ResolvedPageNumber pn = new ResolvedPageNumber();
TraitSetter.setProducerID(pn, fobj.getId());
pn.setIPD(baseArea.getIPD());
pn.setBPD(baseArea.getBPD());
pn.setBlockProgressionOffset(baseArea.getBlockProgressionOffset());
pn.setBaselineOffset(baseArea.getBaselineOffset());
pn.addTrait(Trait.COLOR, fobj.getColor());
pn.getTraits().putAll(baseArea.getTraits());
if (!layoutContext.treatAsArtifact()) {
TraitSetter.addStructureTreeElement(pn, fobj.getStructureTreeElement());
}
updateContent(pn);
return pn;
}
private void updateContent(ResolvedPageNumber pn) {
pn.removeText();
pn.addWord(getCurrentPV().getPageNumberString(), 0, getBidiLevel());
pn.handleIPDVariation(getStringWidth(pn.getText()) - pn.getIPD());
areaInfo.ipdArea = MinOptMax.getInstance(pn.getIPD());
}
private int getStringWidth(String str) {
int width = 0;
for (int count = 0; count < str.length(); count++) {
width += font.getCharWidth(str.charAt(count));
}
return width;
}
protected int getBidiLevel() {
return fobj.getBidiLevel();
}
}