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"));
+ }
}