diff --git a/src/main/java/org/nwapw/abacus/fx/AbacusController.java b/src/main/java/org/nwapw/abacus/fx/AbacusController.java
index e328912..3ea5656 100644
--- a/src/main/java/org/nwapw/abacus/fx/AbacusController.java
+++ b/src/main/java/org/nwapw/abacus/fx/AbacusController.java
@@ -1,5 +1,6 @@
package org.nwapw.abacus.fx;
+import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
@@ -10,6 +11,7 @@ import javafx.util.Callback;
import javafx.util.StringConverter;
import org.nwapw.abacus.Abacus;
import org.nwapw.abacus.config.Configuration;
+import org.nwapw.abacus.number.ComputationInterruptedException;
import org.nwapw.abacus.number.NumberInterface;
import org.nwapw.abacus.plugin.PluginListener;
import org.nwapw.abacus.plugin.PluginManager;
@@ -110,6 +112,39 @@ public class AbacusController implements PluginListener {
* The alert shown when a press to "apply" is needed.
*/
private Alert reloadAlert;
+ /**
+ * The runnable used to perform the calculation.
+ */
+ private final Runnable CALCULATION_RUNNABLE = new Runnable() {
+
+ private String attemptCalculation(){
+ TreeNode constructedTree = abacus.parseString(inputField.getText());
+ if (constructedTree == null) {
+ return ERR_SYNTAX;
+ }
+ try {
+ NumberInterface evaluatedNumber = abacus.evaluateTree(constructedTree);
+ if (evaluatedNumber == null) {
+ return ERR_EVAL;
+ }
+ historyData.add(new HistoryModel(inputField.getText(), constructedTree.toString(), evaluatedNumber.toString()));
+ } catch (ComputationInterruptedException exception) {
+ return ERR_STOP;
+ }
+ return "";
+ }
+
+ @Override
+ public void run() {
+ String calculation = attemptCalculation();
+ Platform.runLater(() -> {
+ outputText.setText(calculation);
+ inputButton.setDisable(false);
+ stopButton.setDisable(true);
+ });
+ }
+ };
+ private Thread calculationThread;
/**
* Alerts the user if the changes they made
@@ -174,28 +209,15 @@ public class AbacusController implements PluginListener {
@FXML
private void performCalculation() {
inputButton.setDisable(true);
- TreeNode constructedTree = abacus.parseString(inputField.getText());
- if (constructedTree == null) {
- outputText.setText(ERR_SYNTAX);
- inputButton.setDisable(false);
- return;
- }
- NumberInterface evaluatedNumber = abacus.evaluateTree(constructedTree);
- if (evaluatedNumber == null) {
- outputText.setText(ERR_EVAL);
- inputButton.setDisable(false);
- return;
- }
- outputText.setText(evaluatedNumber.toString());
- historyData.add(new HistoryModel(inputField.getText(), constructedTree.toString(), evaluatedNumber.toString()));
-
- inputButton.setDisable(false);
- inputField.setText("");
+ stopButton.setDisable(false);
+ calculationThread = new Thread(CALCULATION_RUNNABLE);
+ calculationThread.start();
}
@FXML
private void performStop(){
- System.out.println("Stopping");
+ if(calculationThread != null)
+ calculationThread.interrupt();
}
@FXML
diff --git a/src/main/resources/abacus.fxml b/src/main/resources/abacus.fxml
index 9ee57d4..495c654 100644
--- a/src/main/resources/abacus.fxml
+++ b/src/main/resources/abacus.fxml
@@ -35,7 +35,7 @@
+ onAction="#performStop" disable="true"/>