diff --git a/app/src/main/java/com/annimon/hotarufx/io/DocumentManager.java b/app/src/main/java/com/annimon/hotarufx/io/DocumentManager.java index 2836f9f..bb97cb0 100644 --- a/app/src/main/java/com/annimon/hotarufx/io/DocumentManager.java +++ b/app/src/main/java/com/annimon/hotarufx/io/DocumentManager.java @@ -2,6 +2,7 @@ package com.annimon.hotarufx.io; import java.util.Optional; import java.util.function.Consumer; +import java.util.function.Supplier; import javafx.stage.Stage; public interface DocumentManager { @@ -12,6 +13,10 @@ public interface DocumentManager { boolean open(Stage stage, Consumer contentConsumer); + boolean save(Stage stage, Supplier contentSupplier); + + boolean saveAs(Stage stage, Supplier contentSupplier); + void addDocumentListener(DocumentListener listener); } diff --git a/app/src/main/java/com/annimon/hotarufx/io/FileManager.java b/app/src/main/java/com/annimon/hotarufx/io/FileManager.java index 598ba32..c0f956e 100644 --- a/app/src/main/java/com/annimon/hotarufx/io/FileManager.java +++ b/app/src/main/java/com/annimon/hotarufx/io/FileManager.java @@ -2,10 +2,15 @@ package com.annimon.hotarufx.io; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.util.Optional; import java.util.function.Consumer; +import java.util.function.Supplier; import javafx.stage.FileChooser; import javafx.stage.Stage; import lombok.val; @@ -13,6 +18,7 @@ import lombok.val; public class FileManager implements DocumentManager { private static final String FILE_OPEN_TITLE = "Select file to open"; + private static final String FILE_SAVE_TITLE = "Save file"; private final FileChooser fileChooser; private File currentFile; private DocumentListener listener; @@ -57,6 +63,28 @@ public class FileManager implements DocumentManager { return true; } + @Override + public boolean save(Stage stage, Supplier contentSupplier) { + if (currentFile == null) { + return saveAs(stage, contentSupplier); + } + return writeFile(currentFile, contentSupplier); + } + + @Override + public boolean saveAs(Stage stage, Supplier contentSupplier) { + fileChooser.setTitle(FILE_SAVE_TITLE); + if (currentFile != null) { + fileChooser.setInitialDirectory(currentFile.getParentFile()); + } + val newFile = fileChooser.showSaveDialog(stage); + if (newFile == null) { + return false; + } + currentFile = newFile; + return writeFile(currentFile, contentSupplier); + } + @Override public void addDocumentListener(DocumentListener listener) { this.listener = listener; @@ -72,4 +100,18 @@ public class FileManager implements DocumentManager { return ""; } } + + private boolean writeFile(File file, Supplier contentSupplier) { + try (OutputStream os = new FileOutputStream(file); + Writer writer = new OutputStreamWriter(os, "UTF-8")) { + writer.write(contentSupplier.get()); + writer.flush(); + return true; + } catch (IOException ioe) { + if (listener != null) { + listener.logError("Unable to save file " + file.getName()); + } + return false; + } + } } diff --git a/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java b/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java index 7ed035b..6b7afd2 100644 --- a/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java +++ b/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java @@ -59,6 +59,18 @@ public class EditorController implements Initializable, DocumentListener { } } + @FXML + private void handleMenuSave(ActionEvent event) { + documentManager.save(primaryStage, editor::getText); + updateTitle(); + } + + @FXML + private void handleMenuSaveAs(ActionEvent event) { + documentManager.saveAs(primaryStage, editor::getText); + updateTitle(); + } + private void updateTitle() { primaryStage.setTitle( documentManager.name().orElse("HotaruFX")); diff --git a/app/src/main/resources/fxml/Editor.fxml b/app/src/main/resources/fxml/Editor.fxml index 13427eb..acd2e34 100644 --- a/app/src/main/resources/fxml/Editor.fxml +++ b/app/src/main/resources/fxml/Editor.fxml @@ -23,6 +23,8 @@ + +