|
From: Frederick W. <fre...@us...> - 2012-01-13 20:26:14
|
rails/ui/swing/GUIToken.java | 31 ++++++++++++++++++++++++++++---
1 file changed, 28 insertions(+), 3 deletions(-)
New commits:
commit 9d1152f5efce158c43ebf25a984ba89a35cf5502
Author: Frederick Weld <fre...@gm...>
Date: Fri Jan 13 21:24:04 2012 +0100
Enhanced readability of token texts (condensed, multi-line)
Texts containing 3 characters are displayed in condensed mode.
Texts with more than 4 characters are split into two lines.
With these changes, 1830 labels are readable on 800x600.
diff --git a/rails/ui/swing/GUIToken.java b/rails/ui/swing/GUIToken.java
index 5a02f08..7e07c63 100644
--- a/rails/ui/swing/GUIToken.java
+++ b/rails/ui/swing/GUIToken.java
@@ -2,8 +2,11 @@
package rails.ui.swing;
import java.awt.*;
+import java.awt.font.TextAttribute;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
+import java.util.HashMap;
+import java.util.Map;
import javax.swing.JPanel;
@@ -109,19 +112,41 @@ public class GUIToken extends JPanel {
public static void drawTokenText (String text, Graphics g, Color c, Point tokenCenter, double tokenDiameter) {
+ //recursion if text contains more than 3 characters
+ //not perfect (heuristic!) but good enough for this exceptional case
+ if (text.length() > 3) {
+ drawTokenText( text.substring(0, text.length() / 2), g, c,
+ new Point (tokenCenter.x, (int)((double)tokenCenter.y - tokenDiameter / 4 / 1.3)),
+ tokenDiameter / 2 / (1 - tokenTextMargin) * 1.2);
+ drawTokenText( text.substring(text.length() / 2, text.length()), g, c,
+ new Point (tokenCenter.x, (int)((double)tokenCenter.y + tokenDiameter / 4 * 1.1)),
+ tokenDiameter / 2 / (1 - tokenTextMargin) * 1.2);
+ return;
+ }
+
+ //create condensed font if more than 2 chars in a line
+ Font fontTemplate;
+ if (text.length() > 2) {
+ Map<TextAttribute, Object> attributes = new HashMap<TextAttribute, Object>();
+ attributes.put(TextAttribute.WIDTH, TextAttribute.WIDTH_CONDENSED);
+ fontTemplate = tokenFontTemplate.deriveFont(attributes);
+ } else {
+ fontTemplate = tokenFontTemplate;
+ }
+
//first calculate font size
double allowedTextDiameter = tokenDiameter * (1 - tokenTextMargin);
- Rectangle2D textBoundsInTemplate = g.getFontMetrics(tokenFontTemplate).getStringBounds(text, g);
+ Rectangle2D textBoundsInTemplate = g.getFontMetrics(fontTemplate).getStringBounds(text, g);
double fontScalingX = allowedTextDiameter / textBoundsInTemplate.getWidth();
double fontScalingY = allowedTextDiameter / textBoundsInTemplate.getHeight();
double fontScaling = (fontScalingX < fontScalingY) ? fontScalingX : fontScalingY;
- int fontSize = (int) Math.floor(fontScaling * tokenFontTemplate.getSize());
+ int fontSize = (int) Math.floor(fontScaling * fontTemplate.getSize());
//draw text
Color oldColor = g.getColor();
Font oldFont = g.getFont();
g.setColor(c);
- g.setFont(tokenFontTemplate.deriveFont((float)fontSize)); //float needed to indicate size (not style)
+ g.setFont(fontTemplate.deriveFont((float)fontSize)); //float needed to indicate size (not style)
Rectangle2D textBounds = g.getFontMetrics().getStringBounds(text, g);
g.drawString(text,
tokenCenter.x - (int)textBounds.getCenterX(),
|