package org.pixelgaffer.turnierserver.codr.view;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.pixelgaffer.turnierserver.codr.AiBase;
import org.pixelgaffer.turnierserver.codr.AiBase.AiMode;
import org.pixelgaffer.turnierserver.codr.AiBase.NewVersionType;
import org.pixelgaffer.turnierserver.codr.AiExtern;
import org.pixelgaffer.turnierserver.codr.AiFake;
import org.pixelgaffer.turnierserver.codr.AiOnline;
import org.pixelgaffer.turnierserver.codr.AiSaved;
import org.pixelgaffer.turnierserver.codr.AiSimple;
import org.pixelgaffer.turnierserver.codr.CodeEditor;
import org.pixelgaffer.turnierserver.codr.MainApp;
import org.pixelgaffer.turnierserver.codr.Version;
import org.pixelgaffer.turnierserver.codr.utilities.Dialog;
import org.pixelgaffer.turnierserver.codr.utilities.ErrorLog;
import org.pixelgaffer.turnierserver.codr.utilities.Exceptions.CompileException;
import org.pixelgaffer.turnierserver.codr.utilities.Paths;
import org.pixelgaffer.turnierserver.codr.utilities.Resources;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.RadioButton;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeView;
import javafx.scene.control.TreeView.EditEvent;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.util.Callback;
import net.lingala.zip4j.exception.ZipException;
public class ControllerAiManagement {
@FXML Button btDelete;
@FXML Button btAbort;
@FXML Button btEdit;
@FXML Button btNewVersion;
@FXML Button btCompile;
@FXML Button btQualify;
@FXML Button btFinish;
@FXML public Button btUpload;
@FXML Button btToActual;
@FXML Button btChangeImage;
@FXML Button btDeleteImage;
@FXML Label lbName;
@FXML Label lbLanguage;
@FXML Label lbCompiled;
@FXML Label lbFinished;
@FXML Label lbUploaded;
@FXML RadioButton rbSimple;
@FXML RadioButton rbContinue;
@FXML RadioButton rbFromFile;
@FXML TextField tbName;
@FXML TextArea tbOutput;
@FXML TextArea tbDescription;
@FXML ChoiceBox<Version> cbVersion;
@FXML ChoiceBox<String> cbLanguage;
@FXML ListView<AiSimple> lvAis;
@FXML ImageView image;
@FXML TabPane tpCode;
@FXML Hyperlink hlShowQualified;
@FXML ProgressIndicator prUpload;
@FXML ProgressIndicator prCompile;
@FXML ProgressIndicator prQualify;
@FXML TitledPane tpNewVersion;
@FXML BorderPane bpAis;
@FXML TreeView<File> tvFiles;
public Tab infoTab;
public Tab newFileTab;
public MainApp mainApp;
public AiSimple ai;
public Version version;
/**
* Initialisiert den Controller
*
* @param app eine Referenz auf die MainApp
*/
public void setMainApp(MainApp app) {
mainApp = app;
MainApp.cAi = this;
cbVersion.getSelectionModel().selectedItemProperty() .addListener((observableValue, oldValue, newValue) -> {
clickVersionChange();
});
lvAis.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
clickChangeAi();
});
tpCode.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
clickTabSelection(oldValue, newValue);
});
tvFiles.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
if (newValue != null && newValue.getValue().isFile()) {
for (Tab tab : tpCode.getTabs()) {
if (tab.getText().equals(newValue.getValue().getName())) {
tpCode.getSelectionModel().select(tab);
break;
}
}
}
});
tpCode.setStyle("-fx-open-tab-animation: NONE; -fx-close-tab-animation: NONE;");
cbLanguage.getItems().addAll(MainApp.languages);
cbLanguage.getSelectionModel().selectFirst();
infoTab = tpCode.getTabs().get(0);
newFileTab = tpCode.getTabs().get(1);
lvAis.setItems(MainApp.aiManager.ais);
lvAis.getSelectionModel().selectFirst();
}
/**
* Zeigt eine KI und eine ihrer Versionen an
*
* @param p die KI
* @param v die zugehörige Version
*/
public void showAi(AiSimple p, Version v) {
ai = p;
version = v;
showAi();
}
/**
* Setzt alle Eigenschaften der Benutzeroberfläche, wie z.B. das
* KI-Namensfeld, das KI-Bild, die KI-Beschreibung, ...
*/
public void showAi() {
// Ai-spezifisches
if (ai != null) {
lbName.setText(ai.title);
lbLanguage.setText("Sprache: " + ai.language.toString());
btDelete.setDisable(false);
tbDescription.setText(ai.description);
cbVersion.getSelectionModel().clearSelection();
cbVersion.setItems(ai.versions);
Bindings.bindBidirectional(image.imageProperty(), ai.getPicture());
newFileTab.setDisable(false);
btChangeImage.setDisable(false);
btDeleteImage.setDisable(false);
btToActual.setDisable(false);
cbVersion.setDisable(false);
tpNewVersion.setDisable(false);
tpNewVersion.setExpanded(true);
btEdit.setDisable(false);
btToActual.setDisable(false);
if (version == null) { // versuchen, die Version zu setzen, wenn
// keine ausgewählt ist
version = ai.lastVersion();
}
boolean containing = false;
for (int i = 0; i < ai.versions.size(); i++)
if (version == ai.versions.get(i))
containing = true;
if (!containing) { // oder eine nicht-zugehörige ausgewählt ist
version = ai.lastVersion();
}
} else {
newFileTab.setDisable(true);
lbName.setText("Name");
lbLanguage.setText("Sprache: ");
tbDescription.setText("Momentan ist kein Spieler ausgew�hlt");
btDelete.setDisable(true);
cbVersion.getSelectionModel().clearSelection();
ObservableList<Version> emptyFill = FXCollections
.observableArrayList();
cbVersion.setItems(emptyFill);
image.setImage(Resources.defaultPicture());
btChangeImage.setDisable(true);
btDeleteImage.setDisable(true);
btToActual.setDisable(true);
cbVersion.setDisable(true);
tpNewVersion.setDisable(true);
tpNewVersion.setExpanded(false);
btEdit.setDisable(true);
btToActual.setDisable(true);
}
// Beschreibung setzen
tbDescription.setEditable(false);
btAbort.setVisible(false);
btEdit.setText("Bearbeiten");
tbDescription.setEditable(false);
// Version-spezifisches
if (version != null && ai != null) {
newFileTab.setDisable(false);
cbVersion.setValue(version);
tbOutput.setText("");
if (!version.compileOutput.equals("")) {
tbOutput.setText(version.compileOutput);
}
if (!version.qualifyOutput.equals("")) {
tbOutput.setText(version.qualifyOutput);
}
lbCompiled.visibleProperty().bind(version.compiled);
hlShowQualified.visibleProperty().bind(version.qualified);
lbFinished.visibleProperty().bind(version.finished);
lbUploaded.setVisible(false);
btCompile.disableProperty().bind(version.finished.or(version.compiled));
btQualify.disableProperty().bind(version.compiled.not().or(version.finished).or(version.qualified));
btFinish.disableProperty().bind(version.finished.or(new SimpleBooleanProperty(version.ai.mode == AiMode.extern)));
btUpload.disableProperty().bind(new SimpleBooleanProperty(false));
rbContinue.setDisable(false);
rbContinue.setSelected(true);
rbFromFile.setSelected(false);
rbSimple.setSelected(false);
setVersionTabs();
} else {
newFileTab.setDisable(true);
cbVersion.setValue(null);
tbOutput.setText("");
lbCompiled.visibleProperty().bind(new SimpleBooleanProperty(false));
hlShowQualified.visibleProperty().bind(new SimpleBooleanProperty(false));
lbFinished.visibleProperty().bind(new SimpleBooleanProperty(false));
lbUploaded.setVisible(false);
btCompile.disableProperty().bind(new SimpleBooleanProperty(true));
btQualify.disableProperty().bind(new SimpleBooleanProperty(true));
btFinish.disableProperty().bind(new SimpleBooleanProperty(true));
btUpload.disableProperty().bind(new SimpleBooleanProperty(true));
rbContinue.setDisable(true);
rbContinue.setSelected(false);
rbFromFile.setSelected(false);
rbSimple.setSelected(true);
}
// SimplePlayer
if (ai != null) {
if (ai.mode == AiMode.simplePlayer) {
newFileTab.setDisable(true);
btDelete.setDisable(true);
btEdit.setDisable(true);
btToActual.setDisable(true);
cbVersion.setDisable(true);
tpNewVersion.setDisable(true);
tpNewVersion.setExpanded(false);
lbCompiled.visibleProperty().bind(new SimpleBooleanProperty(false));
hlShowQualified.visibleProperty().bind(new SimpleBooleanProperty(false));
lbFinished.visibleProperty().bind(new SimpleBooleanProperty(false));
lbUploaded.setVisible(false);
btCompile.disableProperty().bind(new SimpleBooleanProperty(true));
btQualify.disableProperty().bind(new SimpleBooleanProperty(true));
btFinish.disableProperty().bind(new SimpleBooleanProperty(true));
btUpload.disableProperty().bind(new SimpleBooleanProperty(true));
btChangeImage.setDisable(true);
btDeleteImage.setDisable(true);
} else if (ai.mode == AiMode.extern) {
btToActual.setDisable(true);
cbVersion.setDisable(true);
tpNewVersion.setDisable(true);
tpNewVersion.setExpanded(false);
}
}
}
// public void updateAiLabels(){
//
// // Ai-spezifisches
// if (ai != null) {
// lbName.setText(ai.title);
// lbLanguage.setText("Sprache: " + ai.language.toString());
// tbDescription.setText(ai.description);
// }
//
//
// // Version-spezifisches
// if (version != null && ai != null) {
// lbCompiled.setVisible(version.compiled);
// hlShowQualified.setVisible(version.qualified);
// lbFinished.setVisible(version.finished);
// lbUploaded.setVisible(version.uploaded);
// btCompile.setDisable(version.compiled || version.finished);
// btQualify.setDisable(version.qualified || !version.compiled ||
// version.finished);
// btFinish.setDisable(version.finished);
// }
//
// if (ai != null) {
// if (ai.mode == AiMode.simplePlayer) {
// newFileTab.setDisable(true);
// btDelete.setDisable(true);
// btEdit.setDisable(true);
// btToActual.setDisable(true);
// cbVersion.setDisable(true);
// tpNewVersion.setDisable(true);
// tpNewVersion.setExpanded(false);
// btCompile.setDisable(true);
// btQualify.setDisable(true);
// btFinish.setDisable(true);
// btUpload.setDisable(true);
// lbCompiled.setVisible(false);
// hlShowQualified.setVisible(false);
// lbFinished.setVisible(false);
// lbUploaded.setVisible(false);
//
// btChangeImage.setDisable(true);
// btDeleteImage.setDisable(true);
//
// } else if (ai.mode == AiMode.extern) {
// btToActual.setDisable(true);
// cbVersion.setDisable(true);
// tpNewVersion.setDisable(true);
// tpNewVersion.setExpanded(false);
// }
// }
// }
/**
* Lädt mithilfe der CodeEditoren der anzuzeigenden Version alle Dateien der
* Version in die Tab-Leiste
*/
private void setVersionTabs() {
if (version == null) {
tpCode.getTabs().clear();
tpCode.getTabs().add(infoTab);
tpCode.getTabs().add(newFileTab);
return;
}
version.findCode();
tvFiles.setRoot(version.rootFile);
if (version.finished.get() || (version.ai.mode != AiMode.saved && version.ai.mode != AiMode.extern))
tvFiles.setEditable(false);
else
tvFiles.setEditable(true);
tvFiles.setCellFactory(new Callback<TreeView<File>, TreeCell<File>>() {
@Override
public TreeCell<File> call(TreeView<File> p) {
return new TreeFileCell();
}
});
tvFiles.setOnEditCommit(new EventHandler<EditEvent<File>>() {
@Override
public void handle(EditEvent<File> event) {
setVersionTabs();
}
});
String oldTabName = tpCode.getSelectionModel().getSelectedItem().getText();
tpCode.getTabs().clear();
tpCode.getTabs().add(infoTab);
for (CodeEditor file : version.files) {
Tab tab = file.getView();
if (version.finished.get()) {
if (tab.getContent() != null)
tab.getContent().setDisable(true);
else
tab.setDisable(true);
}
tpCode.getTabs().add(tab);
if (tab.getText().equals(oldTabName)) {
tpCode.getSelectionModel().select(tab);
}
}
if (!version.finished.get())
tpCode.getTabs().add(newFileTab);
}
/**
* Speichert und überprüft, ob auf das "neue Datei"-Tab geklickt wurde
*
* @param oldTab der zuvor ausgewählte Tab
* @param newTab der neu ausgewählte Tab
*/
void clickTabSelection(Tab oldTab, Tab newTab) {
// TreeView
if (newTab == infoTab) {
tvFiles.setVisible(false);
bpAis.setVisible(true);
} else {
tvFiles.setVisible(true);
bpAis.setVisible(false);
}
// Speichern
if (version != null && !version.finished.get()) {
version.saveCode();
}
// NewFile +
if (newTab == newFileTab && newTab != oldTab) {
tpCode.getSelectionModel().select(oldTab);
if (version == null) {
Dialog.error("Bitte legen Sie zuerst eine Version an.", "Keine Version");
return;
}
File result = Dialog.fileSaver(MainApp.stage, "Bitte einen Ort und Dateinamen auswählen", Paths.version(version));
if (result != null) {
CodeEditor editor = new CodeEditor(result);
editor.forceSave();
version.files.add(editor);
tpCode.getTabs().add(tpCode.getTabs().size() - 1, editor.getView());
tpCode.getSelectionModel().select(tpCode.getTabs().size() - 2);
setVersionTabs();
}
}
}
/**
* Button: KI löschen
*/
@FXML
void clickDelete() {
boolean result = Dialog.okAbort("KI wirklich löschen?", "Löschen");
if (result) {
try {
FileUtils.deleteDirectory(new File(Paths.ai(ai)));
MainApp.aiManager.loadAis();
lvAis.getSelectionModel().selectFirst();
} catch (IOException e) {
ErrorLog.write("Die KI " + ai.title + " konnte nicht gelöscht werden.");
}
}
}
/**
* Button: Neue KI anlegen
*/
@FXML
void clickNewAi() {
String title = tbName.getText().replace(" ", "");
if (title.equals("")) {
Dialog.error("Bitte einen Namen für die KI eingeben", "Kein Name");
return;
}
for (int i = 0; i < lvAis.getItems().size(); i++) { // Testen, ob die KI
// schon existiert
if (title.equals(lvAis.getItems().get(i).title)) {
Dialog.error("Es können keine zwei KIs mit dem gleichen Namen erstellt werden", "Doppelter Name");
return;
}
}
MainApp.aiManager.ais.add(new AiSaved(title, cbLanguage.getValue()));
lvAis.getSelectionModel().selectLast();
setVersionTabs();
}
/**
* Button: Neue KI anlegen
*/
@FXML
void clickNewExtern() {
String title = tbName.getText().replace(" ", "");
if (title.equals("")) {
Dialog.error("Bitte einen Namen für die KI eingeben", "Kein Name");
return;
}
for (int i = 0; i < lvAis.getItems().size(); i++) { // Testen, ob die KI
// schon existiert
if (title.equals(lvAis.getItems().get(i).title)) {
Dialog.error("Es können keine zwei KIs mit dem gleichen Namen erstellt werden", "Doppelter Name");
return;
}
}
File path = Dialog.folderChooser(MainApp.stage, "Bitte den Pfad auswählen");
if (path == null)
return;
AiExtern newAi = new AiExtern(title, cbLanguage.getValue(), path.getPath());
MainApp.aiManager.ais.add(newAi);
lvAis.getSelectionModel().selectLast();
boolean result = false;
if (!new File(Paths.versionSrc(newAi.lastVersion())).exists()) {
ErrorLog.write("Der ausgewählte Ordner existert nicht.");
} else if (new File(Paths.versionSrc(newAi.lastVersion())).list().length == 0) {
result = Dialog.okAbort("Die Version wurde angelegt.\nDer Ordner ist leer.\n\nSoll der SimplePlayer hinein kopiert werden?");
}
if (result) {
ErrorLog.write(Paths.simplePlayer(MainApp.actualGameType.get(), newAi.language));
newAi.lastVersion().copyFromFile(Paths.simplePlayer(MainApp.actualGameType.get(), newAi.language) + "/src");
new File(newAi.path + "/versionProperties.txt").delete();
}
setVersionTabs();
}
/**
* Listenselektions-Änderung: zeigt andere KI an
*/
@FXML
void clickChangeAi() {
ai = lvAis.getSelectionModel().getSelectedItem();
if (ai != null) {
version = ai.lastVersion();
showAi();
}
}
/**
* Button: Abbruch der Bearbeitung der Beschreibung der KI
*/
@FXML
void clickAbort() {
btAbort.setVisible(false);
btEdit.setText("Bearbeiten");
tbDescription.setEditable(false);
tbDescription.setText(ai.description);
}
/**
* Button: Bearbeitung der Beschreibung der KI
*/
@FXML
void clickEdit() {
if (!btAbort.isVisible()) {
btAbort.setVisible(true);
btEdit.setText("Speichern");
tbDescription.setEditable(true);
} else {
btAbort.setVisible(false);
btEdit.setText("Bearbeiten");
tbDescription.setEditable(false);
if (ai.getClass() == AiSaved.class) {
((AiSaved) ai).setDescription(tbDescription.getText());
}
}
}
/**
* Button: aktuelle Version der KI wird ausgewählt
*/
@FXML
void clickToActual() {
version = ai.lastVersion();
showAi();
}
/**
* Listenselektions-Änderung: zeigt andere Version an
*/
@FXML
void clickVersionChange() {
if (version != cbVersion.getValue() && cbVersion.getValue() != null) {
version = cbVersion.getValue();
showAi();
}
}
/**
* Radiobutton: "SimplePlayer" wurde ausgewählt
*/
@FXML
void clickRbSimple() {
rbSimple.setSelected(true);
rbContinue.setSelected(false);
rbFromFile.setSelected(false);
}
/**
* Radiobutton: "Weiterschreiben" wurde ausgewählt
*/
@FXML
void clickRbContinue() {
rbSimple.setSelected(false);
rbContinue.setSelected(true);
rbFromFile.setSelected(false);
}
/**
* Radiobutton: "Aus Datei" wurde ausgewählt
*/
@FXML
void clickRbFromFile() {
rbSimple.setSelected(false);
rbContinue.setSelected(false);
rbFromFile.setSelected(true);
}
/**
* Button: neue Version erstellen
*/
@FXML
void clickNewVersion() {
if (ai.getClass() == AiSaved.class) {
if (ai.versions.size() > 0 && !ai.lastVersion().finished.get())
if (!Dialog.okAbort("Wenn eine neue Version angelegt wird, wird die alte fertiggestellt.\nDas bedeutet, dass sie nicht mehr verändert werden kann.\n\nFortfahren?", "Neue Version"))
return;
if (ai.versions.size() > 0)
ai.lastVersion().finished.set(true);
if (rbFromFile.isSelected()) {
File result = Dialog.folderChooser(MainApp.stage, "Bitte einen Ordner auswählen");
if (result != null)
showAi(ai, ((AiSaved) ai).newVersion(NewVersionType.fromFile, result.getPath()));
} else if (rbContinue.isSelected()) {
showAi(ai, ((AiSaved) ai).newVersion(NewVersionType.lastVersion));
} else {
showAi(ai, ((AiSaved) ai).newVersion(NewVersionType.simplePlayer));
}
}
}
/**
* Button: Kompilieren
*/
@FXML
void clickCompile() {
Task<Boolean> compile = new Task<Boolean>() {
public Boolean call() {
try {
version.compile();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
};
compile.valueProperty().addListener((observableValue, oldValue, newValue) -> {
prCompile.setVisible(false);
showAi();
});
prCompile.setVisible(true);
Thread thread = new Thread(compile, "compile");
thread.setDaemon(true);
thread.start();
}
/**
* Button: Qualifizieren
*/
@FXML
void clickQualify() {
Task<Boolean> qualify = new Task<Boolean>() {
public Boolean call() {
try {
version.qualify();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
};
qualify.valueProperty().addListener((observableValue, oldValue, newValue) -> {
prQualify.setVisible(false);
showAi();
});
prQualify.setVisible(true);
Thread thread = new Thread(qualify, "qualify");
thread.setDaemon(true);
thread.start();
}
/**
* Button: Fertigstellen
*/
@FXML
void clickFinish() {
if (Dialog.okAbort("Wenn eine Version fertiggestellt wird, kann sie nicht mehr bearbeitet werden.\n\nFortfahren?", "Version einfrieren")) {
version.finish();
}
showAi();
}
private String localNameOfNewAi = "";
/**
* Button: Hochladen
*/
@FXML
void clickUpload() {
prUpload.setVisible(true);
Task<Boolean> getOwn = new Task<Boolean>() {
public Boolean call() {
if (MainApp.ownOnlineAis == null) {
System.out.println("vielleicht unmöglich");
MainApp.ownOnlineAis = MainApp.webConnector.getOwnAis(MainApp.actualGameType.get());
} else if (MainApp.ownOnlineAis.size() == 0){
MainApp.ownOnlineAis.addAll(MainApp.webConnector.getOwnAis(MainApp.actualGameType.get()));
}
return true;
}
};
getOwn.valueProperty().addListener((observableValue, oldValue, newValue) -> {
if (MainApp.ownOnlineAis == null) {
prUpload.setVisible(false);
lbUploaded.setText("Fehler");
Dialog.error("Bitte erst Anmelden");
return;
}
AiBase result = Dialog.selectOwnVersion();
if (result == null) {
prUpload.setVisible(false);
lbUploaded.setText("Fehler");
return;
}
if (result.getClass() == AiFake.class) {
localNameOfNewAi = Dialog.textInput("Bitte einen Namen eingeben", "Neue KI erstellen");
if (localNameOfNewAi == null){
prUpload.setVisible(false);
lbUploaded.setText("Fehler");
return;
}
}
Task<String> upload = new Task<String>() {
public String call() {
int id = -1;
if (result instanceof AiOnline) {
id = ((AiOnline) result).id;
} else {
updateValue("aiCreating");
id = MainApp.webConnector.createAi(ai, localNameOfNewAi);
}
if (id == -1) {
return "errorConnection";
}
try {
updateValue("uploading");
MainApp.webConnector.uploadVersion(version, id);
} catch (ZipException | IOException e) {
e.printStackTrace();
return "errorConnection";
} catch (IllegalStateException e) {
return "Fehler beim Hochladen: " + e.getMessage();
} catch (Exception e){
e.printStackTrace();
}
try {
updateValue("compiling");
MainApp.webConnector.compile(id);
} catch (IOException e) {
e.printStackTrace();
return "errorConnection";
} catch (CompileException e) {
return "Fehler beim Kompilieren auf dem Server:\n\n" + e.compileOutput;
}
try {
updateValue("qualifying");
if (MainApp.webConnector.qualify(id))
return "finished--" + id;
else
return "Fehler beim Qualifizieren auf dem Server.";
} catch (IOException e) {
e.printStackTrace();
return "errorConnection";
}
}
};
upload.valueProperty().addListener((observableValue1, oldValue1, newValue1) -> {
if (newValue1.equals("aiCreating")){
lbUploaded.setText("erstelle KI...");
} else if (newValue1.equals("uploading")){
lbUploaded.setText("lade Version hoch...");
} else if (newValue1.equals("compiling")){
lbUploaded.setText("kompiliere Version...");
} else if (newValue1.equals("qualifying")){
lbUploaded.setText("qualifiziere Version...");
} else if (newValue1.equals("errorConnection")){
prUpload.setVisible(false);
lbUploaded.setText("Fehler");
Dialog.error("Fehler bei der Verbindung mit dem Server.", "Verbindungsfehler");
} else if (newValue1.substring(0, 10).equals("finished--")){
int id = Integer.parseInt(newValue1.substring(10));
if (Dialog.okAbort("Die KI wurde erfolgreich hochgeladen, kompiliert und qualifiziert.\n"
+ "Soll sie fertiggestellt und aktiviert werden?", "Upload fertig")){
Task<String> finishActivate = new Task<String>() {
public String call() {
try {
updateValue("finishing");
MainApp.webConnector.freeze(id);
} catch (IOException e) {
e.printStackTrace();
return "errorConnection";
}
try {
updateValue("activating");
MainApp.webConnector.setActive(id, -1);
} catch (IOException e) {
e.printStackTrace();
return "errorConnection";
}
return "finish";
}
};
finishActivate.valueProperty().addListener((observableValue2, oldValue2, newValue2) -> {
if (newValue2.equals("finishing")){
lbUploaded.setText("stelle Version fertig...");
} else if (newValue2.equals("activating")){
lbUploaded.setText("aktiviere Version...");
} else if (newValue2.equals("errorConnection")){
prUpload.setVisible(false);
lbUploaded.setText("Fehler");
Dialog.error("Fehler bei der Verbindung mit dem Server.", "Verbindungsfehler");
} else if (newValue2.equals("finish")){
prUpload.setVisible(false);
lbUploaded.setText("Version wurde hochgeladen");
Dialog.error("Die Version wurde erfolgreich fertiggestellt und aktiviert", "Fertig");
} else {
prUpload.setVisible(false);
lbUploaded.setText("Fehler");
Dialog.error(newValue1, "Fehler");
}
});
Thread thread = new Thread(finishActivate, "finishActivate");
thread.setDaemon(true);
thread.start();
} else {
prUpload.setVisible(false);
lbUploaded.setText("Version wurde hochgeladen");
}
} else {
prUpload.setVisible(false);
lbUploaded.setText("Fehler");
Dialog.error(newValue1, "Fehler");
}
});
Thread thread = new Thread(upload, "upload");
thread.setDaemon(true);
thread.start();
});
lbUploaded.setVisible(true);
lbUploaded.setText("Lade KIs...");
Thread thread = new Thread(getOwn, "getOwn");
thread.setDaemon(true);
thread.start();
}
/**
* Hyperlink: zeigt das Qualifizier-Spiel an
*/
@FXML
void clickShowQualified() {
ErrorLog.write("Diese Funktion ist noch nicht verfügbar");
}
/**
* Button: Bild ändern
*/
@FXML
void clickChangeImage() {
File result = Dialog.fileChooser(MainApp.stage, "Bild auswählen");
Image img = Resources.imageFromFile(result);
if (img != null) {
ai.setPicture(result);
}
showAi();
}
/**
* Button: Bild löschen
*/
@FXML
void clickDeleteImage() {
ai.setPicture(new File(""));
showAi();
}
}