mirror of
https://github.com/DanilaFe/abacus
synced 2024-12-23 16:00:09 -08:00
Run calculations via thread, and stop thread if necessary.
This commit is contained in:
parent
4f7fe053de
commit
4bd52e514c
|
@ -1,5 +1,6 @@
|
||||||
package org.nwapw.abacus.fx;
|
package org.nwapw.abacus.fx;
|
||||||
|
|
||||||
|
import javafx.application.Platform;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
|
@ -10,6 +11,7 @@ import javafx.util.Callback;
|
||||||
import javafx.util.StringConverter;
|
import javafx.util.StringConverter;
|
||||||
import org.nwapw.abacus.Abacus;
|
import org.nwapw.abacus.Abacus;
|
||||||
import org.nwapw.abacus.config.Configuration;
|
import org.nwapw.abacus.config.Configuration;
|
||||||
|
import org.nwapw.abacus.number.ComputationInterruptedException;
|
||||||
import org.nwapw.abacus.number.NumberInterface;
|
import org.nwapw.abacus.number.NumberInterface;
|
||||||
import org.nwapw.abacus.plugin.PluginListener;
|
import org.nwapw.abacus.plugin.PluginListener;
|
||||||
import org.nwapw.abacus.plugin.PluginManager;
|
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.
|
* The alert shown when a press to "apply" is needed.
|
||||||
*/
|
*/
|
||||||
private Alert reloadAlert;
|
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
|
* Alerts the user if the changes they made
|
||||||
|
@ -174,28 +209,15 @@ public class AbacusController implements PluginListener {
|
||||||
@FXML
|
@FXML
|
||||||
private void performCalculation() {
|
private void performCalculation() {
|
||||||
inputButton.setDisable(true);
|
inputButton.setDisable(true);
|
||||||
TreeNode constructedTree = abacus.parseString(inputField.getText());
|
stopButton.setDisable(false);
|
||||||
if (constructedTree == null) {
|
calculationThread = new Thread(CALCULATION_RUNNABLE);
|
||||||
outputText.setText(ERR_SYNTAX);
|
calculationThread.start();
|
||||||
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("");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private void performStop(){
|
private void performStop(){
|
||||||
System.out.println("Stopping");
|
if(calculationThread != null)
|
||||||
|
calculationThread.interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
<Button fx:id="inputButton" text="Calculate" maxWidth="Infinity"
|
<Button fx:id="inputButton" text="Calculate" maxWidth="Infinity"
|
||||||
onAction="#performCalculation"/>
|
onAction="#performCalculation"/>
|
||||||
<Button fx:id="stopButton" text="Stop" maxWidth="Infinity"
|
<Button fx:id="stopButton" text="Stop" maxWidth="Infinity"
|
||||||
onAction="#performStop"/>
|
onAction="#performStop" disable="true"/>
|
||||||
</VBox>
|
</VBox>
|
||||||
</bottom>
|
</bottom>
|
||||||
</BorderPane>
|
</BorderPane>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user