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.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
public interface DocumentManager {
|
public interface DocumentManager {
|
||||||
@ -12,6 +13,10 @@ public interface DocumentManager {
|
|||||||
|
|
||||||
boolean open(Stage stage, Consumer<String> contentConsumer);
|
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);
|
void addDocumentListener(DocumentListener listener);
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,15 @@ package com.annimon.hotarufx.io;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.Writer;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
import javafx.stage.FileChooser;
|
import javafx.stage.FileChooser;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import lombok.val;
|
import lombok.val;
|
||||||
@ -13,6 +18,7 @@ import lombok.val;
|
|||||||
public class FileManager implements DocumentManager {
|
public class FileManager implements DocumentManager {
|
||||||
|
|
||||||
private static final String FILE_OPEN_TITLE = "Select file to open";
|
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 final FileChooser fileChooser;
|
||||||
private File currentFile;
|
private File currentFile;
|
||||||
private DocumentListener listener;
|
private DocumentListener listener;
|
||||||
@ -57,6 +63,28 @@ public class FileManager implements DocumentManager {
|
|||||||
return true;
|
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
|
@Override
|
||||||
public void addDocumentListener(DocumentListener listener) {
|
public void addDocumentListener(DocumentListener listener) {
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
@ -72,4 +100,18 @@ public class FileManager implements DocumentManager {
|
|||||||
return "";
|
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() {
|
private void updateTitle() {
|
||||||
primaryStage.setTitle(
|
primaryStage.setTitle(
|
||||||
documentManager.name().orElse("HotaruFX"));
|
documentManager.name().orElse("HotaruFX"));
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
<Menu mnemonicParsing="false" text="File">
|
<Menu mnemonicParsing="false" text="File">
|
||||||
<MenuItem onAction="#handleMenuNew" text="New"/>
|
<MenuItem onAction="#handleMenuNew" text="New"/>
|
||||||
<MenuItem onAction="#handleMenuOpen" text="Open"/>
|
<MenuItem onAction="#handleMenuOpen" text="Open"/>
|
||||||
|
<MenuItem onAction="#handleMenuSave" text="Save"/>
|
||||||
|
<MenuItem onAction="#handleMenuSaveAs" text="Save As"/>
|
||||||
<MenuItem onAction="#handleMenuExit" text="Exit"/>
|
<MenuItem onAction="#handleMenuExit" text="Exit"/>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Menu mnemonicParsing="false" text="Composition">
|
<Menu mnemonicParsing="false" text="Composition">
|
||||||
|
Loading…
Reference in New Issue
Block a user