package AdventureGameViews; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import javafx.scene.text.Font; import javafx.stage.Modality; import javafx.stage.Stage; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; /** * Class SaveView * * Saves Serialized adventure games */ public class SaveView { // labels to print upon certain events static String saveFileSuccess = "Saved Adventure Game!"; static String saveFileExistsError = "Error: File already exists"; static String saveFileNotSerError = "Error: File must end with .ser"; private Label saveFileErrorLabel = new Label(""); private Label saveGameLabel = new Label(String.format("Enter name of file to save")); private TextField saveFileNameTextField = new TextField(""); // textField for player to type in private Button saveGameButton = new Button("Save Game"); // button for saving the game private Button closeWindowButton = new Button("Close Window"); // button for closing save view private AdventureGameView adventureGameView; /** * Constructor */ public SaveView(AdventureGameView adventureGameView) { this.adventureGameView = adventureGameView; final Stage dialog = new Stage(); dialog.initModality(Modality.APPLICATION_MODAL); dialog.initOwner(adventureGameView.stage); VBox dialogVbox = new VBox(20); dialogVbox.setPadding(new Insets(20, 20, 20, 20)); dialogVbox.setStyle("-fx-background-color: #121212;"); saveGameLabel.setId("SaveGame"); saveFileErrorLabel.setId("SaveFileErrorLabel"); saveFileNameTextField.setId("SaveFileNameTextField"); saveGameLabel.setStyle("-fx-text-fill: #e8e6e3;"); saveGameLabel.setFont(new Font(16)); saveFileErrorLabel.setStyle("-fx-text-fill: #e8e6e3;"); saveFileErrorLabel.setFont(new Font(16)); saveFileNameTextField.setStyle("-fx-text-fill: #000000;"); saveFileNameTextField.setFont(new Font(16)); String gameName = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date()) + ".ser"; saveFileNameTextField.setText(gameName); saveGameButton = new Button("Save board"); saveGameButton.setId("SaveBoardButton"); saveGameButton.setStyle("-fx-background-color: #17871b; -fx-text-fill: white;"); saveGameButton.setPrefSize(200, 50); saveGameButton.setFont(new Font(16)); AdventureGameView.makeButtonAccessible(saveGameButton, "save game", "This is a button to save the game", "Use this button to save the current game."); saveGameButton.setOnAction(e -> saveGame()); closeWindowButton = new Button("Close Window"); closeWindowButton.setId("closeWindowButton"); closeWindowButton.setStyle("-fx-background-color: #17871b; -fx-text-fill: white;"); closeWindowButton.setPrefSize(200, 50); closeWindowButton.setFont(new Font(16)); closeWindowButton.setOnAction(e -> dialog.close()); AdventureGameView.makeButtonAccessible(closeWindowButton, "close window", "This is a button to close the save game window", "Use this button to close the save game window."); VBox saveGameBox = new VBox(10, saveGameLabel, saveFileNameTextField, saveGameButton, saveFileErrorLabel, closeWindowButton); saveGameBox.setAlignment(Pos.CENTER); dialogVbox.getChildren().add(saveGameBox); Scene dialogScene = new Scene(dialogVbox, 400, 400); dialog.setScene(dialogScene); dialog.show(); } /** * Saves the Game * Saves the game to a serialized (binary) file. * Gets the name of the file from saveFileNameTextField. * Files will be saved to the SavedGames directory. * If the file already exists, sets the saveFileErrorLabel to the text in saveFileExistsError * If the file doesn't end in .ser, set the saveFileErrorLabel to the text in saveFileNotSerError * Otherwise, load the file and set the saveFileErrorLabel to the text in saveFileSuccess */ private void saveGame() { // grab users name for the file, set it to the directory String fileName = this.saveFileNameTextField.getText(); String wantDirectory = "SavedGames"; File actualFile = new File(wantDirectory, fileName); // three conditions, if exists/if not ending in .ser and otherwise no issues. file name cannot be blank if (actualFile.exists()) { this.saveFileErrorLabel.setText(saveFileExistsError); } else if (!fileName.endsWith(".ser")) { this.saveFileErrorLabel.setText(saveFileNotSerError); } else { this.adventureGameView.model.saveModel(actualFile); this.saveFileErrorLabel.setText(saveFileSuccess); } } }