diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java
index da8295c..795824b 100644
--- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java
+++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java
@@ -1,9 +1,11 @@
package de.tuDortmund.cs.rvs.pingger.korrekturHelper;
import java.awt.BorderLayout;
+import java.awt.Color;
import java.awt.Component;
import java.util.LinkedHashSet;
+import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
@@ -28,11 +30,12 @@ public abstract class AbstractNode implements Node
{
main = new JPanel(true);
main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
+ main.setBorder(BorderFactory.createLineBorder(Color.GRAY));
content = new JPanel(new BorderLayout(), true);
sub = new JPanel(true);
sub.setLayout(new BoxLayout(sub, BoxLayout.Y_AXIS));
- sub.setBorder(new EmptyBorder(0, 8, 8, 0));
+ sub.setBorder(new EmptyBorder(0, 16, 4, 0));
main.add(content);
main.add(sub);
diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java
index b384333..2e88909 100644
--- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java
+++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java
@@ -10,11 +10,6 @@ import javax.swing.JCheckBox;
*/
public class CheckboxNode extends AbstractNode
{
- private static String ptsToString(BigDecimal p)
- {
- return (p.signum() > 0 ? "+" : "") + p.toPlainString();
- }
-
private final JCheckBox cbx;
private final String message;
@@ -35,7 +30,7 @@ public class CheckboxNode extends AbstractNode
{ throw new IllegalArgumentException("Not a [] Node"); }
points = new BigDecimal(spl[1]);
message = spl[2];
- cbx = new JCheckBox(ptsToString(points) + "P " + message);
+ cbx = new JCheckBox(Utils.ptsToString(points) + "P " + message);
content.add(cbx);
}
@@ -64,14 +59,14 @@ public class CheckboxNode extends AbstractNode
@Override
public String toConfigString()
{
- return "[]\t" + ptsToString(points) + "\t" + message;
+ return "[]\t" + Utils.ptsToString(points) + "\t" + message;
}
@Override
public String toResultHtml(HtmlContext hc)
{
return "
"
- + ptsToString(achievedPoints(hc.mc)) + "P" + message + "";
+ + Utils.ptsToString(achievedPoints(hc.mc)) + "P" + message + "";
}
}
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
new file mode 100644
index 0000000..8fd87a4
--- /dev/null
+++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/EitherNode.java
@@ -0,0 +1,130 @@
+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.JRadioButton;
+
+/**
+ * @author Pingger
+ */
+public class EitherNode extends AbstractNode
+{
+ private final ButtonGroup bg;
+
+ private final JRadioButton btn_ok, btn_fail;
+ private final String messageFail;
+
+ private final String messageOK;
+ private final BigDecimal points;
+
+ /**
+ * @param config the config String
+ */
+ public EitherNode(String config)
+ {
+ if (config.contains("\n"))
+ { throw new IllegalArgumentException("Bad config! Found line feed!"); }
+ var spl = config.split("\t");
+ if (spl.length != 4 && spl.length != 5)
+ { throw new IllegalArgumentException("Expected 2, 3 or 4 \\t!"); }
+ if (!"\\".equals(spl[0]))
+ { throw new IllegalArgumentException("Expected \\"); }
+ if (!"|".equals(spl[3]))
+ { throw new IllegalArgumentException("Expected | after 3rd \\t"); }
+ this.points = new BigDecimal(spl[1]);
+ messageOK = spl[2];
+ messageFail = spl.length == 3 ? null : spl.length == 4 ? spl[3].substring(1).trim() : spl[4];
+ if (points.signum() > 0)
+ {
+ btn_ok = new JRadioButton(Utils.ptsToString(points) + "P " + messageOK);
+ btn_fail = new JRadioButton(
+ Utils.ptsToString(BigDecimal.ZERO) + "P " + (messageFail == null ? messageOK : messageFail));
+ }
+ else
+ {
+ btn_ok = new JRadioButton(Utils.ptsToString(BigDecimal.ZERO) + "P " + messageOK);
+ btn_fail = new JRadioButton(Utils.ptsToString(points) + "P " + (messageFail == null ? messageOK : messageFail));
+ }
+
+ bg = new ButtonGroup();
+ bg.add(btn_ok);
+ bg.add(btn_fail);
+
+ content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
+ content.add(btn_ok);
+ content.add(btn_fail);
+ }
+
+ @Override
+ protected void _reset()
+ {
+ bg.clearSelection();
+ }
+
+ @Override
+ public BigDecimal achievedPoints(MathContext mc)
+ {
+ if (btn_ok.isSelected())
+ {
+ return switch (points.signum())
+ {
+ case -1 -> BigDecimal.ZERO;
+ case 1 -> points;
+ case 0 -> BigDecimal.ZERO;
+ default -> throw new IllegalArgumentException("Unexpected value: " + points.signum());
+ };
+ }
+ if (btn_fail.isSelected())
+ {
+ return switch (points.signum())
+ {
+ case 1 -> BigDecimal.ZERO;
+ case -1 -> points;
+ case 0 -> BigDecimal.ZERO;
+ default -> throw new IllegalArgumentException("Unexpected value: " + points.signum());
+ };
+ }
+ return BigDecimal.ZERO;
+ }
+
+ @Override
+ public boolean isVisibleInResultHtml()
+ { return true; }
+
+ @Override
+ public BigDecimal maximumPoints()
+ {
+ return points.signum() < 0 ? BigDecimal.ZERO : points;
+ }
+
+ @Override
+ public String toConfigString()
+ {
+ return "\\\t" + points.toPlainString() + "\t" + messageOK + (messageFail == null ? "" : ("\t|\t" + messageFail));
+ }
+
+ @Override
+ public String toResultHtml(HtmlContext hc)
+ {
+ var signum = 0;
+ if (points.signum() < 0)
+ {
+ signum = achievedPoints(hc.mc).equals(BigDecimal.ZERO) ? 1 : -1;
+ }
+ else
+ {
+ signum = achievedPoints(hc.mc).equals(BigDecimal.ZERO) ? -1 : 1;
+ }
+ return "" + //
+ "" + //
+ Utils.ptsToString(achievedPoints(hc.mc)) + //
+ (points.signum() < 0 ? "" : " / " + maximumPoints()) + "P" + //
+ "" + //
+ (btn_fail.isSelected() ? btn_fail.getText() : btn_ok.getText()) + //
+ "";
+ }
+
+}
diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java
index a28f419..b874a4b 100644
--- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java
+++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java
@@ -17,6 +17,7 @@ public class KorrekturHelper
var in = KorrekturHelper.class.getClassLoader()
.getResourceAsStream("de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema");
in.transferTo(System.out);
+ in.close();
}
}
diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Utils.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Utils.java
new file mode 100644
index 0000000..70f9c5a
--- /dev/null
+++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Utils.java
@@ -0,0 +1,20 @@
+package de.tuDortmund.cs.rvs.pingger.korrekturHelper;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Pingger
+ */
+public class Utils
+{
+
+ /**
+ * @param p the {@link BigDecimal} to format
+ * @return a String for the given {@link BigDecimal}
+ */
+ public static String ptsToString(BigDecimal p)
+ {
+ return (p.signum() > 0 ? "+" : "") + p.toPlainString();
+ }
+
+}