package fetcher.controller; import fetcher.Main; import javafx.event.ActionEvent; import javafx.event.Event; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.layout.VBox; import javafx.stage.*; import java.io.File; import java.io.IOException; /** * This class is the controller for Launcher.fxml. It takes care to handle the new/open pad operations. * Once the user picks one of the two options, the Launcher will provide to open a MainController instance and close its own. */ public class LauncherController { /** * Creates a box where the user can insert the pad name which will be created. * @param event the mouse-click event. */ @FXML public void CreateNewPad(Event event) { Stage stage = getStageFromEvent(event); FileChooser fileChooser = buildFileChooser(); File file = fileChooser.showSaveDialog(stage); if(file != null) startPadMain(file.getAbsolutePath(),stage); } /** * Has the task to open the MainController and close the launcher stage. * @param padName the padName to be passed to the MainController. * @param stage the launcher stage to be closed. */ private void startPadMain(String padName, Stage stage){ final Stage primaryStage = new Stage(StageStyle.DECORATED); FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("/Main.fxml")); primaryStage.setTitle("URL pad"); primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/images/icon.png"))); Parent root = null; try { root = fxmlLoader.load(); } catch (IOException e) { e.printStackTrace(); } MainController controller = fxmlLoader.getController(); controller.setPadName(padName); Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("/styles/style.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { event.consume(); final Stage dialogStage = new Stage(); dialogStage.initModality(Modality.WINDOW_MODAL); VBox vBox = new VBox(); vBox.setAlignment(Pos.CENTER); Button yes = new Button("Yes"); Button no = new Button("No"); final Label label = new Label("Are you sure you want to quit? Any un-saved changes will be lost."); vBox.getChildren().addAll(label,yes,no); yes.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { dialogStage.close(); primaryStage.close(); } }); no.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { dialogStage.close(); } }); dialogStage.setScene(new Scene(vBox)); dialogStage.show(); } }); primaryStage.show(); stage.close(); } /** * Handler when the 'load pad' button is clicked. Opens up a FileChooser open dialog. * @param event the mouse-click event that called this method. */ @FXML public void LoadPadButtonHandler(Event event) { FileChooser fileChooser = buildFileChooser(); fileChooser.setTitle("Open Resource File"); Stage stage = getStageFromEvent(event); File file = fileChooser.showOpenDialog(stage); if(file != null){ if(isValidPad(file)) startPadMain(file.getAbsolutePath(),stage); } } /** * Verifies that the selected file is a correct URL pad generated json file. * @param file the selected file. * @return true if it is a valid pad. */ public boolean isValidPad(File file){ //TODO return true; } /** * Given an event, it returns its Stage. * In our case, we use this to retrieve the stage where the buttons where clicked. * @param event the event. * @return the Stage given an event. */ private Stage getStageFromEvent(Event event){ return (Stage)((Node)event.getSource()).getScene().getWindow(); } /** * Builds a FileChooser with a json extension filter. * @return a FileChooser with a json extension filter. */ private FileChooser buildFileChooser(){ FileChooser fileChooser = new FileChooser(); fileChooser.setInitialDirectory(new File(".")); FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON files (*.json)", "*.json"); fileChooser.getExtensionFilters().add(extFilter); return fileChooser; } }