From 593e489b3a12d905e0cc5c64c9a75ee949c9936b Mon Sep 17 00:00:00 2001 From: Felix Homa Date: Mon, 28 Mar 2022 00:02:15 +0200 Subject: [PATCH] RadioMultiSelect --- .../korrekturHelper/CheckboxMultiSelect.java | 123 ++++++++++++++++++ .../pingger/korrekturHelper/EitherNode.java | 4 +- .../pingger/korrekturHelper/HtmlContext.java | 31 +++++ .../korrekturHelper/RadioMultiSelect.java | 123 ++++++++++++++++++ .../rvs/pingger/korrekturHelper/Test.schema | 6 +- 5 files changed, 280 insertions(+), 7 deletions(-) create mode 100644 src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxMultiSelect.java create mode 100644 src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/RadioMultiSelect.java diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxMultiSelect.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxMultiSelect.java new file mode 100644 index 0000000..98db512 --- /dev/null +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxMultiSelect.java @@ -0,0 +1,123 @@ +package de.tuDortmund.cs.rvs.pingger.korrekturHelper; + +import java.math.BigDecimal; +import java.math.MathContext; + +import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; +import javax.swing.JCheckBox; +import javax.swing.JLabel; + +/** + * @author Pingger + */ +public class CheckboxMultiSelect extends AbstractNode +{ + private final String baseMsg; + private final ButtonGroup bg; + private final BigDecimal maxPoints; + private final BigDecimal[] points; + + private final JCheckBox[] rbs; + private final String[] text; + + /** + * @param config the config string to parse + */ + public CheckboxMultiSelect(String config) + { + var lines = config.split("\n"); + var spl0 = lines[0].split("\t"); + if (!"\\\\".equals(spl0[0])) + { throw new IllegalArgumentException("Expected \\\\"); } + if (spl0.length != 2 && spl0.length != 3) + { throw new IllegalArgumentException("Expected 1 or 2 \\t"); } + maxPoints = new BigDecimal(spl0[1]); + if (maxPoints.signum() <= 0) + { throw new IllegalArgumentException("Positive Points required! got: " + maxPoints); } + baseMsg = spl0.length == 3 ? spl0[2] : null; + points = new BigDecimal[lines.length - 1]; + text = new String[lines.length - 1]; + rbs = new JCheckBox[lines.length - 1]; + bg = new ButtonGroup(); + content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); + if (baseMsg != null) + { + content.add(new JLabel(baseMsg)); + } + for (var i = 1; i < lines.length; i++) + { + var s = lines[i].split("\t"); + if (s.length != 2) + { throw new IllegalArgumentException("Expected exactly 1 \\t"); } + points[i - 1] = new BigDecimal(s[0]); + text[i - 1] = s[1]; + rbs[i - 1] = new JCheckBox(text[i - 1]); + content.add(rbs[i - 1]); + bg.add(rbs[i - 1]); + } + } + + @Override + protected void _reset() + { + bg.clearSelection(); + } + + @Override + public BigDecimal achievedPoints(MathContext mc) + { + return points[getSelected()]; + } + + private int getSelected() + { + for (var i = 0; i < rbs.length; i++) + { + if (rbs[i].isSelected()) + { return i; } + } + return rbs.length - 1; + } + + @Override + public boolean isVisibleInResultHtml() + { return true; } + + @Override + public BigDecimal maximumPoints() + { + return maxPoints; + } + + @Override + public String toConfigString() + { + var sb = new StringBuilder(); + sb.append("\\\\\t"); + sb.append(maxPoints.toPlainString()); + if (baseMsg != null) + { + sb.append("\t"); + sb.append(baseMsg); + } + for (var i = 0; i < text.length; i++) + { + sb.append("\n\t"); + sb.append(points[i].toPlainString()); + sb.append("\t"); + sb.append(text[i]); + } + return sb.toString(); + } + + @Override + public String toResultHtml(HtmlContext hc) + { + return "" + // + "" + // + achievedPoints(hc.mc) + "/" + maxPoints.toPlainString() + "P" + // + (baseMsg == null ? text[getSelected()] : baseMsg + " (" + text[getSelected()] + ")") + ""; + } + +} diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/EitherNode.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/EitherNode.java index 8fd87a4..442121f 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/EitherNode.java +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/EitherNode.java @@ -28,11 +28,11 @@ public class EitherNode extends AbstractNode if (config.contains("\n")) { throw new IllegalArgumentException("Bad config! Found line feed!"); } var spl = config.split("\t"); - if (spl.length != 4 && spl.length != 5) + if (spl.length < 3 || spl.length > 5) { throw new IllegalArgumentException("Expected 2, 3 or 4 \\t!"); } if (!"\\".equals(spl[0])) { throw new IllegalArgumentException("Expected \\"); } - if (!"|".equals(spl[3])) + if (spl.length > 3 && !"|".equals(spl[3])) { throw new IllegalArgumentException("Expected | after 3rd \\t"); } this.points = new BigDecimal(spl[1]); messageOK = spl[2]; diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java index 1f1b9c9..3ab5b98 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java @@ -1,5 +1,6 @@ package de.tuDortmund.cs.rvs.pingger.korrekturHelper; +import java.math.BigDecimal; import java.math.MathContext; /** @@ -29,6 +30,21 @@ public class HtmlContext */ public String partialPtsTextStyle = ""; + /** + * @param got achieved Points + * @param max maximum Points + * @return the style tag-parameter for the given signum for the Points + * @implNote Does not support negative points! + */ + public String stylePts(BigDecimal got, BigDecimal max) + { + if (got.equals(BigDecimal.ZERO)) + { return noPtsStyle.isBlank() ? "" : " style=\"" + noPtsStyle + "\""; } + if (got.compareTo(max) < 0) + { return partialPtsStyle.isBlank() ? "" : " style=\"" + partialPtsStyle + "\""; } + return fullPtsStyle.isBlank() ? "" : " style=\"" + fullPtsStyle + "\""; + } + /** * @param signum the style-signum -1 worst case, 0 partial case, 1 best case * @return the style tag-parameter for the given signum for the Points @@ -44,6 +60,21 @@ public class HtmlContext }; } + /** + * @param got achieved Points + * @param max maximum Points + * @return the style tag-parameter for the given signum for the Points + * @implNote Does not support negative points! + */ + public String styleText(BigDecimal got, BigDecimal max) + { + if (got.equals(BigDecimal.ZERO)) + { return noPtsTextStyle.isBlank() ? "" : " style=\"" + noPtsTextStyle + "\""; } + if (got.compareTo(max) < 0) + { return partialPtsTextStyle.isBlank() ? "" : " style=\"" + partialPtsTextStyle + "\""; } + return fullPtsTextStyle.isBlank() ? "" : " style=\"" + fullPtsTextStyle + "\""; + } + /** * @param signum the style-signum -1 worst case, 0 partial case, 1 best case * @return the style tag-parameter for the given signum for the Text diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/RadioMultiSelect.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/RadioMultiSelect.java new file mode 100644 index 0000000..4403ea0 --- /dev/null +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/RadioMultiSelect.java @@ -0,0 +1,123 @@ +package de.tuDortmund.cs.rvs.pingger.korrekturHelper; + +import java.math.BigDecimal; +import java.math.MathContext; + +import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; +import javax.swing.JLabel; +import javax.swing.JRadioButton; + +/** + * @author Pingger + */ +public class RadioMultiSelect extends AbstractNode +{ + private final String baseMsg; + private final ButtonGroup bg; + private final BigDecimal maxPoints; + private final BigDecimal[] points; + + private final JRadioButton[] rbs; + private final String[] text; + + /** + * @param config the config string to parse + */ + public RadioMultiSelect(String config) + { + var lines = config.split("\n"); + var spl0 = lines[0].split("\t"); + if (!"\\\\".equals(spl0[0])) + { throw new IllegalArgumentException("Expected \\\\"); } + if (spl0.length != 2 && spl0.length != 3) + { throw new IllegalArgumentException("Expected 1 or 2 \\t"); } + maxPoints = new BigDecimal(spl0[1]); + if (maxPoints.signum() <= 0) + { throw new IllegalArgumentException("Positive Points required! got: " + maxPoints); } + baseMsg = spl0.length == 3 ? spl0[2] : null; + points = new BigDecimal[lines.length - 1]; + text = new String[lines.length - 1]; + rbs = new JRadioButton[lines.length - 1]; + bg = new ButtonGroup(); + content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); + if (baseMsg != null) + { + content.add(new JLabel(baseMsg)); + } + for (var i = 1; i < lines.length; i++) + { + var s = lines[i].split("\t"); + if (s.length != 2) + { throw new IllegalArgumentException("Expected exactly 1 \\t"); } + points[i - 1] = new BigDecimal(s[0]); + text[i - 1] = s[1]; + rbs[i - 1] = new JRadioButton(text[i - 1]); + content.add(rbs[i - 1]); + bg.add(rbs[i - 1]); + } + } + + @Override + protected void _reset() + { + bg.clearSelection(); + } + + @Override + public BigDecimal achievedPoints(MathContext mc) + { + return points[getSelected()]; + } + + private int getSelected() + { + for (var i = 0; i < rbs.length; i++) + { + if (rbs[i].isSelected()) + { return i; } + } + return rbs.length - 1; + } + + @Override + public boolean isVisibleInResultHtml() + { return true; } + + @Override + public BigDecimal maximumPoints() + { + return maxPoints; + } + + @Override + public String toConfigString() + { + var sb = new StringBuilder(); + sb.append("\\\\\t"); + sb.append(maxPoints.toPlainString()); + if (baseMsg != null) + { + sb.append("\t"); + sb.append(baseMsg); + } + for (var i = 0; i < text.length; i++) + { + sb.append("\n\t"); + sb.append(points[i].toPlainString()); + sb.append("\t"); + sb.append(text[i]); + } + return sb.toString(); + } + + @Override + public String toResultHtml(HtmlContext hc) + { + return "" + // + "" + // + achievedPoints(hc.mc) + "/" + maxPoints.toPlainString() + "P" + // + (baseMsg == null ? text[getSelected()] : baseMsg + " (" + text[getSelected()] + ")") + ""; + } + +} diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema index 1641e23..93f6268 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema @@ -25,16 +25,12 @@ \\ 5.0 5.0 Volle Punkte 2.5 Halbe Punkte - 50% Halbe Punkte in Prozent - 1/3 Ein Drittel Punkte als Bruch 0 Null Punkte \\ 5.0 Text der immer angezeigt wird. Dadurch wird der Text bei den Punkten zur Begründung 5.0 Volle Punkte 2.5 Halbe Punkte - 50% Halbe Punkte in Prozent - 1/3 Ein Drittel Punkte als Bruch 0 Null Punkte - \\ 5.0 Text der immer angezeigt wird. Dadurch wird der Text bei den Punkten zur Begründung (Multi-Select anstatt Radio-Box, das kann nicht gemischt werden!) + \\ 5.0 Text der immer angezeigt wird. Dadurch wird der Text bei den Punkten zur Begründung (Multi-Select anstatt Radio-Box. das kann nicht gemischt werden!) [] 1.0 Ziel 1 [] 1.0 Ziel 2 [] 2.0 Ziel 3