package gutenberg.itext; import com.google.common.base.Function; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPCellEvent; import com.itextpdf.text.pdf.PdfPTable; import gutenberg.util.Margin; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class PercentBackgroundEvent implements PdfPCellEvent { private final float percent; private final Function<Float, BaseColor> colorProviders; private final Margin margin; public PercentBackgroundEvent(int count, int total, Function<Float, BaseColor> colorProviders) { this(count, total, colorProviders, new Margin(0f)); } public PercentBackgroundEvent(int count, int total, Function<Float, BaseColor> colorProviders, Margin margin) { this.colorProviders = colorProviders; this.margin = margin; if (total == 0) { this.percent = 0.0f; } else { this.percent = ((float) count) / ((float) total); } } @Override public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] canvas) { BaseColor color = colorProviders.apply(percent); if (color != null) { PdfContentByte cb = canvas[PdfPTable.BACKGROUNDCANVAS]; cb.saveState(); cb.setColorFill(color); cb.rectangle( rect.getLeft() + margin.marginLeft, rect.getBottom() + margin.marginBottom, rect.getWidth() * percent - (margin.marginLeft + margin.marginRight), rect.getHeight() - (margin.marginTop + margin.marginBottom)); cb.fill(); cb.restoreState(); } } }