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:
parent
141dae5379
commit
2886e7f548
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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"));
|
||||
|
@ -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">
|
||||
|
Loading…
Reference in New Issue
Block a user