package boxrenderer; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; import java.awt.geom.Rectangle2D; import org.apache.commons.lang3.StringUtils; import org.jfree.text.TextBlock; import org.jfree.text.TextBlockAnchor; import org.jfree.text.TextUtilities; import org.jfree.ui.HorizontalAlignment; public class TextBox extends AbstractBox { private String text; private Font font; private FontManager fontManager; public TextBox(String text) { this.text = text; getBorder().setApplicable(false); getPadding().setApplicable(false); getMargin().setApplicable(false); setInline(true); } public TextBox(String text, FontManager fontManager) { this(text); this.fontManager = fontManager; } public TextBox(String text, Font font) { this(text); this.font = font; } @Override public Dimension getContentDimension(Graphics2D g2) throws Exception { setupFont(); TextBlock block = TextUtilities.createTextBlock(text, font, getTextColor()); Shape shape = block.calculateBounds(g2, 0, 0, TextBlockAnchor.TOP_LEFT, 0, 0, 0); Rectangle2D rect = shape.getBounds2D(); return new Dimension((int)rect.getMaxX()+1, (int)rect.getMaxY()+1); } private Paint getTextColor() { Paint paint = getColor(); return paint!=null?paint:Color.black; } @Override public void renderContent(Graphics2D g2) throws Exception { setupFont(); g2.setPaint(getTextColor()); TextBlock block = TextUtilities.createTextBlock(text, font, getTextColor()); block.setLineAlignment(HorizontalAlignment.LEFT); block.draw(g2, 0, 0, TextBlockAnchor.TOP_LEFT, 0, 0, 0); } private void setupFont() { if(font == null) { if(fontManager != null) { font = fontManager.getFont(getFFamily(), getFStyle(), getFSize()); } else { font = new Font(getFFamily(), getFStyle(), getFSize()); } } } private String getFFamily() { String ff = getFontFamily(); if(StringUtils.isBlank(ff)) { ff = "Serif"; } return ff; } private int getFSize() { int size = getFontSize(); if(size <=0) { size = 12; } return size; } private int getFStyle() { int style = Font.PLAIN; if(isBold()) { style |= Font.BOLD; } return style; } }