diff --git a/src/de/deadlocker8/budgetmaster/logic/Helpers.java b/src/de/deadlocker8/budgetmaster/logic/Helpers.java index 9190df3577db8a5f28558da7a167bc9e24489ed6..79ea1806e978a24e15787b5d9b3e7e6d72bd87f3 100644 --- a/src/de/deadlocker8/budgetmaster/logic/Helpers.java +++ b/src/de/deadlocker8/budgetmaster/logic/Helpers.java @@ -1,5 +1,6 @@ package de.deadlocker8.budgetmaster.logic; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.DecimalFormat; @@ -7,6 +8,15 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import de.deadlocker8.budgetmaster.ui.ModalController; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.stage.Modality; +import javafx.stage.Stage; +import logger.Logger; + public class Helpers { public static final DecimalFormat NUMBER_FORMAT = new DecimalFormat("0.00"); @@ -64,4 +74,30 @@ public class Helpers } return years; } + + public static Stage showModal(String title, String message, Stage owner, Image icon) + { + try + { + FXMLLoader fxmlLoader = new FXMLLoader(Helpers.class.getResource("/de/deadlocker8/budgetmaster/ui/Modal.fxml")); + Parent root = (Parent)fxmlLoader.load(); + Stage newStage = new Stage(); + newStage.initOwner(owner); + newStage.initModality(Modality.APPLICATION_MODAL); + newStage.setTitle(title); + newStage.setScene(new Scene(root)); + newStage.getIcons().add(icon); + newStage.setResizable(false); + ModalController newController = fxmlLoader.getController(); + newController.init(newStage, message); + newStage.show(); + + return newStage; + } + catch(IOException e) + { + Logger.error(e); + return null; + } + } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java index 8443d3fe84ee30432e7aa18f0aef4b840e1e7cd6..90b430b267293752d4e351a597bfe217db6d3f36 100644 --- a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java +++ b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java @@ -29,7 +29,7 @@ public class ServerConnection private Gson gson; public ServerConnection(Settings settings) throws Exception - { + { this.settings = settings; this.gson = new Gson(); diff --git a/src/de/deadlocker8/budgetmaster/ui/ChartController.java b/src/de/deadlocker8/budgetmaster/ui/ChartController.java index 6a0367b5fe2238f186d84baa63e081aa6d2cfc51..0a7b9546166a78b32d58e7a178c3108733318881 100644 --- a/src/de/deadlocker8/budgetmaster/ui/ChartController.java +++ b/src/de/deadlocker8/budgetmaster/ui/ChartController.java @@ -16,6 +16,7 @@ import de.deadlocker8.budgetmaster.logic.chartGenerators.LineChartGenerator; import de.deadlocker8.budgetmaster.logic.chartGenerators.MonthChartGenerator; import fontAwesome.FontIcon; import fontAwesome.FontIconType; +import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.geometry.Insets; @@ -36,9 +37,11 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; +import javafx.stage.Stage; import javafx.util.Callback; import logger.Logger; import tools.AlertGenerator; +import tools.Worker; public class ChartController implements Refreshable { @@ -124,30 +127,36 @@ public class ChartController implements Refreshable ServerConnection connection = new ServerConnection(controller.getSettings()); ArrayList<CategoryInOutSum> sums = connection.getCategoryInOutSumForMonth(startDate, endDate); - vboxChartCategories.getChildren().clear(); - - CategoriesChartGenerator generator = new CategoriesChartGenerator("Einnahmen nach Kategorien", sums, true, controller.getSettings().getCurrency()); - vboxChartCategories.getChildren().add(generator.generate()); - generator = new CategoriesChartGenerator("Ausgaben nach Kategorien", sums, false, controller.getSettings().getCurrency()); - vboxChartCategories.getChildren().add(generator.generate()); - - Region spacer = new Region(); - vboxChartCategories.getChildren().add(spacer); - VBox.setVgrow(spacer, Priority.ALWAYS); - - vboxChartCategories.getChildren().add(generator.generateLegend()); + Platform.runLater(()->{ + vboxChartCategories.getChildren().clear(); + + CategoriesChartGenerator generator = new CategoriesChartGenerator("Einnahmen nach Kategorien", sums, true, controller.getSettings().getCurrency()); + vboxChartCategories.getChildren().add(generator.generate()); + generator = new CategoriesChartGenerator("Ausgaben nach Kategorien", sums, false, controller.getSettings().getCurrency()); + vboxChartCategories.getChildren().add(generator.generate()); + + Region spacer = new Region(); + vboxChartCategories.getChildren().add(spacer); + VBox.setVgrow(spacer, Priority.ALWAYS); + + vboxChartCategories.getChildren().add(generator.generateLegend()); + }); } catch(Exception e) { Logger.error(e); - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + Platform.runLater(()->{ + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); } } public void chartMonthShow() { - vboxChartMonth.getChildren().clear(); - + Platform.runLater(()->{ + vboxChartMonth.getChildren().clear(); + }); + String startMonth = comboBoxStartMonth.getValue(); String startYear = comboBoxStartYear.getValue(); String endMonth = comboBoxEndMonth.getValue(); @@ -160,68 +169,84 @@ public class ChartController implements Refreshable DateTime endDate = DateTime.parse(endDateString, DateTimeFormat.forPattern("dd-MMMM-YYYY")); if(endDate.isBefore(startDate)) - { - AlertGenerator.showAlert(AlertType.WARNING, "Warnung", "", "Das Enddatum darf nicht vor dem Startdatum liegen.", controller.getIcon(), controller.getStage(), null, false); + { + Platform.runLater(()->{ + AlertGenerator.showAlert(AlertType.WARNING, "Warnung", "", "Das Enddatum darf nicht vor dem Startdatum liegen.", controller.getIcon(), controller.getStage(), null, false); + }); return; - } + } try { ServerConnection connection = new ServerConnection(controller.getSettings()); ArrayList<MonthInOutSum> sums = connection.getMonthInOutSum(startDate, endDate); - vboxChartMonth.getChildren().clear(); - - if(radioButtonBars.isSelected()) - { - ScrollPane scrollPane = new ScrollPane(); - scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER); - scrollPane.setFocusTraversable(false); - scrollPane.setStyle("-fx-background-color: transparent; -fx-background-insets: 0; -fx-border-color: transparent; -fx-border-width: 0; -fx-border-insets: 0;"); - scrollPane.setPadding(new Insets(0, 0, 10, 0)); + Platform.runLater(()->{ + vboxChartMonth.getChildren().clear(); - MonthChartGenerator generator = new MonthChartGenerator(sums, controller.getSettings().getCurrency()); - HBox generatedChart = generator.generate(); - scrollPane.setContent(generatedChart); - generatedChart.prefHeightProperty().bind(scrollPane.heightProperty().subtract(30)); - vboxChartMonth.getChildren().add(scrollPane); - VBox.setVgrow(scrollPane, Priority.ALWAYS); - vboxChartMonth.getChildren().add(generator.generateLegend()); - } - else - { - LineChartGenerator generator = new LineChartGenerator(sums, controller.getSettings().getCurrency()); - LineChart<String, Number> chartMonth = generator.generate(); - vboxChartMonth.getChildren().add(chartMonth); - VBox.setVgrow(chartMonth, Priority.ALWAYS); - } + if(radioButtonBars.isSelected()) + { + ScrollPane scrollPane = new ScrollPane(); + scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER); + scrollPane.setFocusTraversable(false); + scrollPane.setStyle("-fx-background-color: transparent; -fx-background-insets: 0; -fx-border-color: transparent; -fx-border-width: 0; -fx-border-insets: 0;"); + scrollPane.setPadding(new Insets(0, 0, 10, 0)); + + MonthChartGenerator generator = new MonthChartGenerator(sums, controller.getSettings().getCurrency()); + HBox generatedChart = generator.generate(); + scrollPane.setContent(generatedChart); + generatedChart.prefHeightProperty().bind(scrollPane.heightProperty().subtract(30)); + vboxChartMonth.getChildren().add(scrollPane); + VBox.setVgrow(scrollPane, Priority.ALWAYS); + vboxChartMonth.getChildren().add(generator.generateLegend()); + } + else + { + LineChartGenerator generator = new LineChartGenerator(sums, controller.getSettings().getCurrency()); + LineChart<String, Number> chartMonth = generator.generate(); + vboxChartMonth.getChildren().add(chartMonth); + VBox.setVgrow(chartMonth, Priority.ALWAYS); + } + }); } catch(Exception e) { Logger.error(e); - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + Platform.runLater(()->{ + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); } } @Override public void refresh() - { - // chart categories + { + Stage modalStage = Helpers.showModal("Vorgang läuft", "Lade Diagramme...", controller.getStage(), controller.getIcon()); + + // prepare chart categories LocalDate startDate = LocalDate.parse(controller.getCurrentDate().withDayOfMonth(1).toString("yyyy-MM-dd")); LocalDate endDate = LocalDate.parse(controller.getCurrentDate().dayOfMonth().withMaximumValue().toString("yyy-MM-dd")); - + datePickerStart.setValue(startDate); - datePickerEnd.setValue(endDate); - - chartCategoriesShow(); + datePickerEnd.setValue(endDate); + // chart month comboBoxStartMonth.setValue(controller.getCurrentDate().minusMonths(5).toString("MMMM")); comboBoxStartYear.setValue(String.valueOf(controller.getCurrentDate().minusMonths(5).getYear())); comboBoxEndMonth.setValue(controller.getCurrentDate().plusMonths(6).toString("MMMM")); comboBoxEndYear.setValue(String.valueOf(controller.getCurrentDate().plusMonths(6).getYear())); - // chart month - chartMonthShow(); + Worker.runLater(() -> { + chartCategoriesShow(); + chartMonthShow(); + + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + }); + }); } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java index 18dc2152a752b9de9bcb3393532674b398902c6c..f7b1ee0fd783364e308c0a3edbf1f4fb1ca7e4b6 100644 --- a/src/de/deadlocker8/budgetmaster/ui/Controller.java +++ b/src/de/deadlocker8/budgetmaster/ui/Controller.java @@ -10,6 +10,7 @@ import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmaster.logic.CategoryHandler; import de.deadlocker8.budgetmaster.logic.ExceptionHandler; import de.deadlocker8.budgetmaster.logic.FilterSettings; +import de.deadlocker8.budgetmaster.logic.Helpers; import de.deadlocker8.budgetmaster.logic.NormalPayment; import de.deadlocker8.budgetmaster.logic.PaymentHandler; import de.deadlocker8.budgetmaster.logic.ServerConnection; @@ -34,6 +35,7 @@ import javafx.stage.Stage; import javafx.util.Duration; import logger.Logger; import tools.AlertGenerator; +import tools.Worker; public class Controller { @@ -104,7 +106,13 @@ public class Controller Parent nodeTabChart = (Parent)fxmlLoader.load(); chartController = fxmlLoader.getController(); chartController.init(this); - tabCharts.setContent(nodeTabChart); + tabCharts.setContent(nodeTabChart); + tabCharts.selectedProperty().addListener((a,b,c)->{ + if(c) + { + chartController.refresh(); + } + }); fxmlLoader = new FXMLLoader(getClass().getResource("/de/deadlocker8/budgetmaster/ui/SettingsTab.fxml")); Parent nodeTabSettings = (Parent)fxmlLoader.load(); @@ -264,7 +272,10 @@ public class Controller homeController.refresh(); paymentController.refresh(); categoryController.refresh(); - chartController.refresh(); + if(tabCharts.isSelected()) + { + chartController.refresh(); + } } public ArrayList<CategoryBudget> getCategoryBudgets() @@ -310,35 +321,53 @@ public class Controller public void refresh(FilterSettings newFilterSettings) { - try - { - ServerConnection connection = new ServerConnection(settings); - - paymentHandler = new PaymentHandler(); - paymentHandler.getPayments().addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear())); - paymentHandler.getPayments().addAll(connection.getRepeatingPayments(currentDate.getYear(), currentDate.getMonthOfYear())); - paymentHandler.sort(); - if(settings.isRestActivated()) + Stage modalStage = Helpers.showModal("Vorgang läuft", "Lade Daten...", stage, icon); + + Worker.runLater(() -> { + try { - int rest = connection.getRestForAllPreviousMonths(currentDate.getYear(), currentDate.getMonthOfYear()); - //categoryID 2 = Rest - paymentHandler.getPayments().add(new NormalPayment(-1, rest, currentDate.withDayOfMonth(1).toString("yyyy-MM-dd"), 2, "Übertrag", "")); - } - - categoryHandler = new CategoryHandler(connection.getCategories()); - - categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); - paymentHandler.filter(newFilterSettings); - - toggleAllTabsExceptSettings(false); - } - catch(Exception e) - { - Logger.error(e); - categoryHandler = new CategoryHandler(null); - showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); - } + ServerConnection connection = new ServerConnection(settings); + + paymentHandler = new PaymentHandler(); + paymentHandler.getPayments().addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear())); + paymentHandler.getPayments().addAll(connection.getRepeatingPayments(currentDate.getYear(), currentDate.getMonthOfYear())); + paymentHandler.sort(); + if(settings.isRestActivated()) + { + int rest = connection.getRestForAllPreviousMonths(currentDate.getYear(), currentDate.getMonthOfYear()); + //categoryID 2 = Rest + paymentHandler.getPayments().add(new NormalPayment(-1, rest, currentDate.withDayOfMonth(1).toString("yyyy-MM-dd"), 2, "Übertrag", "")); + } + + categoryHandler = new CategoryHandler(connection.getCategories()); + + categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); + paymentHandler.filter(newFilterSettings); + - refreshAllTabs(); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + toggleAllTabsExceptSettings(false); + refreshAllTabs(); + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + Logger.error(e); + categoryHandler = new CategoryHandler(null); + showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + refreshAllTabs(); + }); + } + }); } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java b/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java index 1cdd2f05dc59b1c6400127ab386abcfa60e34f2b..2fc8cdaaf9dad917bda1224fb8ac2e97c81156a6 100644 --- a/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java +++ b/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java @@ -177,26 +177,39 @@ public class NewPaymentController if(payment instanceof RepeatingPaymentEntry) { - RepeatingPaymentEntry currentPayment = (RepeatingPaymentEntry)payment; - //repeates every x days - if(currentPayment.getRepeatInterval() != 0) + try { - checkBoxRepeat.setSelected(true); - radioButtonPeriod.setSelected(true); - toggleRepeatingArea(true); - spinnerRepeatingPeriod.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 1000, currentPayment.getRepeatInterval())); - } - //repeat every month on day x - else - { - checkBoxRepeat.setSelected(true); - radioButtonDay.setSelected(true); - toggleRepeatingArea(true); - comboBoxRepeatingDay.getSelectionModel().select(currentPayment.getRepeatMonthDay()); + RepeatingPaymentEntry currentPayment = (RepeatingPaymentEntry)payment; + + ServerConnection connection = new ServerConnection(controller.getSettings()); + RepeatingPayment repeatingPayment = connection.getRepeatingPayment(currentPayment.getRepeatingPaymentID()); + datePicker.setValue(LocalDate.parse(repeatingPayment.getDate())); + + //repeates every x days + if(currentPayment.getRepeatInterval() != 0) + { + checkBoxRepeat.setSelected(true); + radioButtonPeriod.setSelected(true); + toggleRepeatingArea(true); + spinnerRepeatingPeriod.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 1000, currentPayment.getRepeatInterval())); + } + //repeat every month on day x + else + { + checkBoxRepeat.setSelected(true); + radioButtonDay.setSelected(true); + toggleRepeatingArea(true); + comboBoxRepeatingDay.getSelectionModel().select(currentPayment.getRepeatMonthDay()-1); + } + if(currentPayment.getRepeatEndDate() != null) + { + datePickerEnddate.setValue(LocalDate.parse(currentPayment.getRepeatEndDate())); + } } - if(currentPayment.getRepeatEndDate() != null) + catch(Exception e) { - datePickerEnddate.setValue(LocalDate.parse(currentPayment.getRepeatEndDate())); + Logger.error(e); + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); } } else @@ -223,10 +236,10 @@ public class NewPaymentController LocalDate currentLocalDate = LocalDate.now().withYear(currentDate.getYear()) .withMonth(currentDate.getMonthOfYear()) .withDayOfMonth(currentDate.getDayOfMonth()); - datePicker.setValue(currentLocalDate); - datePicker.setEditable(false); - //Platform.runLater(()->{datePicker.getEditor().clear();}); + datePicker.setValue(currentLocalDate); } + + datePicker.setEditable(false); } public void save() diff --git a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java index 562d9e725f1b227f64fd800abb9bb886f216138a..cef54faba9fb5e040cce656e0861051422b7295e 100644 --- a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java +++ b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java @@ -13,9 +13,6 @@ import de.deadlocker8.budgetmaster.logic.Utils; import de.deadlocker8.budgetmasterserver.logic.Database; import javafx.application.Platform; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; @@ -29,7 +26,6 @@ import javafx.scene.control.TextInputDialog; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.AnchorPane; import javafx.stage.FileChooser; -import javafx.stage.Modality; import javafx.stage.Stage; import logger.Logger; import tools.AlertGenerator; @@ -216,7 +212,7 @@ public class SettingsController File file = fileChooser.showSaveDialog(controller.getStage()); if(file != null) { - Stage modalStage = showModal("Vorgang läuft", "Die Datenbank wird exportiert, bitte warten..."); + Stage modalStage = Helpers.showModal("Vorgang läuft", "Die Datenbank wird exportiert, bitte warten...", controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try @@ -274,7 +270,7 @@ public class SettingsController return; } - Stage modalStage = showModal("Vorgang läuft", "Die Datenbank wird importiert, bitte warten..."); + Stage modalStage = Helpers.showModal("Vorgang läuft", "Die Datenbank wird importiert, bitte warten...", controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try @@ -353,7 +349,7 @@ public class SettingsController { if(result.get().equals(verificationCode)) { - Stage modalStage = showModal("Vorgang läuft", "Die Datenbank wird gelöscht, bitte warten..."); + Stage modalStage = Helpers.showModal("Vorgang läuft", "Die Datenbank wird gelöscht, bitte warten...", controller.getStage(), controller.getIcon()); Worker.runLater(() -> { try @@ -391,30 +387,4 @@ public class SettingsController } } } - - private Stage showModal(String title, String message) - { - try - { - FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/de/deadlocker8/budgetmaster/ui/Modal.fxml")); - Parent root = (Parent)fxmlLoader.load(); - Stage newStage = new Stage(); - newStage.initOwner(controller.getStage()); - newStage.initModality(Modality.APPLICATION_MODAL); - newStage.setTitle(title); - newStage.setScene(new Scene(root)); - newStage.getIcons().add(controller.getIcon()); - newStage.setResizable(false); - ModalController newController = fxmlLoader.getController(); - newController.init(newStage, message); - newStage.show(); - - return newStage; - } - catch(IOException e) - { - Logger.error(e); - return null; - } - } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmasterserver/logic/DatabaseHandler.java b/src/de/deadlocker8/budgetmasterserver/logic/DatabaseHandler.java index f1e4863c8be3901bb95c310ce78e2e0afc1c4d40..df7127f7e30ab6ab2a7732b24f9375b07b4a7880 100644 --- a/src/de/deadlocker8/budgetmasterserver/logic/DatabaseHandler.java +++ b/src/de/deadlocker8/budgetmasterserver/logic/DatabaseHandler.java @@ -787,7 +787,7 @@ public class DatabaseHandler String correctRepeatEndDate = repeatEndDate; if(correctRepeatEndDate == null || correctRepeatEndDate.equals("A")) { - correctRepeatEndDate = null; + correctRepeatEndDate = "NULL"; } try