package com.baselet.diagram;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import com.baselet.control.StringStyle;
import com.baselet.control.basics.geom.DimensionDouble;
import com.baselet.control.config.Config;
import com.baselet.control.constants.Constants;
import com.baselet.control.enums.AlignHorizontal;
public class FontHandler {
private final DiagramHandler handler;
private Double fontSize;
private Double diagramDefaultSize = null; // if "fontsize=..." is uncommented this variable is set
private String diagramDefaultFontFamily = null;
private FontRenderContext fontrenderContext = new FontRenderContext(null, true, true);
public FontHandler(DiagramHandler handler) {
this.handler = handler;
}
public void setFontSize(Double fontsize) {
fontSize = fontsize;
}
public void setDiagramDefaultFontFamily(String fontfamily) {
if (Constants.fontFamilyList.contains(fontfamily)) {
diagramDefaultFontFamily = fontfamily;
}
}
public void resetDiagramDefaultFontFamily() {
diagramDefaultFontFamily = null;
}
private String getDiagramDefaultFontFamily() {
String returnFontFamily;
if (diagramDefaultFontFamily != null) {
returnFontFamily = diagramDefaultFontFamily;
}
else {
returnFontFamily = Config.getInstance().getDefaultFontFamily();
}
return returnFontFamily;
}
public void setDiagramDefaultFontSize(Double diagramDefaultSize) {
this.diagramDefaultSize = diagramDefaultSize;
}
public void resetFontSize() {
fontSize = null;
}
public void resetDiagramDefaultFontSize() {
diagramDefaultSize = null;
}
public double getFontSize() {
return getFontSize(true);
}
public double getFontSize(boolean applyZoom) {
Double returnFontSize;
if (fontSize != null) {
returnFontSize = fontSize;
}
else if (diagramDefaultSize != null) {
returnFontSize = diagramDefaultSize;
}
else {
returnFontSize = Double.valueOf(Config.getInstance().getDefaultFontsize());
}
if (applyZoom) {
return returnFontSize * handler.getGridSize() / Constants.DEFAULTGRIDSIZE;
}
else {
return returnFontSize;
}
}
public Font getFont() {
return getFont(true);
}
public Font getFont(boolean applyZoom) {
return new Font(getDiagramDefaultFontFamily(), Font.PLAIN, (int) getFontSize(applyZoom));
}
public double getDistanceBetweenTexts() {
return getDistanceBetweenTexts(true);
}
public double getDistanceBetweenTexts(boolean applyZoom) {
return getFontSize(applyZoom) / 4;
}
public DimensionDouble getTextSize(String stringWithFormatLabels) {
return getTextSize(stringWithFormatLabels, true);
}
public DimensionDouble getTextSize(String stringWithFormatLabels, boolean applyZoom) {
if (stringWithFormatLabels.isEmpty()) {
return new DimensionDouble(0, 0);
}
return new FormattedFont(stringWithFormatLabels, getFontSize(applyZoom), getFont(applyZoom), fontrenderContext).getDimensions();
}
public DimensionDouble getTextSize(StringStyle singleLine, boolean applyZoom) {
if (singleLine.getStringWithoutMarkup().isEmpty()) {
return new DimensionDouble(0, 0);
}
return new FormattedFont(singleLine, getFontSize(applyZoom), getFont(applyZoom), fontrenderContext).getDimensions();
}
public double getTextWidth(String s) {
return getTextWidth(s, true);
}
public double getTextWidth(String s, boolean applyZoom) {
if (s == null) {
return 0;
}
return this.getTextSize(s, applyZoom).getWidth();
}
public void writeText(Graphics2D g2, String s, double x, double y, AlignHorizontal align) {
writeText(g2, s, x, y, align, true);
}
public void writeText(Graphics2D g2, String s, double x, double y, AlignHorizontal align, boolean applyZoom) {
for (String line : s.split("\n", -1)) {
write(g2, StringStyle.analyzeFormatLabels(line), x, y, align, applyZoom);
y += g2.getFontMetrics().getHeight();
}
}
public void writeText(Graphics2D g2, StringStyle[] lines, double x, double y, AlignHorizontal align) {
writeText(g2, lines, x, y, align, true);
}
public void writeText(Graphics2D g2, StringStyle[] lines, double x, double y, AlignHorizontal align, boolean applyZoom) {
for (StringStyle line : lines) {
write(g2, line, x, y, align, applyZoom);
y += g2.getFontMetrics().getHeight();
}
}
private void write(Graphics2D g2, StringStyle singleLine, double x, double y, AlignHorizontal align, boolean applyZoom) {
if (singleLine == null || singleLine.getStringWithoutMarkup().isEmpty()) {
return;
}
double fontSize = getFontSize(applyZoom);
FormattedFont formattedFont = new FormattedFont(singleLine, fontSize, getFont(applyZoom), g2.getFontRenderContext());
fontrenderContext = g2.getFontRenderContext(); // TODO workaround to make sure getTextSize works without a graphics object
if (align == AlignHorizontal.CENTER) {
x = (int) (x - formattedFont.getWidth() / 2);
}
else if (align == AlignHorizontal.RIGHT) {
x = (int) (x - formattedFont.getWidth());
}
g2.drawString(formattedFont.getAttributedCharacterIterator(), (float) x, (float) y);
}
public static DimensionDouble getTextSizeStatic(FormattedFont formattedFont) {
return new DimensionDouble(formattedFont.getWidth(), formattedFont.getHeight());
}
}