package com.baselet.diagram; import java.awt.Font; import java.awt.font.FontRenderContext; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import com.baselet.control.StringStyle; import com.baselet.control.basics.geom.DimensionDouble; import com.baselet.control.enums.FormatLabels; public class FormattedFont { private static Integer underline; private static Float bold; private static Float italic; private final String string; private final AttributedString atrString; private final FontRenderContext fontRenderContext; private final TextLayout textLayout; public FormattedFont(String stringWithFormatLabels, double fontSize, Font font, FontRenderContext fontRenderContext) { this(StringStyle.analyzeFormatLabels(stringWithFormatLabels), fontSize, font, fontRenderContext); } public FormattedFont(StringStyle text, double fontSize, Font font, FontRenderContext fontRenderContext) { setFormat(text); string = text.getStringWithoutMarkup(); atrString = new AttributedString(string); this.fontRenderContext = fontRenderContext; atrString.addAttribute(TextAttribute.FAMILY, font.getFamily()); atrString.addAttribute(TextAttribute.SIZE, fontSize); atrString.addAttribute(TextAttribute.WEIGHT, bold); atrString.addAttribute(TextAttribute.POSTURE, italic); atrString.addAttribute(TextAttribute.UNDERLINE, underline, 0, string.length()); textLayout = new TextLayout(getAttributedCharacterIterator(), fontRenderContext); } public String getString() { return string; } public FontRenderContext getFontRenderContext() { return fontRenderContext; } public AttributedCharacterIterator getAttributedCharacterIterator() { return atrString.getIterator(); } private static void setFormat(StringStyle style) { if (style.getFormat().contains(FormatLabels.UNDERLINE)) { underline = TextAttribute.UNDERLINE_ON; } else { underline = -1; // UNDERLINE_OFF } if (style.getFormat().contains(FormatLabels.BOLD)) { bold = TextAttribute.WEIGHT_BOLD; } else { bold = TextAttribute.WEIGHT_REGULAR; } if (style.getFormat().contains(FormatLabels.ITALIC)) { italic = TextAttribute.POSTURE_OBLIQUE; } else { italic = TextAttribute.POSTURE_REGULAR; } } public double getWidth() { return textLayout.getVisibleAdvance(); } public double getHeight() { return textLayout.getBounds().getHeight(); } public DimensionDouble getDimensions() { return new DimensionDouble(getWidth(), getHeight()); } }