From 02832b9010d26c33771c36515b0d032c4e2010e9 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 12 Feb 2017 16:21:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=80=E5=87=BA=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ui/MainApplication.java | 46 ++++++++++++++++--- .../impl/ui/TranslateWindow.java | 39 +++++++++------- .../maptranslator/ui/OriginalTextsWindow.css | 2 +- .../to2mbn/maptranslator/ui/lang.properties | 3 ++ .../maptranslator/ui/lang_zh_CN.properties | 3 ++ 5 files changed, 69 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/to2mbn/maptranslator/impl/ui/MainApplication.java b/src/main/java/org/to2mbn/maptranslator/impl/ui/MainApplication.java index 81bad46..d4ced6c 100644 --- a/src/main/java/org/to2mbn/maptranslator/impl/ui/MainApplication.java +++ b/src/main/java/org/to2mbn/maptranslator/impl/ui/MainApplication.java @@ -12,8 +12,13 @@ import org.to2mbn.maptranslator.model.ParsingWarning; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; +import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.Label; import javafx.stage.DirectoryChooser; +import javafx.stage.WindowEvent; class MainApplication { @@ -52,9 +57,9 @@ private void initUI() { originalTextsWindow = new OriginalTextsWindow(); translateWindow = new TranslateWindow(); nbtWindow = new NBTExplorerWindow(); - originalTextsWindow.stage.setOnCloseRequest(event -> exit()); - translateWindow.stage.setOnCloseRequest(event -> exit()); - nbtWindow.stage.setOnCloseRequest(event -> exit()); + originalTextsWindow.stage.setOnCloseRequest(this::exit); + translateWindow.stage.setOnCloseRequest(this::exit); + nbtWindow.stage.setOnCloseRequest(this::exit); translateWindow.onAdded = originalTextsWindow::onStringAddedToTranslate; translateWindow.onRemoved = originalTextsWindow::onStringRemovedFromTranslate; @@ -107,11 +112,38 @@ private void initUI() { nbtWindow.stage.show(); } + private void exit(WindowEvent e) { + e.consume(); + exit(); + } + private void exit() { - handler.close(); - translateWindow.stage.close(); - originalTextsWindow.stage.close(); - nbtWindow.stage.close(); + if (translateWindow.warnExit()) { + Alert alert = new Alert(AlertType.WARNING, "", ButtonType.NO, ButtonType.YES); + ((Button) alert.getDialogPane().lookupButton(ButtonType.YES)).setDefaultButton(false); + ((Button) alert.getDialogPane().lookupButton(ButtonType.NO)).setDefaultButton(true); + alert.setTitle(translate("exit_confirmation.title")); + alert.setHeaderText(translate("exit_confirmation.header")); + alert.getDialogPane().setContent(new Label(translate("exit_confirmation.content"))); + alert.setOnHidden(event -> { + if (alert.getResult() == ButtonType.YES) { + doExit(); + } + }); + alert.show(); + } else { + doExit(); + } + } + + private void doExit() { + Platform.runLater(() -> { + translateWindow.stage.close(); + originalTextsWindow.stage.close(); + nbtWindow.stage.close(); + handler.close(); + Platform.exit(); + }); } private void showParsingWarnings() { diff --git a/src/main/java/org/to2mbn/maptranslator/impl/ui/TranslateWindow.java b/src/main/java/org/to2mbn/maptranslator/impl/ui/TranslateWindow.java index 28dc6c2..b0cfc08 100644 --- a/src/main/java/org/to2mbn/maptranslator/impl/ui/TranslateWindow.java +++ b/src/main/java/org/to2mbn/maptranslator/impl/ui/TranslateWindow.java @@ -12,6 +12,8 @@ import java.io.Reader; import java.io.UncheckedIOException; import java.io.Writer; +import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -56,6 +58,7 @@ public static class TranslateEntry { private Button btnApply; private TableColumn colOrigin; private TableColumn colTarget; + private volatile Map lastStoredData = Collections.emptyMap(); public Consumer onTextDbclick; public Consumer onAdded; @@ -113,13 +116,7 @@ public TranslateWindow() { btnApply.setOnAction(event -> applier.accept(toTranslateTable())); btnExport.setOnAction(event -> exportData(toTranslateTable())); - btnImport.setOnAction(event -> importData() - .thenAcceptAsync(result -> { - if (result != null) { - result.forEach((k, v) -> importEntry(k, v)); - } - }, Platform::runLater) - .exceptionally(reportException)); + btnImport.setOnAction(event -> importData()); } private Map toTranslateTable() { @@ -174,6 +171,10 @@ public boolean isStringTranslated(String str) { return false; } + public boolean warnExit(){ + return !entries.isEmpty() && !toTranslateTable().equals(lastStoredData); + } + private void exportData(Map data) { FileChooser chooser = new FileChooser(); chooser.setTitle(translate("translate.export")); @@ -192,21 +193,23 @@ private void exportData(Map data) { }) .handleAsync((result, err) -> { progressWindow().hide(); - if (err != null) { + if (err == null) { + lastStoredData = new HashMap<>(data); + } else { reportException(err); } return null; }, Platform::runLater); } - private CompletableFuture> importData() { + private void importData() { FileChooser chooser = new FileChooser(); chooser.setTitle(translate("translate.import")); chooser.setSelectedExtensionFilter(new ExtensionFilter("*.json", "*.json")); File target = chooser.showOpenDialog(stage); - if (target == null) return CompletableFuture.completedFuture(null); + if (target == null) return; progressWindow().show(false); - return CompletableFuture + CompletableFuture .supplyAsync(() -> { try (Reader reader = new InputStreamReader(new FileInputStream(target), "UTF-8")) { return new JSONObject(new JSONTokener(reader)); @@ -217,16 +220,20 @@ private CompletableFuture> importData() { .handleAsync((result, err) -> { progressWindow().hide(); if (err == null) { + Map mapping = new LinkedHashMap<>(); - for (String key : result.keySet()) { + for (String key : result.keySet()) mapping.put(key, result.getString(key)); - } - return mapping; + mapping.forEach((k, v) -> importEntry(k, v)); + if (toTranslateTable().equals(mapping)) + lastStoredData = new HashMap<>(mapping); + } else { reportException(err); - return null; } - }, Platform::runLater); + return null; + }, Platform::runLater) + .exceptionally(reportException); } } diff --git a/src/main/resources/org/to2mbn/maptranslator/ui/OriginalTextsWindow.css b/src/main/resources/org/to2mbn/maptranslator/ui/OriginalTextsWindow.css index 54db941..675fe63 100644 --- a/src/main/resources/org/to2mbn/maptranslator/ui/OriginalTextsWindow.css +++ b/src/main/resources/org/to2mbn/maptranslator/ui/OriginalTextsWindow.css @@ -8,4 +8,4 @@ .errorregex { -fx-background-color: #ff6347; -} \ No newline at end of file +} diff --git a/src/main/resources/org/to2mbn/maptranslator/ui/lang.properties b/src/main/resources/org/to2mbn/maptranslator/ui/lang.properties index 9f006d8..1619713 100644 --- a/src/main/resources/org/to2mbn/maptranslator/ui/lang.properties +++ b/src/main/resources/org/to2mbn/maptranslator/ui/lang.properties @@ -44,3 +44,6 @@ menu.copy=Copy node_edit.title=Edit node... node_edit.reset=Reset to original value node_edit.submit=Submit +exit_confirmation.title=Changes detected +exit_confirmation.header=Are you sure you want to exit? +exit_confirmation.content=If you don't export your translations, they will be lost. diff --git a/src/main/resources/org/to2mbn/maptranslator/ui/lang_zh_CN.properties b/src/main/resources/org/to2mbn/maptranslator/ui/lang_zh_CN.properties index 2d6ef9b..439de8a 100644 --- a/src/main/resources/org/to2mbn/maptranslator/ui/lang_zh_CN.properties +++ b/src/main/resources/org/to2mbn/maptranslator/ui/lang_zh_CN.properties @@ -44,3 +44,6 @@ menu.copy=\u590D\u5236 node_edit.title=\u7F16\u8F91\u8282\u70B9... node_edit.reset=\u91CD\u7F6E\u4E3A\u539F\u59CB\u503C node_edit.submit=\u63D0\u4EA4 +exit_confirmation.title=\u68C0\u6D4B\u5230\u53D8\u66F4 +exit_confirmation.header=\u60A8\u786E\u5B9A\u8981\u9000\u51FA\u5417\uFF1F +exit_confirmation.content=\u5982\u679C\u60A8\u4E0D\u5BFC\u51FA\u60A8\u7684\u7FFB\u8BD1\uFF0C\u5B83\u4EEC\u5C06\u4E22\u5931\u3002