1
0
mirror of https://github.com/aNNiMON/HotaruFX.git synced 2024-09-19 14:14:21 +03:00

Ability to save documents

This commit is contained in:
Victor 2017-09-06 11:48:37 +03:00
parent 141dae5379
commit 2886e7f548
4 changed files with 61 additions and 0 deletions

View File

@ -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<String> contentConsumer);
boolean save(Stage stage, Supplier<String> contentSupplier);
boolean saveAs(Stage stage, Supplier<String> contentSupplier);
void addDocumentListener(DocumentListener listener);
}

View File

@ -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<String> contentSupplier) {
if (currentFile == null) {
return saveAs(stage, contentSupplier);
}
return writeFile(currentFile, contentSupplier);
}
@Override
public boolean saveAs(Stage stage, Supplier<String> 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<String> 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;
}
}
}

View File

@ -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"));

View File

@ -23,6 +23,8 @@
<Menu mnemonicParsing="false" text="File">
<MenuItem onAction="#handleMenuNew" text="New"/>
<MenuItem onAction="#handleMenuOpen" text="Open"/>
<MenuItem onAction="#handleMenuSave" text="Save"/>
<MenuItem onAction="#handleMenuSaveAs" text="Save As"/>
<MenuItem onAction="#handleMenuExit" text="Exit"/>
</Menu>
<Menu mnemonicParsing="false" text="Composition">