diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java index 0f3826d..68a86b6 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java @@ -7,40 +7,65 @@ public abstract class FXController { FactoryDecorator factoryDecorator; FileIO fileIO; Pane pane; + IsObserver listener; + + public FXController(){ + listener = new IsObserver() { + @Override + public void update() { + loadContent(); + } + }; + } public void setup(TournamentDecorator tournamentDecorator, FileIO fileIO, FactoryDecorator factoryDecorator, Pane pane){ this.tournamentDecorator = tournamentDecorator; this.fileIO = fileIO; this.factoryDecorator = factoryDecorator; this.pane = pane; - tournamentDecorator.addListener(new IsObserver() { - @Override - public void update() { - loadContent(); - } - }); - factoryDecorator.addListener(new IsObserver() { - @Override - public void update() { - loadContent(); - } - }); + addListener(); } public abstract void loadContent(); + protected void setTournamentDecorator(TournamentDecorator tournamentDecorator) { + this.tournamentDecorator = tournamentDecorator; + } + + public void addListener(){ + tournamentDecorator.addListener(listener); + factoryDecorator.addListener(listener); + } + + protected void removeListener(){ + tournamentDecorator.removeListener(listener); + factoryDecorator.removeListener(listener); + } + protected TournamentDecorator getTournamentDecorator() { return tournamentDecorator; } + protected void setFactoryDecorator(FactoryDecorator factoryDecorator) { + this.factoryDecorator = factoryDecorator; + } + protected FactoryDecorator getFactoryDecorator() { return factoryDecorator; } + protected void setFileIO(FileIO fileIO) { + this.fileIO = fileIO; + } + protected FileIO getFileIO() { return fileIO; } + protected void setPane(Pane pane) { + this.pane = pane; + } + protected Pane getPane() { return pane; } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java index c89ff8a..1492c0e 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java @@ -1,8 +1,11 @@ package ch.zhaw.projekt2.turnierverwaltung; +import ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView.GameController; +import ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView.GameDecorator; import ch.zhaw.projekt2.turnierverwaltung.main.tournamentList.TournamentListController; import javafx.fxml.FXMLLoader; import javafx.scene.layout.BorderPane; +import javafx.scene.layout.VBox; import java.io.IOException; import java.net.URL; @@ -10,6 +13,7 @@ import java.net.URL; public class Factory { private TournamentDecorator tournamentDecorator; private FileIO fileIO; + //TODO save views instead of recreate them. public Factory(FileIO fileIO, TournamentDecorator tournamentDecorator){ this.fileIO = fileIO; @@ -54,6 +58,20 @@ public class Factory { setCenterOfBorderPane(pane, getClass().getResource("gameScheduleView/GameSchedule.fxml"), factoryDecorator); } + public GameController loadGameView(VBox box, GameDecorator gameDecorator, FactoryDecorator factoryDecorator) { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("gameScheduleView/Game.fxml")); + box.getChildren().add(loader.load()); + GameController controller = loader.getController(); + controller.setup(tournamentDecorator, fileIO, factoryDecorator, box, gameDecorator); + return controller; + } catch (IOException e) { + e.printStackTrace(); + //TODO LOGGER + } + return null; + } + private FXController setCenterOfBorderPane(BorderPane pane, URL location, FactoryDecorator factoryDecorator) { FXController controller = null; try { @@ -61,7 +79,6 @@ public class Factory { pane.setCenter(loader.load()); controller = loader.getController(); controller.setup(tournamentDecorator, fileIO, factoryDecorator, pane); - controller.loadContent(); } catch (IOException e) { e.printStackTrace(); //TODO handle and logging? diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java index 95a4648..a03d878 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java @@ -1,7 +1,14 @@ package ch.zhaw.projekt2.turnierverwaltung; +import ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView.GameController; +import ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView.GameDecorator; +import javafx.geometry.Pos; +import javafx.scene.Node; import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; +import javafx.scene.shape.Line; import java.io.IOException; import java.util.ArrayList; @@ -44,8 +51,7 @@ public class FactoryDecorator implements IsObservable{ public void openTournament(FileIO.TournamentFile tournamentFile){ try { factory.setTournament(fileIO.loadTournament(tournamentFile)); - factory.loadGameScheduler((BorderPane) pane, this); - informListener(); + openScheduleView(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { @@ -53,18 +59,106 @@ public class FactoryDecorator implements IsObservable{ } //TODO handle and logging } + public void openTournamentList() { + factory.loadTournamentList((BorderPane) pane, this); + informListener(); + } + public void openParticipantFormular() { factory.loadParticipantFormular((BorderPane) pane, this); + informListener(); } public void openPlacesFormular() { factory.loadPlacesFormular((BorderPane) pane, this); + informListener(); } public void openScheduleView() { factory.loadGameScheduler((BorderPane) pane, this); + informListener(); } + public void loadGameList(HBox hBoxCenter, TournamentDecorator tournamentDecorator, boolean treeView) { + hBoxCenter.getChildren().clear(); + + List> gameList = tournamentDecorator.getTournament().getGameList(); + + List gameDecoratorsList = new ArrayList<>(); + double gameBoxHeight = 0; + double spacingFactor = 0; + for (int i = 0; i < gameList.size(); i++) { + List newGameDecoratorsList = new ArrayList<>(); + VBox vBox = new VBox(); + if(treeView){ + vBox.setAlignment(Pos.CENTER); + vBox.setSpacing(gameBoxHeight * spacingFactor); + } else { + vBox.setAlignment(Pos.TOP_CENTER); + } + spacingFactor = spacingFactor * 2 + 1; + for (int j = 0; j < gameList.get(i).size(); j++) { + GameDecorator gameDecorator = new GameDecorator(gameList.get(i).get(j)); + newGameDecoratorsList.add(gameDecorator); + GameController gameController = openGameView(vBox,gameDecorator); + if(i>0){ + gameController.addListener(gameDecoratorsList.get(j*2)); + gameController.addListener(gameDecoratorsList.get(j*2+1)); + } else if(gameBoxHeight == 0) { + gameBoxHeight = gameController.getGameBoxHeigth(); + } + gameDecorator.addListener(new IsObserver() { + @Override + public void update() { + tournamentDecorator.saveTournament(); + } + }); + gameController.loadContent(); + } + hBoxCenter.getChildren().add(vBox); + if(treeView){ + if(i+1 < gameList.size()) + hBoxCenter.getChildren().add(drawLines(vBox, gameBoxHeight, 30)); + } + gameDecoratorsList = newGameDecoratorsList; + } + } + + public VBox drawLines(VBox gameVBox, double gameBoxHeight, double lineLength){ + VBox completeLineVBox = new VBox(); + completeLineVBox.setAlignment(Pos.CENTER_LEFT); + double lineSpacing = gameVBox.getSpacing() + gameBoxHeight - 1; + completeLineVBox.setSpacing(lineSpacing); + for(int i = 0; i < gameVBox.getChildren().size(); i+=2){ + HBox lineBox = new HBox(); + lineBox.setAlignment(Pos.CENTER); + + //add Lines from left Game to center + VBox vBox = new VBox(); + vBox.setSpacing(lineSpacing); + vBox.getChildren().add(new Line(0,0,lineLength,0)); + vBox.getChildren().add(new Line(0,0,lineLength,0)); + lineBox.getChildren().add(vBox); + + + //add vertical line + lineBox.getChildren().add(new Line(0, 0, 0, lineSpacing)); + + //add line to right game + lineBox.getChildren().add(new Line(0, 0, lineLength, 0)); + + completeLineVBox.getChildren().add(lineBox); + + + } + return completeLineVBox; + } + + public GameController openGameView(VBox vBox, GameDecorator gameDecorator) { + return factory.loadGameView(vBox ,gameDecorator, this); + } + + public void informListener() { for(IsObserver observer : listener) { observer.update(); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java index 14b76f0..8549e8a 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java @@ -81,7 +81,7 @@ public class FileIO { * @throws IOException File not readable * @throws FileNotFoundException File not found */ - public Tournament loadTournament(File tournamentFile) throws IOException, ClassNotFoundException, FileNotFoundException { + public synchronized Tournament loadTournament(File tournamentFile) throws IOException, ClassNotFoundException, FileNotFoundException { if (tournamentFile == null) { logger.warning("Given tournament file is empty"); throw new IllegalArgumentException("Tournament File is null"); @@ -125,7 +125,7 @@ public class FileIO { * @throws IOException File not readable * @throws FileNotFoundException File not found */ - public void saveTournament(Tournament tournament) throws IOException, FileNotFoundException { + public synchronized void saveTournament(Tournament tournament) throws IOException, FileNotFoundException { if (tournament == null) { logger.warning("Given tournament file is empty"); throw new IllegalArgumentException("Null tournament received"); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java index 18e317b..51bbded 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java @@ -3,9 +3,21 @@ package ch.zhaw.projekt2.turnierverwaltung; import java.io.Serializable; public class Game implements Serializable { - private Participant participant1, Participant2; + private Participant participant1, participant2; private int points1, points2; private Place place; + private Game previousGame1, previousGame2; + + + public Game(Participant participant1, Participant participant2) { + this.participant1 = participant1; + this.participant2 = participant2; + } + + public Game(Game previousGame1, Game previousGame2){ + this.previousGame1 = previousGame1; + this.previousGame2 = previousGame2; + } public Place getLocation() { return place; @@ -39,11 +51,35 @@ public class Game implements Serializable { this.participant1 = participant1; } - public Participant getParticipant2() { - return Participant2; + public void setParticipant2(Participant participant2) { + this.participant2 = participant2; } - public void setParticipant2(Participant participant2) { - Participant2 = participant2; + public Participant getParticipant2() { + return participant2; } + + public void setPlace(Place place) { + this.place = place; + } + + public Place getPlace() { + return place; + } + + public Participant getWinner(){ + if(points1 > points2){ + return participant1; + } else if(points2 > points1){ + return participant2; + } else { + return null; + } + } + + public void refreshParticipants(){ + participant1 = previousGame1.getWinner(); + participant2 = previousGame2.getWinner(); + } + } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java index 31300f5..6f85290 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java @@ -6,5 +6,4 @@ public interface Participant extends Serializable { String getName(); void setName(String name); boolean equals(Participant participant); - void change(Participant participant); } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java index 73e598b..9cf624f 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java @@ -4,7 +4,7 @@ import java.io.Serializable; public class Person implements Serializable { private final String NAME_MATCHING_REGEX = "[a-zA-Z]{1,20}"; - private final String PHONE_MATCHING_REGEX = "[\\+]?[0-9]*"; + private final String PHONE_MATCHING_REGEX = "[\\+0-9]+"; private String name; private String firstName; diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java index 29bb2c6..3165364 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java @@ -29,27 +29,12 @@ public class Player extends Person implements Participant{ } public void setDateOfBirth(String dateOfBirth) { - if(dateOfBirth.length() > 0) { - String[] date = dateOfBirth.split("\\."); - this.dateOfBirth = LocalDate.of(Integer.valueOf(date[2]), Integer.valueOf(date[1]), Integer.valueOf(date[0])); - } else { - dateOfBirth = null; - } - } - - public void setDateOfBirth(LocalDate dateOfBirth) { - this.dateOfBirth = dateOfBirth; + String[] date = dateOfBirth.split("\\."); + this.dateOfBirth = LocalDate.of(Integer.valueOf(date[2]), Integer.valueOf(date[1]), Integer.valueOf(date[0])); } @Override public boolean equals(Participant participant) { return getClass().equals(participant.getClass()) && toString().toLowerCase().equals(participant.toString().toLowerCase()); } - - @Override - public void change(Participant participant) { - Player player = (Player) participant; - setDateOfBirth(player.getDateOfBirth()); - setPhoneNumber(player.getPhoneNumber()); - } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java index 8a2a0ba..e815a16 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java @@ -27,24 +27,11 @@ public class Team implements Participant { this.name = name; } - public void setPlayers(List players) { - this.players = players; - } - - public List getPlayers() { - return players; - } - @Override public boolean equals(Participant participant) { return getClass().equals(participant.getClass()) && toString().toLowerCase().equals(participant.toString().toLowerCase()); } - @Override - public void change(Participant participant) { - return; - } - public Person getContactPerson() { return contactPerson; } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java index 21c9a5e..15f701a 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java @@ -5,23 +5,20 @@ import javafx.collections.ObservableList; import java.io.File; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; +import java.util.*; public class Tournament implements Serializable { private String name; private Type type; private List participants; private List places; - + private List> gameList; public Tournament(String name, Type type) throws InvalidNameException, InvalidTypeException { - if(!name.matches("[\\w]{1,20}")){ + if (!name.matches("[\\w]{1,20}")) { throw new InvalidNameException("Invalid Name entered"); //TODO handle en logging. - } else if(!Arrays.asList(Type.values()).contains(type)){ + } else if (!Arrays.asList(Type.values()).contains(type)) { throw new InvalidTypeException("Invalid Type selected"); //TODO handle en logging. } @@ -29,20 +26,16 @@ public class Tournament implements Serializable { setType(type); participants = new ArrayList<>(); places = new ArrayList<>(); + gameList = new ArrayList<>(); } - public void saveParticipant(Participant newParticipant) throws ParticipantExistsException { - for(Participant participant: participants){ - if(participant.equals(newParticipant)){ - participant.change(newParticipant); - return; - } - } + public void addParticipant(Participant newParticipant) throws ParticipantExistsException { + participants.removeIf(participant -> participant.equals(newParticipant)); participants.add(newParticipant); } public void removeParticipant(Participant participant) throws ParticipantNotExistsException { - if(!participants.contains(participant)){ + if (!participants.contains(participant)) { throw new ParticipantNotExistsException("The given Participant is not part of this Tournament"); } participants.remove(participant); @@ -60,7 +53,7 @@ public class Tournament implements Serializable { } public void removePlace(Place place) throws PlaceNotExistsException { - if(!places.contains(place)){ + if (!places.contains(place)) { throw new PlaceNotExistsException("The given Place is not part of this Tournament"); } places.remove(place); @@ -72,6 +65,52 @@ public class Tournament implements Serializable { return placesObservable; } + + /* + creates a complete new GameSchedule + */ + public void createGameSchedule() throws NumberOfParticipantInvalidException { + gameList = new ArrayList<>(); + if (type == Type.KO) { + if (numberOfParticipantValid()) { + calcGameSchedule(); + //TODO Logging + } else { + throw new NumberOfParticipantInvalidException("Can not Create Game Schedule for KO Modus"); + //TODO Logging + } + + + } else { + //TODO for Type Group + } + } + + private boolean numberOfParticipantValid() { + double res = Math.log(participants.size()) / Math.log(2); + return (res * 10) % 10 == 0 && participants.size() >=4; + } + + private void calcGameSchedule() { + Collections.shuffle(participants); + + for (int i = 0; i < (Math.log(participants.size()) / Math.log(2)); i++) { + List gameRound = new ArrayList<>(); + if (i == 0) { + for (int j = 0; j < participants.size() - 1; j += 2) { + gameRound.add(new Game(participants.get(j), participants.get(j+1))); + } + } else { + for (int j = 0; j < (gameList.get(i-1).size()/2); j++) { + gameRound.add(new Game(gameList.get(i-1).get(j*2),gameList.get(i-1).get(j*2+1))); + } + } + gameList.add(gameRound); + } + + } + + public String getName() { return name; } @@ -88,6 +127,10 @@ public class Tournament implements Serializable { this.type = type; } + public List> getGameList() { + return gameList; + } + public enum Type { KO("KO-System"), GROUPS("Gruppenspiele"); @@ -102,7 +145,7 @@ public class Tournament implements Serializable { return name; } - public static ObservableList getObservableList(){ + public static ObservableList getObservableList() { ObservableList items = FXCollections.observableArrayList(); items.addAll(values()); return items; @@ -164,5 +207,14 @@ public class Tournament implements Serializable { } + public class NumberOfParticipantInvalidException extends Exception { + public NumberOfParticipantInvalidException() { + super(); + } + + public NumberOfParticipantInvalidException(String msg) { + super(msg); + } + } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java index 6f28efd..25e5bd2 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java @@ -2,12 +2,16 @@ package ch.zhaw.projekt2.turnierverwaltung; import java.io.IOException; import java.util.ArrayList; +import java.util.Date; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class TournamentDecorator implements IsObservable{ private Tournament tournament; private FileIO fileIO; private List listener = new ArrayList<>(); + private ExecutorService executorService; public TournamentDecorator(FileIO fileIO){ setFileIO(fileIO); @@ -15,10 +19,12 @@ public class TournamentDecorator implements IsObservable{ @Override public void update() { if(tournament != null){ + saveTournament(); } } }); + executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); } public void setFileIO(FileIO fileIO) { @@ -43,14 +49,13 @@ public class TournamentDecorator implements IsObservable{ listener.remove(observer); } + public void saveTournament(){ - try { - fileIO.saveTournament(tournament); - } catch (IOException e) { - e.printStackTrace(); //TODO handle and logging - } + executorService.execute(new saveTask()); } + + public void createTournament(String name, Tournament.Type type){ if(fileIO.tournamentExists(name)){ System.out.println("Tournament with same name exists already."); @@ -78,9 +83,14 @@ public class TournamentDecorator implements IsObservable{ } } + public void createNewGameSchedule() throws Tournament.NumberOfParticipantInvalidException { + tournament.createGameSchedule(); + informListener(); + } + public void savePlayer(String firstName, String name, String phoneNumber, String dateOfBirth){ try { - tournament.saveParticipant(new Player(firstName, name, phoneNumber, dateOfBirth)); + tournament.addParticipant(new Player(firstName, name, phoneNumber, dateOfBirth)); informListener(); } catch (Tournament.ParticipantExistsException e) { e.printStackTrace(); //TODO handle and logging @@ -120,9 +130,23 @@ public class TournamentDecorator implements IsObservable{ } } + public void informListener() { for(IsObserver observer : listener) { observer.update(); } } + + private class saveTask implements Runnable { + + @Override + public void run() { + try { + fileIO.saveTournament(tournament); + } catch (IOException e) { + e.printStackTrace(); //TODO handle and logging + } + } + } + } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java index c1f059e..9ff754e 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java @@ -25,13 +25,13 @@ public class MainWindow extends Application { BorderPane pane = factory.loadMainWindow(); factoryDecorator = new FactoryDecorator(fileIO, factory, pane); - factory.loadTournamentList(pane, factoryDecorator); + factoryDecorator.openTournamentList(); Scene scene = new Scene(pane); primaryStage.setScene(scene); primaryStage.setMaximized(true); - primaryStage.setResizable(false); + primaryStage.setResizable(true); primaryStage.setFullScreen(false); primaryStage.show(); } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java index 836c784..c8f5761 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java @@ -1,16 +1,80 @@ package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; -import ch.zhaw.projekt2.turnierverwaltung.FXController; +import ch.zhaw.projekt2.turnierverwaltung.*; +import javafx.beans.value.ObservableValue; +import javafx.event.Event; import javafx.fxml.FXML; import javafx.scene.control.ChoiceBox; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; -public class GameController extends FXController { +public class GameController extends FXController{ + + private GameDecorator gameDecorator; @FXML - private ChoiceBox placesChoiceBox; + private VBox mainVBox; + + @FXML + private Label participantNameOne; + + @FXML + private Label participantNameTwo; + + @FXML + private ChoiceBox placesChoiceBox; + + @FXML + private TextField pointsTeamOne; + + @FXML + private TextField pointsTeamTwo; + + @FXML + void saveGameResult(Event event) { + gameDecorator.saveGameResult(pointsTeamOne.getText(), pointsTeamTwo.getText()); + } + + + private void saveGamePlace(Place newPlace) { + gameDecorator.saveGamePlace(newPlace); + } + + public double getGameBoxHeigth(){ + return mainVBox.getPrefHeight(); + } @Override public void loadContent() { - + participantNameOne.setText(gameDecorator.getParticipantOne()); + participantNameTwo.setText(gameDecorator.getParticipantTwo()); + pointsTeamOne.setText(String.valueOf(gameDecorator.getPoints1())); + pointsTeamTwo.setText(String.valueOf(gameDecorator.getPoints2())); + placesChoiceBox.setItems(getTournamentDecorator().getTournament().getPlaces()); + placesChoiceBox.setValue(gameDecorator.getPlace()); } -} + + public void refreshParticipants(){ + gameDecorator.refreshParticipants(); + } + + public void addListener(GameDecorator gameDecorator){ + gameDecorator.addListener(new IsObserver() { + @Override + public void update() { + refreshParticipants(); + loadContent(); + } + }); + } + + + public void setup(TournamentDecorator tournamentDecorator, FileIO fileIO, FactoryDecorator factoryDecorator, Pane pane, GameDecorator gameDecorator) { + setTournamentDecorator(tournamentDecorator); + this.gameDecorator = gameDecorator; + placesChoiceBox.getSelectionModel().selectedItemProperty().addListener((ObservableValue observable, Place oldValue, Place newValue) -> saveGamePlace(newValue)); + } + +} \ No newline at end of file diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameDecorator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameDecorator.java new file mode 100644 index 0000000..6be0905 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameDecorator.java @@ -0,0 +1,82 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; + +import ch.zhaw.projekt2.turnierverwaltung.*; + +import java.util.ArrayList; +import java.util.List; + + +public class GameDecorator implements IsObservable{ + private Game game; + private List listener = new ArrayList<>(); + + public GameDecorator (Game game) { + this.game = game; + } + + @Override + public void addListener(IsObserver observer) { + listener.add(observer); + } + + @Override + public void removeListener(IsObserver observer) { + listener.remove(observer); + } + + public void saveGameResult(String points1, String points2){ + if(points1.length() > 0){ + game.setPoints1(Integer.parseInt(points1)); + } else { + game.setPoints1(0); + } + if(points2.length() > 0) { + game.setPoints2(Integer.parseInt(points2)); + } else { + game.setPoints2(0); + } + informListener(); + } + + public void saveGamePlace(Place place){ + game.setPlace(place); + informListener(); + } + + public String getPoints1() { + return String.valueOf(game.getPoints1()); + } + + public String getPoints2() { + return String.valueOf(game.getPoints2()); + } + + public String getParticipantOne() { + if (game.getParticipant1() != null) { + return game.getParticipant1().toString(); + } + return "1"; + } + + public String getParticipantTwo() { + if (game.getParticipant2() != null) { + return game.getParticipant2().toString(); + } + return "2"; + } + + public void refreshParticipants(){ + game.refreshParticipants(); + informListener(); + } + + public Place getPlace() { + return game.getPlace(); + } + + public void informListener() { + for(IsObserver observer : listener) { + observer.update(); + } + } +} diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java index ab82179..4d4410c 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java @@ -1,24 +1,69 @@ package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; import ch.zhaw.projekt2.turnierverwaltung.FXController; +import ch.zhaw.projekt2.turnierverwaltung.Tournament; import javafx.event.ActionEvent; import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.CheckBox; +import javafx.scene.layout.HBox; public class GameScheduleController extends FXController { + + @FXML + private Button createScheduleBtn; + + @FXML + private Button editLocBtn; + + @FXML + private Button editParticipantBtn; + + @FXML + private Button closeTournamentBtn; + + @FXML + private HBox hBoxCenter; + + @FXML + private CheckBox treeView; + + @FXML + void createNewSchedule(ActionEvent event) { + try { + getTournamentDecorator().createNewGameSchedule(); + } catch (Tournament.NumberOfParticipantInvalidException e) { + //TODO Method in FactoryDecorater to show msg + e.printStackTrace(); + } + } @FXML void openPlacesFormular(ActionEvent event) { + removeListener(); getFactoryDecorator().openPlacesFormular(); } @FXML void openParticipantFormular(ActionEvent event) { + removeListener(); getFactoryDecorator().openParticipantFormular(); } + @FXML + void closeTournament(ActionEvent event) { + removeListener(); + getFactoryDecorator().openTournamentList(); + } + + @FXML + void changeView(ActionEvent event) { + loadContent(); + } + @Override public void loadContent() { - + getFactoryDecorator().loadGameList(hBoxCenter, getTournamentDecorator(), treeView.isSelected()); } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java index 8492fdd..b677ce5 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java @@ -79,14 +79,6 @@ public class ParticipantFormularController extends FXController { @FXML void saveParticipant(ActionEvent event) { getTournamentDecorator().savePlayer(firstNameTextField.getText(), participantNameTextField.getText(), phoneNumberTextField.getText(), birthDateTextField.getText()); - clearFormular(); - } - - private void clearFormular() { - firstNameTextField.clear(); - participantNameTextField.clear(); - phoneNumberTextField.clear(); - birthDateTextField.clear(); } @FXML @@ -97,6 +89,7 @@ public class ParticipantFormularController extends FXController { @FXML void close(ActionEvent event) { + removeListener(); getFactoryDecorator().openScheduleView(); } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java index 036fb4f..6a2de96 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java @@ -58,11 +58,6 @@ public class PlacesFormularController extends FXController { @FXML void savePlace(ActionEvent event) { getTournamentDecorator().savePlace(placeNameTextField.getText()); - clearFormular(); - } - - private void clearFormular() { - placeNameTextField.clear(); } @FXML @@ -73,6 +68,7 @@ public class PlacesFormularController extends FXController { @FXML void close(ActionEvent event) { + removeListener(); getFactoryDecorator().openScheduleView(); } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/AlertDelete.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/AlertDelete.java index e440807..6c400dd 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/AlertDelete.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/AlertDelete.java @@ -4,8 +4,6 @@ import javafx.scene.control.Alert; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; -import java.io.IOException; - public class AlertDelete extends Alert { ButtonType yesButton = new ButtonType("Ja", ButtonBar.ButtonData.YES); ButtonType noButton = new ButtonType("Nein", ButtonBar.ButtonData.NO); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java index bcc1109..b70630a 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java @@ -61,6 +61,7 @@ public class TournamentListController extends FXController { @FXML void openTournament(ActionEvent event) { + removeListener(); FileIO.TournamentFile tournamentFile = tournamentListView.getSelectionModel().getSelectedItems().get(0); getFactoryDecorator().openTournament(tournamentFile); } diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml index 83fcb91..e335cc5 100644 --- a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml @@ -7,40 +7,53 @@ - - + - diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml index cd88c6a..f3f9207 100644 --- a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml @@ -1,26 +1,41 @@ - - - - + + + - - + - + - - + + +
+ + + + + +