From 7702e8e7850d013617515c020530e95243e14cf9 Mon Sep 17 00:00:00 2001 From: hneemann Date: Fri, 26 Jul 2019 14:45:38 +0200 Subject: [PATCH] fixed some minor sizing issues --- .../text/formatter/GraphicsFormatter.java | 3 +- .../components/table/ExpressionComponent.java | 42 +++++++++++++------ .../text/formatter/GraphicsFormatterTest.java | 11 +++++ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatter.java b/src/main/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatter.java index 051118a12..666ed97d0 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatter.java +++ b/src/main/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatter.java @@ -58,7 +58,6 @@ public final class GraphicsFormatter { // if there was an exception, return the complete raw text as a fragment fragment = new TextFragment(sizer, font, text); } - fragment.dx += font.getSize() / 10; return fragment; } @@ -132,7 +131,7 @@ public final class GraphicsFormatter { * @param expression the expression * @return the fragment */ - private static Fragment createFragment(FontSizer sizer, Font font, Expression expression) throws FormatterException { + public static Fragment createFragment(FontSizer sizer, Font font, Expression expression) throws FormatterException { if (expression instanceof Variable) { String ident = ((Variable) expression).getIdentifier(); return createFragment(sizer, font, ident); diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionComponent.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionComponent.java index 189b0c89d..ae4f6ecb1 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionComponent.java @@ -7,9 +7,13 @@ package de.neemann.digital.gui.components.table; import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.draw.graphics.text.formatter.GraphicsFormatter; +import sun.font.FontDesignMetrics; import javax.swing.*; import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import static de.neemann.digital.draw.graphics.text.formatter.GraphicsFormatter.createFragment; @@ -20,8 +24,6 @@ import static de.neemann.digital.draw.graphics.text.formatter.GraphicsFormatter. public class ExpressionComponent extends JComponent { private static final int XPAD = 5; private ArrayList expressions; - private Dimension lastRectSet; - /** * Sets a single expression to visualize @@ -29,7 +31,7 @@ public class ExpressionComponent extends JComponent { * @param expression the expression */ public void setExpression(Expression expression) { - ArrayList l = new ArrayList(); + ArrayList l = new ArrayList<>(); l.add(expression); setExpressions(l); } @@ -41,6 +43,7 @@ public class ExpressionComponent extends JComponent { */ public void setExpressions(ArrayList expressions) { this.expressions = expressions; + setPreferredSize(calcSize()); revalidate(); repaint(); } @@ -59,13 +62,33 @@ public class ExpressionComponent extends JComponent { gr.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); int lineSpacing = getFont().getSize() / 2; int y = 0; - int dx = 0; for (Expression e : expressions) { try { GraphicsFormatter.Fragment fr = createFragment(gr, e); y += fr.getHeight(); fr.draw(gr, XPAD, y); y += lineSpacing; + } catch (GraphicsFormatter.FormatterException ex) { + } + } + } + + private Dimension calcSize() { + FontRenderContext frc = new FontRenderContext(new AffineTransform(), true, false); + + int lineSpacing = getFont().getSize() / 2; + int dx = 0; + int y = 0; + for (Expression e : expressions) { + try { + GraphicsFormatter.Fragment fr = createFragment((fragment, font, str) -> { + Rectangle2D rec = font.getStringBounds(str, frc); + final FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font, frc); + fragment.set((int) rec.getWidth(), (int) rec.getHeight(), metrics.getDescent()); + }, getFont(), e); + + y += fr.getHeight(); + y += lineSpacing; if (dx < fr.getWidth()) dx = fr.getWidth(); @@ -73,14 +96,7 @@ public class ExpressionComponent extends JComponent { } catch (GraphicsFormatter.FormatterException ex) { } } - - Dimension p = new Dimension(dx+XPAD*2, y); - if (!p.equals(lastRectSet)) { - lastRectSet = p; - SwingUtilities.invokeLater(() -> { - setPreferredSize(p); - revalidate(); - }); - } + return new Dimension(dx + XPAD * 2, y); } + } diff --git a/src/test/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatterTest.java b/src/test/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatterTest.java index 532cc6e55..1617a7793 100644 --- a/src/test/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatterTest.java +++ b/src/test/java/de/neemann/digital/draw/graphics/text/formatter/GraphicsFormatterTest.java @@ -25,4 +25,15 @@ public class GraphicsFormatterTest extends TestCase { assertTrue(f instanceof GraphicsFormatter.TextFragment); } + public void testInvert() { + GraphicsFormatter.Fragment f = GraphicsFormatter.createFragment( + (fragment, font, str) -> { + assertEquals("Q", str); + fragment.set(10, 10, 5); + }, + Font.decode(null), "~{~Q}"); + + assertEquals(10, f.dx); + } + }