package org.pixelgaffer.turnierserver.codr.view;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.ListChangeListener;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Callback;
import org.pixelgaffer.turnierserver.codr.AiOnline;
import org.pixelgaffer.turnierserver.codr.MainApp;
import org.pixelgaffer.turnierserver.codr.OnlineGameInfo;
import org.pixelgaffer.turnierserver.codr.Version;
import org.pixelgaffer.turnierserver.codr.utilities.Resources;
public class ControllerRanking {
@FXML Label lbName;
@FXML Label lbUser;
@FXML Label lbElo;
@FXML Label lbLanguage;
@FXML public Button btChallenge;
@FXML Button btEdit;
@FXML Button btAbort;
@FXML HBox hbEdit;
@FXML VBox vbContent;
@FXML TextArea tbDescription;
@FXML TableView<AiOnline> tvAis;
@FXML TableView<Version> tvVersions;
@FXML TableView<OnlineGameInfo> tvGames;
@FXML ImageView imageView;
@FXML AnchorPane groundPane;
@FXML public Button btActualize;
@FXML public ProgressIndicator prActualize;
MainApp mainApp;
public AiOnline ai = null;
/**
* Initialisiert den Controller
*
* @param app eine Referenz auf die MainApp
*/
public void setMainApp(MainApp app) {
mainApp = app;
MainApp.cRanking = this;
showAi(null);
tvAis.setItems(MainApp.onlineAis);
MainApp.onlineAis.addListener(new ListChangeListener<AiOnline>() {
@Override public void onChanged(ListChangeListener.Change<? extends AiOnline> change) {
if (tvAis != null && tvAis.getItems().size() > 0){
tvAis.getSelectionModel().select(0);
}
}
});
tvAis.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
clickChangeAi(newValue);
});
TableColumn<AiOnline, Image> col0 = new TableColumn<AiOnline, Image>("Bild");
TableColumn<AiOnline, String> col1 = new TableColumn<AiOnline, String>("Name");
TableColumn<AiOnline, String> col2 = new TableColumn<AiOnline, String>("Besitzer");
TableColumn<AiOnline, String> col3 = new TableColumn<AiOnline, String>("ELO");
col0.setMaxWidth(60);
col0.setMinWidth(60);
col3.setMaxWidth(60);
col3.setMinWidth(60);
col0.setCellValueFactory(new Callback<CellDataFeatures<AiOnline, Image>, ObservableValue<Image>>() {
@Override
public ObservableValue<Image> call(CellDataFeatures<AiOnline, Image> arg0) {
return arg0.getValue().getPicture();
}
});
col0.setCellFactory(new Callback<TableColumn<AiOnline, Image>, TableCell<AiOnline, Image>>() {
@Override
public TableCell<AiOnline, Image> call(TableColumn<AiOnline, Image> param) {
final ImageView imageview = new ImageView();
imageview.setFitHeight(50);
imageview.setFitWidth(50);
TableCell<AiOnline, Image> cell = new TableCell<AiOnline, Image>() {
public void updateItem(Image item, boolean empty) {
if (item != null)
imageview.imageProperty().set(item);
}
};
cell.setGraphic(imageview);
return cell;
}
});
col1.setCellValueFactory(new Callback<CellDataFeatures<AiOnline, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<AiOnline, String> p) {
return new SimpleStringProperty(p.getValue().title);
}
});
col2.setCellValueFactory(new Callback<CellDataFeatures<AiOnline, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<AiOnline, String> p) {
return new SimpleStringProperty(p.getValue().userName);
}
});
col3.setCellValueFactory(new Callback<CellDataFeatures<AiOnline, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<AiOnline, String> p) {
return new SimpleStringProperty(String.valueOf(p.getValue().elo));
}
});
col0.setStyle("-fx-alignment: CENTER-LEFT;");
col1.setStyle("-fx-alignment: CENTER-LEFT;");
col2.setStyle("-fx-alignment: CENTER-LEFT;");
col3.setStyle("-fx-alignment: CENTER-LEFT;");
tvAis.getColumns().add(col0);
tvAis.getColumns().add(col1);
tvAis.getColumns().add(col2);
tvAis.getColumns().add(col3);
TableColumn<Version, String> colV0 = new TableColumn<>("Version");
TableColumn<Version, String> colV1 = new TableColumn<>("Kompiliert");
TableColumn<Version, String> colV2 = new TableColumn<>("Qualifiziert");
TableColumn<Version, String> colV3 = new TableColumn<>("Freigegeben");
colV0.setCellValueFactory(new Callback<CellDataFeatures<Version, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Version, String> p) {
return new SimpleStringProperty(p.getValue().number + "");
}
});
colV1.setCellValueFactory(new Callback<CellDataFeatures<Version, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Version, String> p) {
if (p.getValue().compiled.get())
return new SimpleStringProperty("Ja");
else
return new SimpleStringProperty("Nein");
}
});
colV2.setCellValueFactory(new Callback<CellDataFeatures<Version, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Version, String> p) {
if (p.getValue().qualified.get())
return new SimpleStringProperty("Ja");
else
return new SimpleStringProperty("Nein");
}
});
colV3.setCellValueFactory(new Callback<CellDataFeatures<Version, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Version, String> p) {
if (p.getValue().finished.get())
return new SimpleStringProperty("Ja");
else
return new SimpleStringProperty("Nein");
}
});
colV0.setStyle("-fx-alignment: CENTER;");
colV1.setStyle("-fx-alignment: CENTER;");
colV2.setStyle("-fx-alignment: CENTER;");
colV3.setStyle("-fx-alignment: CENTER;");
tvVersions.getColumns().add(colV0);
tvVersions.getColumns().add(colV1);
tvVersions.getColumns().add(colV2);
tvVersions.getColumns().add(colV3);
tvVersions.setFixedCellSize(25);
TableColumn<OnlineGameInfo, String> colG0 = new TableColumn<>("Gegner");
TableColumn<OnlineGameInfo, String> colG1 = new TableColumn<>("Spiel ID");
TableColumn<OnlineGameInfo, String> colG2 = new TableColumn<>("Datum");
TableColumn<OnlineGameInfo, String> colG3 = new TableColumn<>("Gewonnen?");
colG0.setCellValueFactory(new Callback<CellDataFeatures<OnlineGameInfo, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<OnlineGameInfo, String> p) {
return new SimpleStringProperty(p.getValue().enemy);
}
});
colG1.setCellValueFactory(new Callback<CellDataFeatures<OnlineGameInfo, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<OnlineGameInfo, String> p) {
return new SimpleStringProperty("Spiel " + p.getValue().id);
}
});
colG2.setCellValueFactory(new Callback<CellDataFeatures<OnlineGameInfo, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<OnlineGameInfo, String> p) {
return new SimpleStringProperty(p.getValue().date);
}
});
colG3.setCellValueFactory(new Callback<CellDataFeatures<OnlineGameInfo, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<OnlineGameInfo, String> p) {
if (p.getValue().won)
return new SimpleStringProperty("Ja");
else
return new SimpleStringProperty("Nein");
}
});
colG0.setStyle("-fx-alignment: CENTER;");
colG1.setStyle("-fx-alignment: CENTER;");
colG2.setStyle("-fx-alignment: CENTER;");
colG3.setStyle("-fx-alignment: CENTER;");
tvGames.getColumns().add(colG0);
tvGames.getColumns().add(colG1);
tvGames.getColumns().add(colG2);
tvGames.getColumns().add(colG3);
tvGames.setFixedCellSize(25);
}
public void showAi(AiOnline aai) {
ai = aai;
showAi();
}
public void showAi() {
if (ai != null) {
groundPane.setVisible(true);
lbName.setText(ai.title);
tbDescription.setText(ai.description);
lbUser.setText(ai.userName);
lbElo.setText(String.valueOf(ai.elo));
lbLanguage.setText(ai.language.toString());
btChallenge.setDisable(false);
imageView.imageProperty().unbind();
imageView.imageProperty().bind(ai.getPicture());
tvVersions.setItems(ai.versions);
if (ai.versions.size() != 0) {
tvVersions.prefHeightProperty().bind(tvVersions.fixedCellSizeProperty().multiply(Bindings.size(tvVersions.getItems()).add(1.3)));
tvVersions.minHeightProperty().bind(tvVersions.prefHeightProperty());
tvVersions.maxHeightProperty().bind(tvVersions.prefHeightProperty());
} else {
tvVersions.prefHeightProperty().unbind();
tvVersions.minHeightProperty().unbind();
tvVersions.maxHeightProperty().unbind();
tvVersions.prefHeightProperty().set(60);
tvVersions.minHeightProperty().set(60);
tvVersions.maxHeightProperty().set(60);
}
tvGames.setItems(ai.onlineGamesInfos);
if (ai.onlineGamesInfos.size() != 0) {
tvGames.prefHeightProperty().bind(tvGames.fixedCellSizeProperty().multiply(Bindings.size(tvGames.getItems()).add(1.3)));
tvGames.minHeightProperty().bind(tvGames.prefHeightProperty());
tvGames.maxHeightProperty().bind(tvGames.prefHeightProperty());
} else {
tvGames.prefHeightProperty().unbind();
tvGames.minHeightProperty().unbind();
tvGames.maxHeightProperty().unbind();
tvGames.prefHeightProperty().set(60);
tvGames.minHeightProperty().set(60);
tvGames.maxHeightProperty().set(60);
}
if (ai.userName.equals(MainApp.webConnector.userName)) {
vbContent.getChildren().remove(hbEdit);
vbContent.getChildren().add(1, hbEdit);
btChallenge.setText("Löschen");
btAbort.setVisible(false);
btEdit.setText("Bearbeiten");
tbDescription.setEditable(false);
} else {
vbContent.getChildren().remove(hbEdit);
btChallenge.setText("Herausfordern");
}
} else {
groundPane.setVisible(false);
lbName.setText("Null");
tbDescription.setText("Aktuell wird keine KI angezeigt");
lbUser.setText("Keiner");
lbElo.setText("1000");
lbLanguage.setText("Java");
btChallenge.setDisable(true);
imageView.imageProperty().unbind();
imageView.imageProperty().set(Resources.defaultPicture());
tvVersions.setItems(null);
tvVersions.prefHeightProperty().unbind();
tvVersions.minHeightProperty().unbind();
tvVersions.maxHeightProperty().unbind();
tvVersions.prefHeightProperty().set(60);
tvVersions.minHeightProperty().set(60);
tvVersions.maxHeightProperty().set(60);
tvGames.setItems(null);
tvGames.prefHeightProperty().unbind();
tvGames.minHeightProperty().unbind();
tvGames.maxHeightProperty().unbind();
tvGames.prefHeightProperty().set(60);
tvGames.minHeightProperty().set(60);
tvGames.maxHeightProperty().set(60);
vbContent.getChildren().remove(hbEdit);
btChallenge.setText("Herausfordern");
}
}
@FXML
public void clickChallenge() {
if (btChallenge.getText().equals("Löschen")) {
MainApp.webConnector.deleteKI(ai.id);
MainApp.onlineAis.remove(ai);
MainApp.loadOnlineResources();
} else {
MainApp.cGame.tabPaneOnOffline.getSelectionModel().select(MainApp.cGame.tabOnline);
MainApp.cGame.lvPlayerOnline2.getSelectionModel().select(ai);
MainApp.cRoot.tabPane.getSelectionModel().select(MainApp.cRoot.tabGameManagement);
}
}
@FXML
public void clickActualize() {
MainApp.loadOnlineRanking();
}
@FXML
public void clickAbort() {
btAbort.setVisible(false);
btEdit.setText("Bearbeiten");
tbDescription.setEditable(false);
tbDescription.setText(ai.description);
}
@FXML
public void clickEdit() {
if (!btAbort.isVisible()) {
btAbort.setVisible(true);
btEdit.setText("Speichern");
tbDescription.setEditable(true);
} else {
btAbort.setVisible(false);
btEdit.setText("Bearbeiten");
tbDescription.setEditable(false);
ai.description = tbDescription.getText();
MainApp.webConnector.changeDescription(ai.description, ai.id);
}
}
public void clickChangeAi(AiOnline selected) {
showAi(selected);
}
}