diff --git a/src/main/java/eva2/gui/PropertySheetPanel.java b/src/main/java/eva2/gui/PropertySheetPanel.java index ddf78242..f1617e25 100644 --- a/src/main/java/eva2/gui/PropertySheetPanel.java +++ b/src/main/java/eva2/gui/PropertySheetPanel.java @@ -300,10 +300,7 @@ public final class PropertySheetPanel extends JPanel implements PropertyChangeLi continue; } // end try - // Add some specific display for some greeks here - name = translateGreek(name); - name = eva2.tools.StringTools.humaniseCamelCase(name); - propertyTableModel.addRow(new Object[]{name, newView}); + propertyTableModel.addRow(new Object[]{prepareLabel(name), newView}); } propertyTable.setToolTips(toolTips); @@ -327,6 +324,15 @@ public final class PropertySheetPanel extends JPanel implements PropertyChangeLi setVisible(true); } + private String prepareLabel(String label) { + // Add some specific display for some greeks here + label = StringTools.translateGreek(label); + label = StringTools.humaniseCamelCase(label); + label = StringTools.subscriptIndices(label); + label = "" + label + ""; + return label; + } + private static JPanel buildTitledSeperator(String title) { JPanel titledSeperator = new JPanel(new GridBagLayout()); @@ -558,116 +564,6 @@ public final class PropertySheetPanel extends JPanel implements PropertyChangeLi return infoPanel; } - private String translateGreek(String name) { - // Add some specific display for some greeks here - if (name.equalsIgnoreCase("alpha")) { - return "\u03B1"; - } - if (name.equalsIgnoreCase("beta")) { - return "\u03B2"; - } - if (name.equalsIgnoreCase("gamma")) { - return "\u03B3"; - } - if (name.equalsIgnoreCase("gammab")) { - return "\u0393"; - } - if (name.equalsIgnoreCase("delta")) { - return "\u03B4"; - } - if (name.equalsIgnoreCase("deltab")) { - return "\u0394"; - } - if ((name.equalsIgnoreCase("epsi")) || (name.equalsIgnoreCase("epsilon"))) { - return "\u03B5"; - } - if (name.equalsIgnoreCase("zeta")) { - return "\u03B6"; - } - if (name.equalsIgnoreCase("theta")) { - return "\u03D1"; - } - if (name.equalsIgnoreCase("thetab")) { - return "\u0398"; - } - if (name.equalsIgnoreCase("iota")) { - return "\u03B9"; - } - if (name.equalsIgnoreCase("kappa")) { - return "\u03BA"; - } - if (name.equalsIgnoreCase("lambda")) { - return "\u03BB"; - } - if (name.equalsIgnoreCase("lambdab")) { - return "\u039B"; - } - if (name.equalsIgnoreCase("rho")) { - return "\u03C1"; - } - if (name.equalsIgnoreCase("sigma")) { - return "\u03C3"; - } - if (name.equalsIgnoreCase("sigmab")) { - return "\u03A3"; - } - if (name.equalsIgnoreCase("tau")) { - return "\u03C4"; - } - if (name.equalsIgnoreCase("upsilon")) { - return "\u03C5"; - } - if (name.equalsIgnoreCase("upsilonb")) { - return "\u03D2"; - } - if (name.equalsIgnoreCase("omega")) { - return "\u03C9"; - } - if (name.equalsIgnoreCase("omegab")) { - return "\u03A9"; - } - - // these are too small - if (name.equalsIgnoreCase("eta")) { - return "\u03B7"; - } - if (name.equalsIgnoreCase("psi")) { - return "\u03C8"; - } - if (name.equalsIgnoreCase("psib")) { - return "\u03A8"; - } - if (name.equalsIgnoreCase("phi")) { - return "\u03D5"; - } - if (name.equalsIgnoreCase("phib")) { - return "\u03A6"; - } - if (name.equalsIgnoreCase("chi")) { - return "\u03C7"; - } - if ((name.equalsIgnoreCase("mu")) || (name.equalsIgnoreCase("my")) || (name.equalsIgnoreCase("myu"))) { - return "\u03BC"; - } - if (name.equalsIgnoreCase("nu")) { - return "\u03BD"; - } - if (name.equalsIgnoreCase("xi")) { - return "\u03BE"; - } - if (name.equalsIgnoreCase("xib")) { - return "\u039E"; - } - if (name.equalsIgnoreCase("pi")) { - return "\u03C0"; - } - if (name.equalsIgnoreCase("pib")) { - return "\u03A0"; - } - - return name; - } - /** * Get the html help file name. * diff --git a/src/main/java/eva2/tools/StringTools.java b/src/main/java/eva2/tools/StringTools.java index 5bb9a429..1daddae8 100644 --- a/src/main/java/eva2/tools/StringTools.java +++ b/src/main/java/eva2/tools/StringTools.java @@ -15,8 +15,7 @@ public final class StringTools { /** * Private constructor to prevent instantiation. */ - private StringTools() { - } + private StringTools() {} /** * Returns a HTML formatted String, in which each line is at most lineBreak @@ -480,6 +479,9 @@ public final class StringTools { } /** + * Takes a full package name and returns the string + * after the last period (usually the class name). + * * @param value The string to cut * @return Returns the class Name without package. */ @@ -491,5 +493,87 @@ public final class StringTools { } return className; // now is shortName } + + /** + * Takes a string and looks for greek letter names. If found, + * replaces them by their greek unicode counterparts. + * + * @param name A string + * @return String with greek letter names replaced + */ + public static String translateGreek(String name) { + // Add some specific display for some greeks here + final String[][] mapping = { + { "alpha", "α" }, + { "beta", "β" }, + { "gamma", "γ"}, + { "gammab", "Γ"}, + { "delta", "δ"}, + { "deltab", "Δ"}, + { "epsi", "epsilon", "ε"}, + { "zeta", "ζ"}, + { "theta", "ϑ"}, + { "thetab", "Θ"}, + { "iota", "ι"}, + { "kappa", "κ"}, + { "lambda", "λ"}, + { "lambdab", "Λ"}, + { "rho", "ρ"}, + { "sigma", "σ"}, + { "sigmab", "Σ"}, + { "tau", "τ"}, + { "upsilon", "υ"}, + { "upsilonb", "ϒ"}, + { "omega", "ω"}, + { "omegab", "Ω"}, + + // these are too small + { "eta", "η"}, + { "psi", "ψ"}, + { "psib", "Ψ"}, + { "phi", "ϕ"}, + { "phib", "Φ"}, + { "chi", "χ"}, + { "mu", "my", "myu", "μ"}, + { "nu", "ν"}, + { "xi", "ξ"}, + { "xib", "Ξ"}, + { "pi", "π"}, + { "pib", "Π"}, + }; + + for(String[] map : mapping) { + for (int i = 0; i < map.length - 1; i++) { + Pattern p = Pattern.compile("^" + map[i] + "\\d*", Pattern.CASE_INSENSITIVE); + Matcher m = p.matcher(name); + + // Regex: ^symbol[0-9]* + if(m.matches()) { + Pattern replace = Pattern.compile("^" + map[i], Pattern.CASE_INSENSITIVE); + Matcher rm = replace.matcher(name); + // Last element contains mapping + return rm.replaceFirst(map[map.length -1 ]); + } + } + } + + return name; + } + + /** + * Takes a string and looks for trailing numbers. If present those numbers will + * be replaced by a HTML subscript. Make sure to wrap inside a html block when + * displaying as part of a JLabel. + * + * @param label + * @return + */ + public static String subscriptIndices(String label) { + // Trailing numbers + Pattern p = Pattern.compile("(\\d+)$"); + Matcher m = p.matcher(label); + + return m.replaceFirst("$1"); + } } diff --git a/src/test/java/eva2/tools/StringToolsTest.java b/src/test/java/eva2/tools/StringToolsTest.java index 59929d0e..ac6095d0 100644 --- a/src/test/java/eva2/tools/StringToolsTest.java +++ b/src/test/java/eva2/tools/StringToolsTest.java @@ -1,7 +1,5 @@ package eva2.tools; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import java.util.HashMap; @@ -11,21 +9,9 @@ import static org.junit.Assert.assertEquals; /** * - * @author becker */ public class StringToolsTest { - public StringToolsTest() { - } - - @Before - public void setUp() { - } - - @After - public void tearDown() { - } - /** * Test of humaniseCamelCase method, of class StringTools. */ @@ -61,6 +47,7 @@ public class StringToolsTest { map.put("thisIsAwesome", "this-is-awesome"); map.put("THQIsNice", "thq-is-nice"); map.put("iLikeABC", "i-like-abc"); + map.put("THIS", "this"); String key, value; for (Object o : map.entrySet()) { @@ -86,4 +73,41 @@ public class StringToolsTest { assertEquals("StringTools", StringTools.cutClassName("eva2.tools.StringTools")); assertEquals("RandomClass", StringTools.cutClassName("eva2.optimization.operator.RandomClass")); } + + @Test + public void testTranslateGreek() { + // Doesn't touch string without greek characters + assertEquals("Not a greek string", StringTools.translateGreek("Not a greek string")); + + // Replaces greek characters irregardless of case + assertEquals("τ", StringTools.translateGreek("tau")); + assertEquals("τ", StringTools.translateGreek("Tau")); + assertEquals("τ", StringTools.translateGreek("tAU")); + + // Handles multiple values for one letter + assertEquals("μ", StringTools.translateGreek("mu")); + assertEquals("μ", StringTools.translateGreek("my")); + assertEquals("μ", StringTools.translateGreek("myu")); + + // Handles indices like sigma1, sigma2 + assertEquals("ϕ1", StringTools.translateGreek("phi1")); + assertEquals("ϕ10", StringTools.translateGreek("phi10")); + + // Doesn't mess up other strings + assertEquals("Stau", StringTools.translateGreek("Stau")); + assertEquals("taur", StringTools.translateGreek("taur")); + assertEquals("taur12", StringTools.translateGreek("taur12")); + } + + @Test + public void testSubscriptIndices() throws Exception { + // Doesn't alter numbers at the start or mid string + assertEquals("12derp", StringTools.subscriptIndices("12derp")); + assertEquals("der12p", StringTools.subscriptIndices("der12p")); + + // Replaces trailing numbers with a sub html tag + assertEquals("derp12", StringTools.subscriptIndices("derp12")); + assertEquals("This is a string 12", StringTools.subscriptIndices("This is a string 12")); + assertEquals("ϕ10", StringTools.subscriptIndices("ϕ10")); + } }