fixed some minor sizing issues

This commit is contained in:
hneemann 2019-07-26 14:45:38 +02:00
parent 61a22aa057
commit 7702e8e785
3 changed files with 41 additions and 15 deletions

View File

@ -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);

View File

@ -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<Expression> 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<Expression> l = new ArrayList<Expression>();
ArrayList<Expression> l = new ArrayList<>();
l.add(expression);
setExpressions(l);
}
@ -41,6 +43,7 @@ public class ExpressionComponent extends JComponent {
*/
public void setExpressions(ArrayList<Expression> 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);
}
}

View File

@ -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);
}
}