package nl.joshuaslik.tudelft.UFMGame.gui.game; import java.io.IOException; import java.util.ArrayList; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; import javafx.util.Callback; import javafx.util.StringConverter; import nl.joshuaslik.tudelft.UFMGame.backend.Player; import nl.joshuaslik.tudelft.UFMGame.backend.Team; import nl.joshuaslik.tudelft.UFMGame.backend.exceptions.UnableToBuyException; import nl.joshuaslik.tudelft.UFMGame.gui.Main; /** * Class to control the transfermarket * @author <a href="http://www.joshuaslik.nl/" target="_blank">Joshua Slik</a> * @author Lisette Veldkamp * @author Bryan van Wijk * @author Sander Benoist */ public class TransferMarket { private static Team team; private Team otherteam; private Player selectedplayer; private ObservableList<Player> observablelistplayers; private ObservableList<Player> observablelistteamplayers; // otherteams table variables @FXML private ComboBox<Team> teams; @FXML private TableView<Player> playertable; @FXML private TableColumn<Player, String> name, country, position, price; @FXML private Button buyplayerbutton, sellplayerbutton; // yourteam table variables @FXML private TableView<Player> yourteamtable; @FXML private TableColumn<Player, String> active2, name2, position2, value; /** * all tables are created */ @FXML private void initialize() { //Combobox team items in list ObservableList<Team> teamslist = FXCollections .observableArrayList(getteamList()); Team nonContractedTeam = new Team("Non-Contracted Players", "Non-Contracted Players", "Non-Contracted Players"); nonContractedTeam.setAllBenchPlayers(MainGame.game.getNonContractedPlayers()); teamslist.add(nonContractedTeam); teams.setItems(teamslist); teams.setConverter(new StringConverter<Team>() { @Override public String toString(Team team) { return team.getTeamName(); } @Override public Team fromString(String nr) { return null; } }); //Combobox selected team teams.valueProperty().addListener(new ChangeListener<Team>() { @Override public void changed(ObservableValue<? extends Team> observable, Team oldValue, Team newValue) { otherteam = newValue; ArrayList<Player> playerslist = otherteam.getBenchPlayers(); observablelistplayers = FXCollections .observableArrayList(playerslist); playertable.setItems(observablelistplayers); } }); teams.setValue(teamslist.get(0)); //otherteams table ArrayList<Player> playerslist = otherteam.getBenchPlayers(); observablelistplayers = FXCollections.observableArrayList(playerslist); playertable.setItems(observablelistplayers); name.setCellValueFactory(new PropertyValueFactory<Player, String>( "fullName")); country.setCellValueFactory(new PropertyValueFactory<Player, String>( "country")); position.setCellValueFactory(new PropertyValueFactory<Player, String>( "position")); price.setCellValueFactory(new PropertyValueFactory<Player, String>( "price")); playertable .getSelectionModel() .selectedItemProperty() .addListener( (observable, oldValue, newValue) -> selectedPlayer(newValue, "otherteamtable")); //your teamplayers table ArrayList<Player> teamplayerslist = team.getAllPlayers(); observablelistteamplayers = FXCollections .observableArrayList(teamplayerslist); yourteamtable.setItems(observablelistteamplayers); active2.setCellValueFactory(new PropertyValueFactory<Player, String>( "ID")); active2.setCellFactory(new Callback<TableColumn<Player, String>, TableCell<Player, String>>() { @Override public TableCell<Player, String> call( TableColumn<Player, String> param) { TableCell<Player, String> cell = new TableCell<Player, String>() { @Override public void updateItem(String item, boolean empty) { if (item != null) { boolean active = false; for (int i = 0; i < team.getActivePlayers().size(); i++) { if (team.getActivePlayers().get(i).getID() .equals(item)) { setText("✓"); active = true; } } if (!active) { setText("✗"); } } } }; return cell; } }); name2.setCellValueFactory(new PropertyValueFactory<Player, String>( "fullName")); position2.setCellValueFactory(new PropertyValueFactory<Player, String>( "position")); value.setCellValueFactory(new PropertyValueFactory<Player, String>( "price")); // Listen for selection changes to player yourteamtable .getSelectionModel() .selectedItemProperty() .addListener( (observable, oldValue, newValue) -> selectedPlayer(newValue, "yourteam")); } /** * get ObservableList of all other teams */ private ObservableList<Team> getteamList() { ArrayList<Team> teamarraylist = MainGame.game.getTeams(); teamarraylist.remove(MainGame.game.getUser().getTeam()); ObservableList<Team> res = FXCollections .observableArrayList(teamarraylist); return res; } /** * Selected player in tableit * @param player that is selected * @param selectedtable is the table that is selected in the transfermarket */ public void selectedPlayer(Player player, String selectedtable) { if(selectedtable.equals("yourteam")){ buyplayerbutton.setDisable(true); sellplayerbutton.setDisable(false); } else if(selectedtable.equals("otherteamtable")){ buyplayerbutton.setDisable(false); sellplayerbutton.setDisable(true); } selectedplayer = player; } /** * View the selected player * @throws IOException is thrown if the FXML file cannot be parsed. */ @FXML protected void handleViewPlayer() throws IOException { ViewPlayer.start(selectedplayer); } /** * Selling the selected player * @throws IOException is thrown if the FXML file cannot be parsed. */ @FXML protected void sellingPlayer() throws IOException { if(!team.getActivePlayers().contains(selectedplayer)){ MainGame.game.setNonContracted(selectedplayer.getID()); ArrayList<Player> teamplayerslist = team.getAllPlayers(); observablelistteamplayers = FXCollections .observableArrayList(teamplayerslist); yourteamtable.setItems(observablelistteamplayers); ArrayList<Player> playerslist = otherteam.getBenchPlayers(); observablelistplayers = FXCollections .observableArrayList(playerslist); playertable.setItems(observablelistplayers); sellplayerbutton.setDisable(true); AnchorPane bottom = (AnchorPane) FXMLLoader.load(Class.class .getResource("/data/gui/pages-game/GameBottomMenuBar.fxml")); Main.setBottom(bottom); buyplayerbutton.setDisable(true); playertable.getSelectionModel().select(null); playertable.getFocusModel().focus(null); yourteamtable.getSelectionModel().select(null); yourteamtable.getFocusModel().focus(null); } else{ Popupscreen.start(); Popupscreen.setTitle("Unable to sell"); Popupscreen.setMessage("You can not sell an active player."); } } /** * Buying the selected player and reloading page * @throws IOException is thrown if the FXML file cannot be parsed. */ @FXML protected void buyingPlayer() throws IOException { try{ if(otherteam.getTeamName().equals("Non-Contracted Players")){ MainGame.game.buyNonContractedPlayer(selectedplayer.getID(), MainGame.game.getUser()); } else{ MainGame.game.buyPlayer(selectedplayer.getID(), MainGame.game.getUser()); MainGame.game.sellPlayer(selectedplayer.getID(), MainGame.game.getUser(otherteam)); } ArrayList<Player> teamplayerslist = team.getAllPlayers(); observablelistteamplayers = FXCollections .observableArrayList(teamplayerslist); yourteamtable.setItems(observablelistteamplayers); ArrayList<Player> playerslist = otherteam.getBenchPlayers(); observablelistplayers = FXCollections .observableArrayList(playerslist); playertable.setItems(observablelistplayers); AnchorPane bottom = (AnchorPane) FXMLLoader.load(Class.class .getResource("/data/gui/pages-game/GameBottomMenuBar.fxml")); Main.setBottom(bottom); buyplayerbutton.setDisable(true); playertable.getSelectionModel().select(null); playertable.getFocusModel().focus(null); yourteamtable.getSelectionModel().select(null); yourteamtable.getFocusModel().focus(null); } catch(UnableToBuyException e){ Popupscreen.start(); Popupscreen.setTitle("Not enough money"); Popupscreen.setMessage("You must first get enough money to buy this player"); } } /** * Go back to the Main Game * @throws IOException is thrown if the FXML file cannot be parsed. */ @FXML protected void returnToTeam() throws IOException { MainGame.start(); } /** * Load Transfermarket page * @throws IOException is thrown if the FXML file cannot be parsed. */ public static void start() throws IOException { team = MainGame.game.getUser().getTeam(); AnchorPane root = FXMLLoader.load(Class.class .getResource("/data/gui/pages-game/TransferMarket.fxml")); Main.setCenter(root); AnchorPane bottom = (AnchorPane) FXMLLoader.load(Class.class .getResource("/data/gui/pages-game/GameBottomMenuBar.fxml")); Main.setBottom(bottom); } }