diff --git a/app/build.gradle b/app/build.gradle index 24699f1..dfbf65f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,6 +9,12 @@ plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'application' + id 'org.openjfx.javafxplugin' version '0.0.12' +} + +javafx { + version = '17.0.1' + modules = [ 'javafx.controls', 'javafx.fxml' ] } repositories { @@ -22,6 +28,8 @@ dependencies { // This dependency is used by the application. implementation 'com.google.guava:guava:30.1.1-jre' + + } application { diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/App.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/App.java index 3273b7c..2099098 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/App.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/App.java @@ -3,18 +3,11 @@ */ package ch.zhaw.projekt2.turnierverwaltung; -import java.io.File; -import java.util.ArrayList; -import java.util.List; +import ch.zhaw.projekt2.turnierverwaltung.main.MainWindow; +import javafx.application.Application; public class App { - public String getGreeting() { - return "Hello World!"; - } - public static void main(String[] args) { - System.out.println(new App().getGreeting()); - - FileIO io = new FileIO(System.getProperty("user.dir") + "/tournierverwaltung_angrynerds"); + Application.launch(MainWindow.class,args); } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java new file mode 100644 index 0000000..0f3826d --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FXController.java @@ -0,0 +1,47 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +import javafx.scene.layout.Pane; + +public abstract class FXController { + TournamentDecorator tournamentDecorator; + FactoryDecorator factoryDecorator; + FileIO fileIO; + Pane pane; + + 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(); + } + }); + } + + public abstract void loadContent(); + + protected TournamentDecorator getTournamentDecorator() { + return tournamentDecorator; + } + + protected FactoryDecorator getFactoryDecorator() { + return factoryDecorator; + } + + protected FileIO getFileIO() { + return fileIO; + } + + 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 new file mode 100644 index 0000000..c89ff8a --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java @@ -0,0 +1,75 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +import ch.zhaw.projekt2.turnierverwaltung.main.tournamentList.TournamentListController; +import javafx.fxml.FXMLLoader; +import javafx.scene.layout.BorderPane; + +import java.io.IOException; +import java.net.URL; + +public class Factory { + private TournamentDecorator tournamentDecorator; + private FileIO fileIO; + + public Factory(FileIO fileIO, TournamentDecorator tournamentDecorator){ + this.fileIO = fileIO; + this.tournamentDecorator = tournamentDecorator; + } + + public TournamentDecorator getTournamentDecorator() { + return tournamentDecorator; + } + + public void setTournament(Tournament tournament) { + this.tournamentDecorator.setTournament(tournament); + } + + public BorderPane loadMainWindow(){ + FXMLLoader loader = new FXMLLoader(getClass().getResource("mainWindow.fxml")); + try { + return loader.load(); + } catch (IOException e) { + e.printStackTrace(); + //TODO handle and logging + } + return null; + } + + public void loadTournamentList(BorderPane pane, FactoryDecorator factoryDecorator){ + tournamentDecorator.setTournament(null); + TournamentListController controller = (TournamentListController) setCenterOfBorderPane(pane, getClass().getResource("tournamentList/tournamentList.fxml"), factoryDecorator); + } + + //Can be used to Open new Scene in same Stage. + //This way possible to later give object to Controller + public void loadParticipantFormular(BorderPane pane, FactoryDecorator factoryDecorator) { + setCenterOfBorderPane(pane, getClass().getResource("participantAddFormular/participantFormular.fxml"), factoryDecorator); + } + + public void loadPlacesFormular(BorderPane pane, FactoryDecorator factoryDecorator) { + setCenterOfBorderPane(pane, getClass().getResource("placesAddFormular/PlacesFormular.fxml"), factoryDecorator); + } + + public void loadGameScheduler(BorderPane pane, FactoryDecorator factoryDecorator) { + setCenterOfBorderPane(pane, getClass().getResource("gameScheduleView/GameSchedule.fxml"), factoryDecorator); + } + + private FXController setCenterOfBorderPane(BorderPane pane, URL location, FactoryDecorator factoryDecorator) { + FXController controller = null; + try { + FXMLLoader loader = new FXMLLoader(location); + pane.setCenter(loader.load()); + controller = loader.getController(); + controller.setup(tournamentDecorator, fileIO, factoryDecorator, pane); + controller.loadContent(); + } catch (IOException e) { + e.printStackTrace(); + //TODO handle and logging? + } + return controller; + } + + + + +} diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java new file mode 100644 index 0000000..9364f64 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java @@ -0,0 +1,69 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.Pane; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class FactoryDecorator implements IsObservable{ + private Factory factory; + private FileIO fileIO; + private Pane pane; + private List listener = new ArrayList<>(); + + public FactoryDecorator(FileIO fileIO, Factory factory, Pane pane){ + setFactory(factory); + setFileIO(fileIO); + setPane(pane); + } + + public void setFileIO(FileIO fileIO) { + this.fileIO = fileIO; + } + + public void setFactory(Factory factory) { + this.factory = factory; + } + + public void setPane(Pane pane) { + this.pane = pane; + } + + @Override + public void addListener(IsObserver observer) { + listener.add(observer); + } + + @Override + public void removeListener(IsObserver observer) { + listener.remove(observer); + } + + public void openTournament(FileIO.TournamentFile tournamentFile){ + try { + factory.setTournament(fileIO.loadTournament(tournamentFile)); + factory.loadGameScheduler((BorderPane) pane, this); + informListener(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } //TODO handle and logging + } + + public void openParticipantFormular() { + factory.loadParticipantFormular((BorderPane) pane, this); + } + + public void openPlacesFormular() { + factory.loadPlacesFormular((BorderPane) pane, 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 22c7cfe..5d49c4a 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java @@ -1,7 +1,12 @@ package ch.zhaw.projekt2.turnierverwaltung; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + import java.io.*; +import java.net.URI; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.logging.Logger; @@ -43,9 +48,22 @@ public class FileIO { * * @return List with all containing save Files */ - public List getList() { + public ObservableList getList() { logger.fine("Creating a List out of all Files in the save directory and returning it"); - return Arrays.asList(saves.listFiles()); + ObservableList tournamentFiles = FXCollections.observableArrayList(); + for(File tournament : saves.listFiles()){ + tournamentFiles.add(new TournamentFile(tournament.toURI())); + } + return tournamentFiles; + } + + public boolean tournamentExists(String name){ + for(TournamentFile file : getList()) { + if(file.toString().toLowerCase().equals(name.toLowerCase())){ + return true; + } + } + return false; } /** @@ -154,6 +172,17 @@ public class FileIO { logger.warning("Failed to delete requested File"); throw new FileNotFoundException("File deletion unsuccessful"); } + + public class TournamentFile extends File{ + + public TournamentFile(URI uri) { + super(uri); + } + + public String toString(){ + return getName().split("\\.")[0]; + } + } } 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 bab3390..3df9735 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java @@ -1,6 +1,8 @@ package ch.zhaw.projekt2.turnierverwaltung; -public class Game { +import java.io.Serializable; + +public class Game implements Serializable { private Participant participant1, Participant2; private int points1, points2; private Location location; diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/InvalidNameException.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/InvalidNameException.java new file mode 100644 index 0000000..d3be2ec --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/InvalidNameException.java @@ -0,0 +1,12 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +public class InvalidNameException extends Exception { + public InvalidNameException() { + super(); + } + + public InvalidNameException(String errorMessage) { + super(errorMessage); + } + +} \ No newline at end of file diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/IsObservable.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/IsObservable.java new file mode 100644 index 0000000..a627e78 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/IsObservable.java @@ -0,0 +1,19 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +/** + * Most basic interface for observing an object + * @author bles + * + */ +public interface IsObservable { + /** + * Add an observer that listens for updates + * @param observer + */ + void addListener(IsObserver observer); + /** + * Remove an observer from the list + * @param observer + */ + void removeListener(IsObserver observer); +} diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/IsObserver.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/IsObserver.java new file mode 100644 index 0000000..4501482 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/IsObserver.java @@ -0,0 +1,14 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +/** + * Most basic interface for beeing an observer + * @author bles + * + */ +public interface IsObserver { + /** + * This method is always called when an observed object + * changes + */ + void update(); +} 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 e48f3a1..6f85290 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java @@ -1,6 +1,9 @@ package ch.zhaw.projekt2.turnierverwaltung; -public interface Participant { +import java.io.Serializable; + +public interface Participant extends Serializable { String getName(); void setName(String name); + boolean equals(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 1165e7d..9cf624f 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java @@ -1,11 +1,23 @@ package ch.zhaw.projekt2.turnierverwaltung; -public class Person { +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 String name; private String firstName; private String phoneNumber; - public Person(String firstName, String name, String phoneNumber){ + public Person(String firstName, String name, String phoneNumber) throws InvalidNameException, InvalidPhoneNumberException { + if(!firstName.matches(NAME_MATCHING_REGEX)){ + throw new InvalidNameException("The First name is Invalid."); + } else if(!name.matches(NAME_MATCHING_REGEX)){ + throw new InvalidNameException("The Last name is Invalid"); + } else if(!phoneNumber.matches(PHONE_MATCHING_REGEX)){ + throw new InvalidPhoneNumberException("The entered Phone Number is invalid."); + } setFirstName(firstName); setName(name); setPhoneNumber(phoneNumber); @@ -34,4 +46,21 @@ public class Person { public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } + + public class InvalidPhoneNumberException extends Exception { + public InvalidPhoneNumberException() { + super(); + } + + public InvalidPhoneNumberException(String errorMessage) { + super(errorMessage); + } + + } + + @Override + public String toString(){ + return firstName + " " + name; + } + } 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 4273fd1..3165364 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java @@ -1,21 +1,40 @@ package ch.zhaw.projekt2.turnierverwaltung; -import java.util.Date; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; public class Player extends Person implements Participant{ - private Date dateOfBirth; + private LocalDate dateOfBirth; - public Player(String firstName, String name, String phoneNumber, Date dateOfBirth){ + public Player(String firstName, String name, String phoneNumber, String dateOfBirth) throws InvalidNameException, InvalidPhoneNumberException { super(firstName, name, phoneNumber); setDateOfBirth(dateOfBirth); } - public Date getDateOfBirth() { + public LocalDate getDateOfBirth() { return dateOfBirth; } - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; + public String getFormatedDateOfBirth(){ + try{ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + return dateOfBirth.format(formatter); + } catch (Exception e) { + //todo handle and logging + return ""; + } + } + + public void setDateOfBirth(String 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()); } } 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 880cc13..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,6 +27,11 @@ public class Team implements Participant { this.name = name; } + @Override + public boolean equals(Participant participant) { + return getClass().equals(participant.getClass()) && toString().toLowerCase().equals(participant.toString().toLowerCase()); + } + public Person getContactPerson() { return contactPerson; } @@ -34,4 +39,9 @@ public class Team implements Participant { public void setContactPerson(Person contactPerson) { this.contactPerson = contactPerson; } + + @Override + public String toString(){ + return name; + } } 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 0da286d..744ba05 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java @@ -1,12 +1,53 @@ package ch.zhaw.projekt2.turnierverwaltung; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import java.io.File; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class Tournament implements Serializable { private String name; + private Type type; + private List participants; + + + + public Tournament(String name, Type type) throws InvalidNameException, InvalidTypeException { + if(!name.matches("[\\w]{1,20}")){ + throw new InvalidNameException("Invalid Name entered"); //TODO handle en logging. + } else if(!Arrays.asList(Type.values()).contains(type)){ + throw new InvalidTypeException("Invalid Type selected"); //TODO handle en logging. + } - public Tournament(String name){ setName(name); + setType(type); + participants = new ArrayList<>(); + } + + public void addParticipant(Participant newParticipant) throws ParticipantExistsException { + for(Participant participant : participants){ + if(participant.equals(newParticipant)){ + participants.remove(participant); + } + } + participants.add(newParticipant); + } + + public void removeParticipant(Participant participant) throws ParticipantNotExistsException { + if(!participants.contains(participant)){ + throw new ParticipantNotExistsException("The given Participant is not part of this Tournament"); + } + participants.remove(participant); + } + + public ObservableList getParticipants() { + ObservableList participantsObservable = FXCollections.observableArrayList(); + participantsObservable.addAll(participants); + return participantsObservable; } public String getName() { @@ -16,4 +57,68 @@ public class Tournament implements Serializable { public void setName(String name) { this.name = name; } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public enum Type { + KO("KO-System"), GROUPS("Gruppenspiele"); + + private String name; + + private Type(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + + public static ObservableList getObservableList(){ + ObservableList items = FXCollections.observableArrayList(); + items.addAll(values()); + return items; + } + } + + public class InvalidTypeException extends Exception { + public InvalidTypeException() { + super(); + } + + public InvalidTypeException(String errorMessage) { + super(errorMessage); + } + + } + + public class ParticipantExistsException extends Exception { + public ParticipantExistsException() { + super(); + } + + public ParticipantExistsException(String errorMessage) { + super(errorMessage); + } + + } + + public class ParticipantNotExistsException extends Exception { + public ParticipantNotExistsException() { + super(); + } + + public ParticipantNotExistsException(String errorMessage) { + super(errorMessage); + } + + } + + } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java new file mode 100644 index 0000000..d284219 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java @@ -0,0 +1,109 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class TournamentDecorator implements IsObservable{ + private Tournament tournament; + private FileIO fileIO; + private List listener = new ArrayList<>(); + + public TournamentDecorator(FileIO fileIO){ + setFileIO(fileIO); + addListener(new IsObserver() { + @Override + public void update() { + if(tournament != null){ + saveTournament(); + } + } + }); + } + + public void setFileIO(FileIO fileIO) { + this.fileIO = fileIO; + } + + public void setTournament(Tournament tournament) { + this.tournament = tournament; + } + + public Tournament getTournament() { + return tournament; + } + + @Override + public void addListener(IsObserver observer) { + listener.add(observer); + } + + @Override + public void removeListener(IsObserver observer) { + listener.remove(observer); + } + + public void saveTournament(){ + try { + fileIO.saveTournament(tournament); + } catch (IOException e) { + e.printStackTrace(); //TODO handle and logging + } + } + + public void createTournament(String name, Tournament.Type type){ + if(fileIO.tournamentExists(name)){ + System.out.println("Tournament with same name exists already."); + return; //TODO handle and logging + } + try { + Tournament tournament = new Tournament(name, type); + fileIO.saveTournament(tournament); + informListener(); + } catch (InvalidNameException e) { + e.printStackTrace(); //TODO handle and logging + } catch (Tournament.InvalidTypeException e) { + e.printStackTrace(); //TODO handle and logging + } catch (IOException e) { + e.printStackTrace(); //TODO handle and logging + } + } + + public void deleteTournament(FileIO.TournamentFile tournamentFile){ + try { + fileIO.deleteTournament(tournamentFile); + informListener(); + } catch (IOException e) { + e.printStackTrace(); //TODO handle and logging + } + } + + public void savePlayer(String firstName, String name, String phoneNumber, String dateOfBirth){ + try { + tournament.addParticipant(new Player(firstName, name, phoneNumber, dateOfBirth)); + informListener(); + } catch (Tournament.ParticipantExistsException e) { + e.printStackTrace(); //TODO handle and logging + } catch (InvalidNameException e) { + e.printStackTrace(); //TODO handle and logging + } catch (Person.InvalidPhoneNumberException e) { + e.printStackTrace(); //TODO handle and logging + } + } + + public void deleteParticipant(Participant participant){ + try { + tournament.removeParticipant(participant); + informListener(); + } catch (Tournament.ParticipantNotExistsException e) { + e.printStackTrace(); //TODO handle and logging + } + } + + public void informListener() { + for(IsObserver observer : listener) { + observer.update(); + } + } +} 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 new file mode 100644 index 0000000..290b1e6 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java @@ -0,0 +1,40 @@ +package ch.zhaw.projekt2.turnierverwaltung.main; + +import ch.zhaw.projekt2.turnierverwaltung.Factory; +import ch.zhaw.projekt2.turnierverwaltung.FactoryDecorator; +import ch.zhaw.projekt2.turnierverwaltung.FileIO; +import ch.zhaw.projekt2.turnierverwaltung.TournamentDecorator; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.Pane; +import javafx.stage.Stage; + +import java.awt.*; +import java.io.IOException; + +public class MainWindow extends Application { + private FileIO fileIO = new FileIO(System.getProperty("user.dir") + "/tournierverwaltung_angrynerds"); + private TournamentDecorator tournamentDecorator = new TournamentDecorator(fileIO); + private Factory factory = new Factory(fileIO, tournamentDecorator); //TODO make it private! + private FactoryDecorator factoryDecorator; + + @Override + public void start(Stage primaryStage) throws Exception { + + BorderPane pane = factory.loadMainWindow(); + factoryDecorator = new FactoryDecorator(fileIO, factory, pane); + factory.loadTournamentList(pane, factoryDecorator); + + + Scene scene = new Scene(pane); + primaryStage.setScene(scene); + primaryStage.setMaximized(true); + primaryStage.setResizable(false); + primaryStage.setFullScreen(false); + primaryStage.show(); + } + + +} diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java new file mode 100644 index 0000000..ef5e1d6 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java @@ -0,0 +1,23 @@ +package ch.zhaw.projekt2.turnierverwaltung.main; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; + +public class MainWindowController extends FXController { + + @FXML + void changeLangToGerman(ActionEvent event) { + + } + + @FXML + void closeApplication(ActionEvent event) { + + } + + @Override + public void loadContent() { + + } +} 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 new file mode 100644 index 0000000..836c784 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java @@ -0,0 +1,16 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import javafx.fxml.FXML; +import javafx.scene.control.ChoiceBox; + +public class GameController extends FXController { + + @FXML + private ChoiceBox placesChoiceBox; + + @Override + public void loadContent() { + + } +} 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 new file mode 100644 index 0000000..ab82179 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java @@ -0,0 +1,24 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; + +public class GameScheduleController extends FXController { + + @FXML + void openPlacesFormular(ActionEvent event) { + getFactoryDecorator().openPlacesFormular(); + } + + @FXML + void openParticipantFormular(ActionEvent event) { + getFactoryDecorator().openParticipantFormular(); + } + + @Override + public void loadContent() { + + } +} + 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 new file mode 100644 index 0000000..521334f --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java @@ -0,0 +1,106 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.participantAddFormular; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import ch.zhaw.projekt2.turnierverwaltung.Participant; +import ch.zhaw.projekt2.turnierverwaltung.Player; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ListView; +import javafx.scene.control.TextField; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.VBox; + +public class ParticipantFormularController extends FXController { + + @FXML + private Button addBtn; + + @FXML + private Label birthDateLabel; + + @FXML + private TextField birthDateTextField; + + @FXML + private VBox changeBtn; + + @FXML + private Label firstNameLabel; + + @FXML + private TextField firstNameTextField; + + @FXML + private GridPane grid; + + @FXML + private Label newParticipantFormularTitle; + + @FXML + private Button closeBtn; + + @FXML + private Button deleteBtn; + + + @FXML + private Label participantListTitle; + + @FXML + private ListView participantListView; + + @FXML + private Label participantNameLabel; + + @FXML + private TextField participantNameTextField; + + @FXML + private Label phoneNumberLabel; + + @FXML + private TextField phoneNumberTextField; + + @FXML + private Button saveBtn; + + @FXML + void changedSelection(MouseEvent event){ + Player participant = (Player) participantListView.getSelectionModel().getSelectedItems().get(0); + participantNameTextField.setText(participant.getName()); + firstNameTextField.setText(participant.getFirstName()); + phoneNumberTextField.setText(participant.getPhoneNumber()); + birthDateTextField.setText(participant.getFormatedDateOfBirth()); + } + + @FXML + void changeParticipant(MouseEvent event) { + + } + + @FXML + void saveParticipant(ActionEvent event) { + getTournamentDecorator().savePlayer(firstNameTextField.getText(), participantNameTextField.getText(), phoneNumberTextField.getText(), birthDateTextField.getText()); + } + + + @FXML + void delete(ActionEvent event) { + System.out.println("delete"); + Participant participant = participantListView.getSelectionModel().getSelectedItems().get(0); + getTournamentDecorator().deleteParticipant(participant); + } + + @FXML + void close(ActionEvent event) { + + } + + @Override + public void loadContent() { + participantListView.setItems(getTournamentDecorator().getTournament().getParticipants()); + } +} 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 new file mode 100644 index 0000000..5edac10 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java @@ -0,0 +1,66 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.placesAddFormular; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ListView; +import javafx.scene.control.TextField; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.GridPane; + +public class PlacesFormularController extends FXController { + + @FXML + private Label AddListTitle; + + @FXML + private Button closeBtn; + + @FXML + private Button deleteBtn; + + @FXML + private GridPane grid; + + @FXML + private ListView locationListView; + + @FXML + private Label locationNameLabel; + + @FXML + private TextField locationNameTextField; + + @FXML + private Label newLocationFormularTitle; + + @FXML + private Button saveBtn; + + @FXML + void changedSelection(MouseEvent event) { + + } + + @FXML + void closeFormular(ActionEvent event) { + + } + + @FXML + void deleteSelectedPlace(ActionEvent event) { + + } + + @FXML + void saveLocation(ActionEvent event) { + + } + + @Override + public void loadContent() { + + } +} 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 new file mode 100644 index 0000000..e440807 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/AlertDelete.java @@ -0,0 +1,34 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.tournamentList; + +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); + Boolean result; + + public AlertDelete(String name){ + super(Alert.AlertType.WARNING); + setTitle("Entfernen"); + setHeaderText("Turnier entfernen?"); + setContentText("Sind Sie sicher, dass sie das Turnier " + name + " entfernen wollen?\n" + + "Nach diesem Vorgang kann es nicht wiederhergestellt werden."); + getButtonTypes().setAll(yesButton, noButton); + } + + public boolean showAndGetResult() { + result = false; + showAndWait().ifPresent(type -> { + if (type == yesButton) { + result = true; + } + }); + return result; + } + + +} 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 new file mode 100644 index 0000000..bcc1109 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/tournamentList/TournamentListController.java @@ -0,0 +1,83 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.tournamentList; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import ch.zhaw.projekt2.turnierverwaltung.FileIO; +import ch.zhaw.projekt2.turnierverwaltung.Tournament; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.*; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.GridPane; + +import java.io.File; +import java.io.IOException; + +public class TournamentListController extends FXController { + + @FXML + public void initialize(){ + modusChoiceBox.setItems(Tournament.Type.getObservableList()); + } + + @FXML + private Button createBtn; + + @FXML + private GridPane grid; + + @FXML + private ChoiceBox modusChoiceBox; + + @FXML + private Label newTournamentFormularTitle; + + @FXML + private Button openBtn; + + @FXML + private Button deleteBtn; + + @FXML + private Label tournamentListTitle; + + @FXML + private ListView tournamentListView; + + @FXML + private Label tournamentModLabel; + + @FXML + private Label tournamentNameLabel; + + @FXML + private TextField tournamentNameField; + + @FXML + void createTournament(ActionEvent event) { + getTournamentDecorator().createTournament(tournamentNameField.getText(), modusChoiceBox.getValue()); + } + + @FXML + void openTournament(ActionEvent event) { + FileIO.TournamentFile tournamentFile = tournamentListView.getSelectionModel().getSelectedItems().get(0); + getFactoryDecorator().openTournament(tournamentFile); + } + + @FXML + void deleteTournament(ActionEvent event) { + FileIO.TournamentFile tournamentFile = tournamentListView.getSelectionModel().getSelectedItems().get(0); + AlertDelete alert = new AlertDelete(tournamentFile.toString()); + if(alert.showAndGetResult()){ + getTournamentDecorator().deleteTournament(tournamentFile); + } + } + + @Override + public void loadContent() { + tournamentListView.setItems(getFileIO().getList()); + tournamentNameField.clear(); + } +} + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/MainWindow.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/MainWindow.fxml new file mode 100644 index 0000000..af04e72 --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/MainWindow.fxml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/Style.css b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/Style.css new file mode 100644 index 0000000..d69b698 --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/Style.css @@ -0,0 +1,10 @@ +#mainContainer { + -fx-min-height: 100%; + -fx-min-width: 100%; + -fx-background-color: #f8f8f8; + +} + +/* +Formular Right Side + */ 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 new file mode 100644 index 0000000..83fcb91 --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + 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 new file mode 100644 index 0000000..cd88c6a --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/participantAddFormular/participantFormular.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/participantAddFormular/participantFormular.fxml new file mode 100644 index 0000000..a5a648a --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/participantAddFormular/participantFormular.fxml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/placesAddFormular/PlacesFormular.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/placesAddFormular/PlacesFormular.fxml new file mode 100644 index 0000000..a0f3acf --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/placesAddFormular/PlacesFormular.fxml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/tournamentList/tournamentList.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/tournamentList/tournamentList.fxml new file mode 100644 index 0000000..40bffeb --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/tournamentList/tournamentList.fxml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/AppTest.java b/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/AppTest.java deleted file mode 100644 index 252063c..0000000 --- a/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/AppTest.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * This Java source file was generated by the Gradle 'init' task. - */ -package ch.zhaw.projekt2.turnierverwaltung; - -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - -class AppTest { - @Test void appHasAGreeting() { - App classUnderTest = new App(); - assertNotNull(classUnderTest.getGreeting(), "app should have a greeting"); - } -} diff --git a/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java b/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java index 8abeecd..09eeef6 100644 --- a/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java +++ b/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java @@ -60,7 +60,7 @@ class FileIOTest { @Test void getList() { - List tournaments = io.getList(); + List tournaments = io.getList(); assertEquals("empty.txt", tournaments.get(0).getName()); assertEquals("test1.txt", tournaments.get(1).getName()); } @@ -108,15 +108,14 @@ class FileIOTest { } @Test - void saveTournament() throws IOException { - Tournament tournament = new Tournament("test1"); + void saveTournament() throws IOException, InvalidNameException, Tournament.InvalidTypeException { + Tournament tournament = null; + tournament = new Tournament("test1", Tournament.Type.KO); io.saveTournament(tournament); File file = new File(mainDir + "/saves/test1.txt"); - if(file.exists()){ - file.delete(); - } else { - fail(); - } + assertTrue(file.exists()); + assertTrue(file.delete()); + assertFalse(file.exists()); } @Test diff --git a/app/src/test/resources/ch/zhaw/projekt2/turnierverwaltung/FileIORead/saves/test1.txt b/app/src/test/resources/ch/zhaw/projekt2/turnierverwaltung/FileIORead/saves/test1.txt index 1053e93..0e0f438 100644 Binary files a/app/src/test/resources/ch/zhaw/projekt2/turnierverwaltung/FileIORead/saves/test1.txt and b/app/src/test/resources/ch/zhaw/projekt2/turnierverwaltung/FileIORead/saves/test1.txt differ