package edu.jsu.leathrum.mathlets.shared; import javax.swing.*; import java.awt.Font; import java.awt.Color; import java.awt.Dimension; public class FormattedLabel extends MLabel { // Single-character formatting using '@' escape sequences: // to get printed '@', use "@@" // @i = italic // @b = bold (can be combined with @i -- SHOULD give bold-italic) // @, = half-space // @! = negative half-space !! DEPRECATED in this version // @. = quarter-space // @: = negative quarter-space !! DEPRECATED in this version // @^ = superscript // @_ = subscript // @< = literal '<' character (HTML <) // @> = literal '>' character (HTML >) // @s = character substitution: // @sa -> \u03B1 alpha // @sb -> \u03B2 beta // @sg -> \u03B3 gamma // @sD -> \u0394 cap-delta // @sd -> \u03B4 delta // @se -> \u03B5 epsilon // @sw -> \u03C9 omega // @sh -> \u03B8 theta // @sf -> \u03C6 phi // @sq -> \u03C8 psi // @sp -> \u03C0 pi // @sr -> \u03C1 rho // @ss -> \u03C3 sigma // @st -> \u03C4 tau // @s> -> \u2192 arrow -> // @s< -> \u2190 arrow <- // @s% -> \u221A square root radical // @s$ -> \u2211 summation cap-sigma // @sI -> \u222B integral private static Box b = new Box(BoxLayout.Y_AXIS); public FormattedLabel(String s) { super(); b.add(this); this.setText(s); } public FormattedLabel() { super(); b.add(this); this.setText(""); } public void setText(String s) { if (this.getRootPane() != null) this.getRootPane().setGlassPane(b); super.setText(htmlify(s)); } // new approach using JLabel's HTML abilities for the formatting private String htmlify(String s) { String ret = ""; boolean esc = false, isital = false, isbold = false, issup = false; boolean issub = false, ischarsub = false; for (int i=0; i': ret += ">"; break; default: ret += s.charAt(i); } esc = false; } else if (s.charAt(i)=='@') esc = true; else { String tmp = (new Character(s.charAt(i))).toString(); if (ischarsub) { tmp = (new Character(substChar(s.charAt(i)))).toString(); ischarsub = false; } if (isital) { tmp = applyEnv(tmp,"i"); isital = false; } if (isbold) { tmp = applyEnv(tmp,"b"); isbold = false; } if (issup) { tmp = applyEnv(tmp,"sup"); issup = false; } if (issub) { tmp = applyEnv(tmp,"sub"); issub = false; } ret += tmp; } } return applyEnv(ret,"html"); } private char substChar(char c) { switch (c) { case 'a': return '\u03B1'; // alpha case 'b': return '\u03B2'; // beta case 'g': return '\u03B3'; // gamma case 'D': return '\u0394'; // cap-delta case 'd': return '\u03B4'; // delta case 'e': return '\u03B5'; // epsilon case 'w': return '\u03C9'; // omega case 'h': return '\u03B8'; // theta case 'f': return '\u03C6'; // phi case 'q': return '\u03C8'; // psi case 'p': return '\u03C0'; // pi case 'r': return '\u03C1'; // rho case 's': return '\u03C3'; // sigma case 't': return '\u03C4'; // tau case '<': return '\u2190'; // arrow <- case '>': return '\u2192'; // arrow -> case '%': return '\u221A'; // square root radical case '$': return '\u2211'; // summation cap-sigma case 'I': return '\u222B'; // integral default: return c; } } private static String applyEnv(String s, String env) { return "<"+env+">"+s+""; } public static String subAll(String s) { return applyEnv(s,"sub"); } public static String supAll(String s) { return applyEnv(s,"sup"); } public static String italAll(String s) { return applyEnv(s,"i"); } public static String boldAll(String s) { return applyEnv(s,"b"); } public static String colorAll(String s, String c) { return ""+s+""; } public static String colorAll(String s, Color c) { return colorAll(s, "#"+Integer.toHexString(c.getRGB()).substring(2)); } }