package org.pixelgaffer.turnierserver.codr.view; import java.io.IOException; import java.net.CookieHandler; import java.net.URI; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.http.cookie.Cookie; import org.pixelgaffer.turnierserver.codr.AiOnline; import org.pixelgaffer.turnierserver.codr.AiSimple; import org.pixelgaffer.turnierserver.codr.GameBase; import org.pixelgaffer.turnierserver.codr.GameOnline; import org.pixelgaffer.turnierserver.codr.GameSaved; import org.pixelgaffer.turnierserver.codr.MainApp; import org.pixelgaffer.turnierserver.codr.Version; import org.pixelgaffer.turnierserver.codr.utilities.Dialog; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ListChangeListener; import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ListView; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn.CellDataFeatures; import javafx.scene.control.TableView; import javafx.scene.control.TitledPane; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.util.Callback; public class ControllerGameManagement { @FXML public TabPane tabPaneOnOffline; @FXML public ListView<AiSimple> lvPlayerOffline1; @FXML public ListView<AiSimple> lvPlayerOffline2; @FXML public ListView<AiOnline> lvPlayerOnline1; @FXML public ListView<AiOnline> lvPlayerOnline2; @FXML public TableView<GameOnline> lvGamesOnline; @FXML public TableView<GameSaved> lvGamesOffline; @FXML public TitledPane tpNewGameOnline; @FXML public Tab tabOnline; @FXML public Tab tabOffline; @FXML public WebView webView; @FXML public ProgressIndicator prStartGameOnline; @FXML public ProgressIndicator prStartGameOffline; @FXML public ProgressIndicator prActualize; @FXML public Button btActualize; public GameSaved runningGame; MainApp mainApp; public GameBase game = null; /** * Initialisiert den Controller * * @param app eine Referenz auf die MainApp */ public void setMainApp(MainApp app) { mainApp = app; MainApp.cGame = this; MainApp.gameManager.loadGames(); lvPlayerOffline1.setItems(MainApp.aiManager.ais); lvPlayerOffline2.setItems(MainApp.aiManager.ais); lvPlayerOnline1.setItems(MainApp.ownOnlineAis); lvPlayerOnline2.setItems(MainApp.onlineAis); MainApp.aiManager.ais.addListener(new ListChangeListener<AiSimple>() { @Override public void onChanged(ListChangeListener.Change<? extends AiSimple> change) { initialSelectOffline(); } }); MainApp.ownOnlineAis.addListener(new ListChangeListener<AiOnline>() { @Override public void onChanged(ListChangeListener.Change<? extends AiOnline> change) { initialSelectOnline(); } }); MainApp.onlineAis.addListener(new ListChangeListener<AiOnline>() { @Override public void onChanged(ListChangeListener.Change<? extends AiOnline> change) { initialSelectOnline(); } }); lvGamesOffline.setItems(MainApp.gameManager.games); lvGamesOnline.setItems(MainApp.onlineGames); TableColumn<GameSaved, String> colOff0 = new TableColumn<GameSaved, String>("Spieler 1"); TableColumn<GameSaved, String> colOff1 = new TableColumn<GameSaved, String>("Wann"); TableColumn<GameSaved, String> colOff2 = new TableColumn<GameSaved, String>("Spieler 2"); colOff0.setCellValueFactory(new Callback<CellDataFeatures<GameSaved, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<GameSaved, String> p) { if (p.getValue().participants.size() > 0) return new SimpleStringProperty(p.getValue().participants.get(0).name); else return new SimpleStringProperty("ungültig"); } }); colOff1.setCellValueFactory(new Callback<CellDataFeatures<GameSaved, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<GameSaved, String> p) { return new SimpleStringProperty(p.getValue().date); } }); colOff2.setCellValueFactory(new Callback<CellDataFeatures<GameSaved, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<GameSaved, String> p) { if (p.getValue().participants.size() > 1) return new SimpleStringProperty(p.getValue().participants.get(1).name); else return new SimpleStringProperty("ungültig"); } }); colOff0.setStyle("-fx-alignment: CENTER-LEFT;"); colOff1.setStyle("-fx-alignment: CENTER-LEFT;"); colOff2.setStyle("-fx-alignment: CENTER-LEFT;"); lvGamesOffline.getColumns().add(colOff0); lvGamesOffline.getColumns().add(colOff1); lvGamesOffline.getColumns().add(colOff2); TableColumn<GameOnline, String> colOn0 = new TableColumn<GameOnline, String>("Spieler 1"); TableColumn<GameOnline, String> colOn1 = new TableColumn<GameOnline, String>("Wann"); TableColumn<GameOnline, String> colOn2 = new TableColumn<GameOnline, String>("Spieler 2"); colOn0.setCellValueFactory(new Callback<CellDataFeatures<GameOnline, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<GameOnline, String> p) { if (p.getValue().participants.size() > 0) return new SimpleStringProperty(p.getValue().participants.get(0).name); else return new SimpleStringProperty("ungültig"); } }); colOn1.setCellValueFactory(new Callback<CellDataFeatures<GameOnline, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<GameOnline, String> p) { return new SimpleStringProperty(p.getValue().date); } }); colOn2.setCellValueFactory(new Callback<CellDataFeatures<GameOnline, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<GameOnline, String> p) { if (p.getValue().participants.size() > 1) return new SimpleStringProperty(p.getValue().participants.get(1).name); else return new SimpleStringProperty("ungültig"); } }); colOn0.setStyle("-fx-alignment: CENTER-LEFT;"); colOn1.setStyle("-fx-alignment: CENTER-LEFT;"); colOn2.setStyle("-fx-alignment: CENTER-LEFT;"); lvGamesOnline.getColumns().add(colOn0); lvGamesOnline.getColumns().add(colOn1); lvGamesOnline.getColumns().add(colOn2); lvGamesOnline.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> { showGame(newValue); }); } public void initialSelectOffline(){ if (lvPlayerOffline1.getItems().size() > 0){ lvPlayerOffline1.getSelectionModel().select(0); } if (lvPlayerOffline2.getItems().size() > 1){ lvPlayerOffline2.getSelectionModel().select(1); } } public void initialSelectOnline(){ if (lvPlayerOnline1.getItems().size() > 0){ lvPlayerOnline1.getSelectionModel().select(0); } if (lvPlayerOnline2.getItems().size() > 1 && lvPlayerOnline1.getItems().size() > 0){ if (lvPlayerOnline1.getItems().get(0).equals(lvPlayerOnline2.getItems().get(0))) lvPlayerOnline2.getSelectionModel().select(1); else lvPlayerOnline2.getSelectionModel().select(0); } } public void showGame(GameBase ggame) { game = ggame; if (game instanceof GameSaved) showOfflineGame(); else showOnlineGame((GameOnline) game); } public void showOnlineGame(GameOnline game) { WebEngine webEngine = webView.getEngine(); webEngine.setJavaScriptEnabled(true); URI uri = URI.create(MainApp.webConnector.getUrlFromGame(game)); List<String> cookies = new ArrayList<>(); for(Cookie cookie : MainApp.webConnector.cookies.getCookies()) { cookies.add(cookie.getName() + "=" + cookie.getValue()); } Map<String, List<String>> headers = new LinkedHashMap<String, List<String>>(); headers.put("Set-Cookie", cookies); try { CookieHandler.getDefault().put(uri, headers); } catch (IOException e) { e.printStackTrace(); } webEngine.load(uri.toString()); } public void showOfflineGame() { // GameSaved game benutzen // in javafx.scene.web.WebView webView darstellen } @FXML void clickStartGameOnline() { if (lvPlayerOnline1.getSelectionModel().getSelectedItem() == null || lvPlayerOnline2.getSelectionModel().getSelectedItem() == null) { Dialog.error("Bitte erst die KIs auswählen"); return; } if (lvPlayerOnline1.getSelectionModel().getSelectedItem().id == lvPlayerOnline2.getSelectionModel().getSelectedItem().id){ Dialog.error("Bitte nicht die gleiche KI auswählen"); return; } Task<GameOnline> challenge = new Task<GameOnline>() { public GameOnline call() { try { return MainApp.webConnector.challenge(lvPlayerOnline1.getSelectionModel().getSelectedItem(), lvPlayerOnline2.getSelectionModel().getSelectedItem()); } catch (IOException e) { e.printStackTrace(); return null; } } }; prStartGameOnline.setVisible(true); challenge.valueProperty().addListener((observableValue, oldValue, newValue) -> { prStartGameOnline.setVisible(false); if (newValue == null) { Dialog.error("Die Herausforderung ist fehlgeschlagen"); return; } MainApp.onlineGames.add(0, newValue); lvGamesOnline.getSelectionModel().selectFirst(); }); Thread thread = new Thread(challenge, "challenge"); thread.setDaemon(true); thread.start(); } @FXML void clickStartGameOffline() { if (lvPlayerOffline1.getSelectionModel().getSelectedItem() == null || lvPlayerOffline2.getSelectionModel().getSelectedItem() == null) { Dialog.error("Bitte erst die KIs auswählen"); return; } if (lvPlayerOffline1.getSelectionModel().getSelectedItem().equals(lvPlayerOffline2.getSelectionModel().getSelectedItem())){ Dialog.error("Bitte nicht die gleiche KI auswählen"); return; } Task<Boolean> play = new Task<Boolean>() { public Boolean call() { System.out.println("starte game :)"); runningGame = new GameSaved(MainApp.actualGameType.get()); List<Version> players = new ArrayList<>(); players.add(lvPlayerOffline1.getSelectionModel().getSelectedItem().lastVersion()); players.add(lvPlayerOffline2.getSelectionModel().getSelectedItem().lastVersion()); runningGame.play(players); return true; } }; Thread thread = new Thread(play, "play"); thread.setDaemon(true); thread.start(); } @FXML void clickActualize() { MainApp.loadOnlineRanking(); } }