package gutenberg.itext; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Font; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class FontModifier { public static FontModifier NULL_MODIFIER = new FontModifier().freeze(); public static FontModifier fontModifier() { return new FontModifier(); } private boolean frozen = false; private Boolean bold; private Boolean italic; private Integer style; private Float size; private BaseColor color; public FontModifier style(int style) { checkFrozen(); this.style = style; return this; } public FontModifier size(float size) { checkFrozen(); this.size = size; return this; } public FontModifier color(BaseColor color) { checkFrozen(); this.color = color; return this; } public FontModifier bold() { checkFrozen(); bold = true; return this; } public FontModifier noBold() { checkFrozen(); bold = false; return this; } public FontModifier italic() { checkFrozen(); italic = true; return this; } public FontModifier noItalic() { checkFrozen(); italic = false; return this; } public FontModifier freeze() { frozen = true; return this; } private void checkFrozen() { if (frozen) throw new IllegalStateException("Modifier frozen!"); } public Font modify(Font font) { if (noModifier()) return font; int fontStyle = styleOf(font); fontStyle = overrideIfNotNull(fontStyle, style); fontStyle = applyStyleModifier(fontStyle, bold, Font.BOLD); fontStyle = applyStyleModifier(fontStyle, italic, Font.ITALIC); return new Font(font.getBaseFont(), val(size, font.getSize()), val(fontStyle, font.getStyle()), val(color, font.getColor())); } private boolean noModifier() { return bold == null && italic == null && style == null && color == null && size == null; } private static int applyStyleModifier(int fontStyle, Boolean mode, int flag) { if (mode == null) { return fontStyle; } if (mode) { return fontStyle | flag; } else { return fontStyle & ~flag; } } private static int overrideIfNotNull(int fontStyle, Integer overrider) { if (overrider != null) { return overrider; } return fontStyle; } private static <T> T val(T value, T defaultValue) { return value != null ? value : defaultValue; } private static int styleOf(Font font) { return ((font.getStyle() != Font.UNDEFINED) ? font.getStyle() : Font.NORMAL); } }