diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java index 438092c0968b2bfecaf8abb643c0d0ca39571fae..0dbc75472000dc13bfe4966a41d26aad801d7523 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java @@ -248,7 +248,7 @@ public class ChartController implements Refreshable, Styleable @Override public void refresh() { - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_CHARTS), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_CHARTS), controller.getStage(), controller.getIcon()); // prepare chart categories LocalDate startDate = LocalDate.parse(controller.getCurrentDate().withDayOfMonth(1).toString("yyyy-MM-dd")); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java index a00ef6b5ff352e61cedce30e8a9d3b3085b74556..70b3dc0f3872eca0f879618a16d0542969cc9bf6 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java @@ -631,7 +631,7 @@ public class Controller extends BaseController Optional<ButtonType> result = alert.showAndWait(); if (result.get() == buttonTypeOne) { - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), getStage(), icon); + LoadingModal.showModal(this, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), getStage(), icon); Worker.runLater(() -> { try @@ -797,7 +797,7 @@ public class Controller extends BaseController { Logger.debug("Starting main refresh..."); Platform.runLater(()->{ - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATA), getStage(), icon); + LoadingModal.showModal(this, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATA), getStage(), icon); }); Worker.runLater(() -> { diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java index 3d511ac6f7f9ea1b69748de6919ece814f26caa9..8ef7e2be2afc81f503ea92d4b8268e1fd37cbe60 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java @@ -225,7 +225,7 @@ public class ExportChartController extends BaseController implements Styleable alert.setTitle(Localization.getString(Strings.INFO_TITLE_CHART_EXPORT)); alert.initOwner(controller.getController().getStage()); alert.setHeaderText(""); - alert.setContentText(Localization.getString(Strings.INFO_TEXT_CHART_EXPORT)); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_CHART_EXPORT)); Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); dialogStage.getIcons().add(controller.getController().getIcon()); diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java index 1497da495769c9df7a64ec507eb0a360c8f9e264..24545fc527f779015893d6de00850a10934efaa4 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java @@ -1,17 +1,60 @@ package de.deadlocker8.budgetmasterclient.ui.controller; +import java.util.Optional; + +import de.deadlocker8.budgetmaster.logic.utils.Strings; import javafx.fxml.FXML; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; import javafx.scene.control.Label; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.stage.Modality; import javafx.stage.Stage; +import javafx.stage.WindowEvent; +import logger.Logger; +import tools.Localization; public class ModalController { @FXML private Label labelMessage; + private Alert alert; - public void init(Stage stage, String message) + public void init(Controller controller, Stage stage, String message) { labelMessage.setText(message); stage.setOnCloseRequest((e)->{ + alert = new Alert(AlertType.CONFIRMATION); + alert.setTitle(Localization.getString(Strings.INFO_TITLE_SHUTDOWN)); + alert.initModality(Modality.APPLICATION_MODAL); + alert.initOwner(controller.getStage()); + alert.setHeaderText(""); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_SHUTDOWN)); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + + ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.CANCEL)); + ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.OK)); + alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo); + + DialogPane dialogPane = alert.getDialogPane(); + dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> { + if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button) + { + ((Button)event.getTarget()).fire(); + } + })); + + Optional<ButtonType> result = alert.showAndWait(); + if (result.get() == buttonTypeTwo) + { + Logger.debug("Shutting down during operation due to client request..."); + controller.getStage().fireEvent(new WindowEvent(controller.getStage(), WindowEvent.WINDOW_CLOSE_REQUEST)); + } + e.consume(); }); } @@ -20,4 +63,13 @@ public class ModalController { labelMessage.setText(message); } + + public void closeAlert() + { + if(alert != null && alert.isShowing()) + { + Button cancelButton = ( Button ) alert.getDialogPane().lookupButton(alert.getButtonTypes().get(0)); + cancelButton.fire(); + } + } } \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java index 2442ef3037439f8d39068adacf09da61e5cb8574..e9fb0cd84fdb15adef6cadef08153758a7532801 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java @@ -653,7 +653,7 @@ public class ReportController implements Refreshable, Styleable controller.getCurrentDate(), budget); - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT), controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try @@ -758,7 +758,7 @@ public class ReportController implements Refreshable, Styleable @Override public void refresh() { - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT_TAB), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT_TAB), controller.getStage(), controller.getIcon()); if(controller.getFilterSettings().equals(new FilterSettings())) { diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java index 358adb7ca1c3c8d150ee4fc106a1cd0784fa7e59..930d015ae397027f02532bc5fd8beceeb41f4435 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java @@ -262,7 +262,7 @@ public class SearchController extends BaseController implements Styleable searchPreferences.setMinAmount((int)rangeSlider.getLowValue()); searchPreferences.setMaxAmount((int)rangeSlider.getHighValue()); - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_SEARCH), getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_SEARCH), getStage(), controller.getIcon()); Worker.runLater(() -> { try diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java index 13d19c2af2c14cac122213e51cb916ab5ae6f2cd..9e6bac83928748efee2fe1e8ff9a46cc3e29f6e1 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java @@ -148,7 +148,7 @@ public class LocalServerSettingsController extends SettingsController break; case INACTIVE: Platform.runLater(()->{ - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); }); labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_NOT_STARTED)); buttonLocalServerAction.setVisible(false); @@ -237,7 +237,7 @@ public class LocalServerSettingsController extends SettingsController buttonLocalServerAction.setOnAction((event) -> { buttonLocalServerAction.setDisable(true); - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try @@ -356,7 +356,7 @@ public class LocalServerSettingsController extends SettingsController buttonLocalServerAction.setOnAction((event) -> { buttonLocalServerAction.setDisable(true); - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java index 8d17b1817bc8e4913aeebfe70d27294c0ba00c65..4587fa30d3ceb2d958abe8d61f6a24210ba638f8 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java @@ -44,7 +44,7 @@ public class DatabaseDeleter { if(result.get().equals(verificationCode)) { - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java index 59904cd95c2094df5f75cf6cedf0f6198b595664..8a92711fc41b4daaa7ff32f334a8b584a284ac1b 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java @@ -33,7 +33,7 @@ public class DatabaseExporter File file = fileChooser.showSaveDialog(controller.getStage()); if(file != null) { - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java index bfbca38196c60c51b653f13268b42b83c7c60442..5afaa36e65b478a165899f736ccbe46bf6ac2417 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java @@ -114,7 +114,7 @@ public class DatabaseImporter return; } - LoadingModal.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon()); + LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java index 9c413bbe85e19e849b6c5af25076713ddda4d6e0..748c5ee5e3c9144f5a62db145b0670a1b64a60e3 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java @@ -3,6 +3,7 @@ package de.deadlocker8.budgetmasterclient.utils; import java.io.IOException; import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; import de.deadlocker8.budgetmasterclient.ui.controller.ModalController; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -18,10 +19,10 @@ public class LoadingModal private static Stage modalStage; private static ModalController modalController; - public static void showModal(String title, String message, Stage owner, Image icon) + public static void showModal(Controller controller, String title, String message, Stage owner, Image icon) { closeModal(); - modalStage = createModal(title, message, owner, icon); + modalStage = createModal(controller, title, message, owner, icon); } public static void setMessage(String message) @@ -36,6 +37,7 @@ public class LoadingModal { if(modalStage != null) { + modalController.closeAlert(); modalStage.close(); modalStage = null; modalController = null; @@ -47,7 +49,7 @@ public class LoadingModal return modalStage != null && modalStage.isShowing(); } - private static Stage createModal(String title, String message, Stage owner, Image icon) + private static Stage createModal(Controller controller, String title, String message, Stage owner, Image icon) { try { @@ -61,9 +63,8 @@ public class LoadingModal newStage.setScene(new Scene(root)); newStage.getIcons().add(icon); newStage.setResizable(false); - newStage.setAlwaysOnTop(true); modalController = fxmlLoader.getController(); - modalController.init(newStage, message); + modalController.init(controller, newStage, message); newStage.show(); return newStage; diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties index dc9b1dbf266e3240d345c4edd1d46c620fecfbb5..3161b37ad8f0fa464426c4cccbfdf64ecda45012 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties @@ -168,6 +168,8 @@ info.title.start.after.update=Update erfolgreich info.header.text.start.after.update=BudgetMaster wurde erfolgreich auf Version {0} aktualisiert info.text.start.after.update=Hinweis: Der BudgetMasterServer muss manuell von dir geupdated werden, sofern es sich um keinen lokalen Server handelt! info.tags=Es erscheinen Vorschl�ge basierend auf bereits verwendeten Tags sobald du zu tippen beginnst.\n\nEnter - F�gt den Inhalt des Eingabefelds als neuen Tag hinzu.\nPfeil nach unten - �ffnet die Vorschl�ge, wenn das Eingabefeld leer ist. +info.title.shutdown=BudgetMaster beenden +info.text.shutdown=M�chtest du BudgetMaster wirklich beenden?\nDies kann w�hrend der Ausf�hrung von Aufgaben zu unvorhersebaren Konsequenzen f�hren. # WARNING warning.enddate.before.startdate=Das Enddatum darf zeitlich nicht vor dem Startdatum liegen. diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties index 40341ea54cbb44a274dd88ca1392151c320e5706..d5ad30110d1e7d9b23000c0fbed2de8b65fbcaf9 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties @@ -164,10 +164,12 @@ info.text.update.available=An update is available.\nNew version: {0}\n\n info.text.update.available.show.changes=Show Changes (opens web browsers) info.text.update.available.show.changes.detailed=(detailed information on GitHub.com) info.text.update.available.now=Update Now -info.title.start.after.update=Update successfull +info.title.start.after.update=Update successful info.header.text.start.after.update=Successfully updated BudgetMaster to version {0} info.text.start.after.update=Note: You have to update the BudgetMasterServer manually, if it's no local server! info.tags=Suggestions based on already used tags will show up once you start typing.\n\nEnter - Appends the current input field content as a new tag.\nArrow Down - Opens the suggestions if the input field is empty. +info.title.shutdown=Shutdown BudgetMaster +info.text.shutdown=Do you really want to shutdown BudgetMaster? This could lead to unforeseen consequences during running tasks. # WARNING warning.enddate.before.startdate=The end date can not be earlier than the start date. diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml index 77b86bc0a1dc9b58c5bec77965f3fbcbdb01f77e..ca9b183198ecf89773c26959b7f3f9197bba468f 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml @@ -6,7 +6,7 @@ <?import javafx.scene.layout.HBox?> <?import javafx.scene.text.Font?> -<AnchorPane fx:id="anchorPaneMain" prefHeight="100.0" prefWidth="375.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.ModalController"> +<AnchorPane fx:id="anchorPaneMain" prefHeight="100.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.ModalController"> <children> <HBox alignment="CENTER_LEFT" spacing="10.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> <children> diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java index 3ff6304afffd9a13e9da06610fb59fb3aaccfc1a..f972c712be2f5f9f468811e9f1fa4a1a3bdf68c5 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java @@ -172,6 +172,8 @@ public class Strings public static final String INFO_HEADER_TEXT_START_AFTER_UPDATE = "info.header.text.start.after.update"; public static final String INFO_TEXT_START_AFTER_UPDATE = "info.text.start.after.update"; public static final String INFO_TAGS = "info.tags"; + public static final String INFO_TITLE_SHUTDOWN = "info.title.shutdown"; + public static final String INFO_TEXT_SHUTDOWN = "info.text.shutdown"; //WARNING public static final String WARNING_ENDDATE_BEFORE_STARTDATE = "warning.enddate.before.startdate";