From 585b5912d19f60bcb8bc6f5570eb241918d18bdb Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sat, 8 Apr 2017 21:22:13 +0200 Subject: [PATCH] started working on filter options --- .../budgetmaster/logic/FilterSettings.java | 112 ++++++++++++++++ .../budgetmaster/logic/PaymentHandler.java | 124 ++++++++++++++++++ .../budgetmaster/ui/Controller.java | 26 ++-- .../budgetmaster/ui/FilterController.java | 96 ++++++++++++++ .../budgetmaster/ui/FilterGUI.fxml | 112 ++++++++++++++++ .../budgetmaster/ui/HomeController.java | 4 +- .../budgetmaster/ui/PaymentController.java | 2 +- 7 files changed, 456 insertions(+), 20 deletions(-) create mode 100644 src/de/deadlocker8/budgetmaster/logic/FilterSettings.java create mode 100644 src/de/deadlocker8/budgetmaster/logic/PaymentHandler.java create mode 100644 src/de/deadlocker8/budgetmaster/ui/FilterController.java create mode 100644 src/de/deadlocker8/budgetmaster/ui/FilterGUI.fxml diff --git a/src/de/deadlocker8/budgetmaster/logic/FilterSettings.java b/src/de/deadlocker8/budgetmaster/logic/FilterSettings.java new file mode 100644 index 000000000..8264edb06 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/FilterSettings.java @@ -0,0 +1,112 @@ +package de.deadlocker8.budgetmaster.logic; + +import java.util.ArrayList; + +public class FilterSettings +{ + private boolean isIncomeAllowed; + private boolean isPaymentAllowed; + private boolean isNoRepeatingAllowed; + private boolean isMonthlyRepeatingAllowed; + private boolean isRepeatingEveryXDaysAllowed; + private ArrayList<Integer> allowedCategoryIDs; + private String name; + + public FilterSettings(boolean isIncomeAllowed, boolean isPaymentAllowed, boolean isNoRepeatingAllowed, boolean isMonthlyRepeatingAllowed, boolean isRepeatingEveryXDaysAllowed, ArrayList<Integer> allowedCategoryIDs, String name) + { + this.isIncomeAllowed = isIncomeAllowed; + this.isPaymentAllowed = isPaymentAllowed; + this.isNoRepeatingAllowed = isNoRepeatingAllowed; + this.isMonthlyRepeatingAllowed = isMonthlyRepeatingAllowed; + this.isRepeatingEveryXDaysAllowed = isRepeatingEveryXDaysAllowed; + this.allowedCategoryIDs = allowedCategoryIDs; + this.name = name; + } + + public FilterSettings() + { + this.isIncomeAllowed = true; + this.isPaymentAllowed = true; + this.isNoRepeatingAllowed = true; + this.isMonthlyRepeatingAllowed = true; + this.isRepeatingEveryXDaysAllowed = true; + this.allowedCategoryIDs = null; + this.name = null; + } + + public boolean isIncomeAllowed() + { + return isIncomeAllowed; + } + + public void setIncomeAllowed(boolean isIncomeAllowed) + { + this.isIncomeAllowed = isIncomeAllowed; + } + + public boolean isPaymentAllowed() + { + return isPaymentAllowed; + } + + public void setPaymentAllowed(boolean isPaymentAllowed) + { + this.isPaymentAllowed = isPaymentAllowed; + } + + public boolean isNoRepeatingAllowed() + { + return isNoRepeatingAllowed; + } + + public void setNoRepeatingAllowed(boolean isNoRepeatingAllowed) + { + this.isNoRepeatingAllowed = isNoRepeatingAllowed; + } + + public boolean isMonthlyRepeatingAllowed() + { + return isMonthlyRepeatingAllowed; + } + + public void setMonthlyRepeatingAllowed(boolean isMonthlyRepeatingAllowed) + { + this.isMonthlyRepeatingAllowed = isMonthlyRepeatingAllowed; + } + + public boolean isRepeatingEveryXDaysAllowed() + { + return isRepeatingEveryXDaysAllowed; + } + + public void setRepeatingEveryXDaysAllowed(boolean isRepeatingEveryXDaysAllowed) + { + this.isRepeatingEveryXDaysAllowed = isRepeatingEveryXDaysAllowed; + } + + public ArrayList<Integer> getAllowedCategoryIDs() + { + return allowedCategoryIDs; + } + + public void setAllowedCategoryIDs(ArrayList<Integer> allowedCategoryIDs) + { + this.allowedCategoryIDs = allowedCategoryIDs; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String toString() + { + return "FilterSettings [isIncomeAllowed=" + isIncomeAllowed + ", isPaymentAllowed=" + isPaymentAllowed + ", isNoRepeatingAllowed=" + isNoRepeatingAllowed + ", isMonthlyRepeatingAllowed=" + isMonthlyRepeatingAllowed + ", isRepeatingEveryXDaysAllowed=" + isRepeatingEveryXDaysAllowed + + ", allowedCategoryIDs=" + allowedCategoryIDs + ", name=" + name + "]"; + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/PaymentHandler.java b/src/de/deadlocker8/budgetmaster/logic/PaymentHandler.java new file mode 100644 index 000000000..39f711290 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/PaymentHandler.java @@ -0,0 +1,124 @@ +package de.deadlocker8.budgetmaster.logic; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.stream.Collectors; + +public class PaymentHandler +{ + private ArrayList<Payment> payments; + + public PaymentHandler() + { + payments = new ArrayList<>(); + } + + public ArrayList<Payment> getPayments() + { + return payments; + } + + public void setPayments(ArrayList<Payment> payments) + { + this.payments = payments; + } + + public void sort() + { + Collections.sort(payments, new Comparator<Payment>() { + @Override + public int compare(Payment payment1, Payment payment2) + { + return payment2.getDate().compareTo(payment1.getDate()); + } + }); + } + + private ArrayList<Payment> filterByRepeating(FilterSettings filterSettings, ArrayList<Payment> paymentsList) + { + if(filterSettings.isNoRepeatingAllowed() && filterSettings.isMonthlyRepeatingAllowed() && filterSettings.isRepeatingEveryXDaysAllowed()) + { + return payments; + } + + ArrayList<Payment> filteredPayments = new ArrayList<>(); + for(Payment currentPayment : paymentsList) + { + //TODO + } + + return new ArrayList<>(); + } + + private ArrayList<Payment> filterByCategory(FilterSettings filterSettings, ArrayList<Payment> paymentsList) + { + ArrayList<Payment> filteredPayments = new ArrayList<>(); + for(Payment currentPayment : paymentsList) + { + if(filterSettings.getAllowedCategoryIDs().contains(currentPayment.getCategoryID())) + { + filteredPayments.add(currentPayment); + } + } + + return filteredPayments; + } + + private ArrayList<Payment> filterByName(FilterSettings filterSettings, ArrayList<Payment> paymentsList) + { + if(filterSettings.getName() == null) + { + return paymentsList; + } + + ArrayList<Payment> filteredPayments = new ArrayList<>(); + for(Payment currentPayment : paymentsList) + { + if(currentPayment.getName().contains(filterSettings.getName())) + { + filteredPayments.add(currentPayment); + } + } + + return filteredPayments; + } + + private ArrayList<Payment> filterByType(FilterSettings filterSettings, ArrayList<Payment> paymentsList) + { + if(filterSettings.isIncomeAllowed() && filterSettings.isPaymentAllowed()) + { + return paymentsList; + } + + if(filterSettings.isIncomeAllowed()) + { + return new ArrayList<Payment>(paymentsList.stream(). + filter(p -> p.getAmount() > 0). + collect(Collectors.toList())); + } + else if(filterSettings.isPaymentAllowed()) + { + return new ArrayList<Payment>(paymentsList.stream(). + filter(p -> p.getAmount() < 0). + collect(Collectors.toList())); + } + + return new ArrayList<>(); + } + + public void filter(FilterSettings filterSettings) + { + ArrayList<Payment> filteredPayments = filterByType(filterSettings, payments); + filteredPayments = filterByType(filterSettings, filteredPayments); + filteredPayments = filterByCategory(filterSettings, filteredPayments); + filteredPayments = filterByName(filterSettings, filteredPayments); + + payments = filteredPayments; + } + + public String toString() + { + return "PaymentHandler [payments=" + payments + "]"; + } +} diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java index c70f4fd81..330ab88bd 100644 --- a/src/de/deadlocker8/budgetmaster/ui/Controller.java +++ b/src/de/deadlocker8/budgetmaster/ui/Controller.java @@ -2,8 +2,6 @@ package de.deadlocker8.budgetmaster.ui; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.Locale; import java.util.ResourceBundle; @@ -12,7 +10,7 @@ import org.joda.time.DateTime; import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmaster.logic.CategoryHandler; import de.deadlocker8.budgetmaster.logic.NormalPayment; -import de.deadlocker8.budgetmaster.logic.Payment; +import de.deadlocker8.budgetmaster.logic.PaymentHandler; import de.deadlocker8.budgetmaster.logic.ServerConnection; import de.deadlocker8.budgetmaster.logic.Settings; import de.deadlocker8.budgetmaster.logic.Utils; @@ -64,7 +62,7 @@ public class Controller implements Refreshable private Settings settings; private DateTime currentDate; private ArrayList<CategoryBudget> categoryBudgets; - private ArrayList<Payment> payments; + private PaymentHandler paymentHandler; private CategoryHandler categoryHandler; private boolean alertIsShowing = false; @@ -259,9 +257,9 @@ public class Controller implements Refreshable return categoryBudgets; } - public ArrayList<Payment> getPayments() + public PaymentHandler getPaymentHandler() { - return payments; + return paymentHandler; } public CategoryHandler getCategoryHandler() @@ -281,21 +279,15 @@ public class Controller implements Refreshable { ServerConnection connection = new ServerConnection(settings); - payments = new ArrayList<>(); - payments.addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear())); - payments.addAll(connection.getRepeatingPayments(currentDate.getYear(), currentDate.getMonthOfYear())); - Collections.sort(payments, new Comparator<Payment>() { - @Override - public int compare(Payment payment1, Payment payment2) - { - return payment2.getDate().compareTo(payment1.getDate()); - } - }); + 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 - payments.add(new NormalPayment(-1, rest, currentDate.withDayOfMonth(1).toString("yyyy-MM-dd"), 2, "Übertrag", "")); + paymentHandler.getPayments().add(new NormalPayment(-1, rest, currentDate.withDayOfMonth(1).toString("yyyy-MM-dd"), 2, "Übertrag", "")); } categoryHandler = new CategoryHandler(connection.getCategories()); diff --git a/src/de/deadlocker8/budgetmaster/ui/FilterController.java b/src/de/deadlocker8/budgetmaster/ui/FilterController.java new file mode 100644 index 000000000..df84d9409 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/ui/FilterController.java @@ -0,0 +1,96 @@ +package de.deadlocker8.budgetmaster.ui; + +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.FilterSettings; +import fontAwesome.FontIcon; +import fontAwesome.FontIconType; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.CheckBox; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class FilterController +{ + @FXML private CheckBox checkBoxIncome; + @FXML private CheckBox checkBoxPayment; + @FXML private CheckBox checkBoxNoRepeating; + @FXML private CheckBox checkBoxMonthlyRepeating; + @FXML private CheckBox checkBoxRepeatEveryXDays; + @FXML private VBox vboxCategories; + @FXML private TextField textFieldSearch; + @FXML private Button buttonCancel; + @FXML private Button buttonFilter; + + private Stage stage; + private Controller controller; + private PaymentController paymentController; + + public void init(Stage stage, Controller controller, PaymentController paymentController) + { + this.stage = stage; + this.controller = controller; + this.paymentController = paymentController; + + FontIcon iconCancel = new FontIcon(FontIconType.TIMES); + iconCancel.setSize(17); + iconCancel.setStyle("-fx-text-fill: white"); + buttonCancel.setGraphic(iconCancel); + FontIcon iconSave = new FontIcon(FontIconType.SAVE); + iconSave.setSize(17); + iconSave.setStyle("-fx-text-fill: white"); + buttonFilter.setGraphic(iconSave); + + buttonCancel.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); + buttonFilter.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;"); + } + + public void filter() + { + boolean isIncomeAllowed = checkBoxIncome.isSelected(); + boolean isPaymentAllowed = checkBoxPayment.isSelected(); + + boolean isNoRepeatingAllowed = checkBoxNoRepeating.isSelected(); + boolean isMonthlyRepeatingAllowed = checkBoxNoRepeating.isSelected(); + boolean isRepeatingEveryXDaysAllowed = checkBoxNoRepeating.isSelected(); + + ArrayList<Integer> allowedCategoryIDs = new ArrayList<>(); + for(Node node : vboxCategories.getChildren()) + { + CheckBox currentCheckBox = (CheckBox)node; + if(currentCheckBox.isSelected()) + { + allowedCategoryIDs.add((int)currentCheckBox.getUserData()); + } + } + + String name = textFieldSearch.getText(); + if(name.equals("")) + { + name = null; + } + + //TODO get new list from server first + controller.getPaymentHandler().filter(new FilterSettings(isIncomeAllowed, + isPaymentAllowed, + isNoRepeatingAllowed, + isMonthlyRepeatingAllowed, + isRepeatingEveryXDaysAllowed, + allowedCategoryIDs, + name)); + + stage.close(); + paymentController.getController().refresh(); + + //TODO button reset + //TODO set userData for category checkboxes + } + + public void cancel() + { + stage.close(); + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/FilterGUI.fxml b/src/de/deadlocker8/budgetmaster/ui/FilterGUI.fxml new file mode 100644 index 000000000..5c3bdeaf5 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/ui/FilterGUI.fxml @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.CheckBox?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Font?> + +<AnchorPane prefHeight="600.0" prefWidth="450.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmaster.ui.NewPaymentController"> + <children> + <VBox prefHeight="273.0" prefWidth="465.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> + <children> + <Label text="Filtern nach:"> + <font> + <Font name="System Bold" size="18.0" /> + </font> + </Label> + <VBox prefHeight="15.0" prefWidth="422.0" spacing="10.0"> + <children> + <Label text="Art"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <HBox prefHeight="10.0" prefWidth="422.0" spacing="25.0"> + <children> + <CheckBox fx:id="checkBoxIncome" mnemonicParsing="false" text="Einnahme"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + <CheckBox fx:id="checkBoxPayment" mnemonicParsing="false" text="Ausgabe"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + </children> + </HBox> + </children> + </VBox> + <VBox prefHeight="33.0" prefWidth="422.0" spacing="10.0"> + <children> + <Label text="Wiederholung"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <CheckBox fx:id="checkBoxNoRepeating" mnemonicParsing="false" text="keine Wiederholung"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + <CheckBox fx:id="checkBoxMonthlyRepeating" mnemonicParsing="false" text="jeden x-ten eines Monats"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + <CheckBox fx:id="checkBoxRepeatEveryXDays" mnemonicParsing="false" text="alle X Tage"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + </children> + </VBox> + <VBox prefHeight="33.0" prefWidth="422.0" spacing="10.0"> + <children> + <Label text="Kategorien"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <VBox fx:id="vboxCategories" prefHeight="200.0" prefWidth="100.0" /> + </children> + </VBox> + <VBox prefHeight="33.0" prefWidth="422.0" VBox.vgrow="ALWAYS"> + <children> + <Label text="Name"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <TextField fx:id="textFieldSearch" /> + </children> + </VBox> + <HBox alignment="CENTER" prefHeight="30.0" prefWidth="465.0" spacing="10.0"> + <children> + <Button fx:id="buttonCancel" mnemonicParsing="false" onAction="#cancel" text="Abbrechen"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonFilter" mnemonicParsing="false" onAction="#filter" text="Filtern"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + <HBox.margin> + <Insets left="25.0" /> + </HBox.margin> + </Button> + </children> + <VBox.margin> + <Insets top="10.0" /> + </VBox.margin> + </HBox> + </children> + </VBox> + </children> +</AnchorPane> diff --git a/src/de/deadlocker8/budgetmaster/ui/HomeController.java b/src/de/deadlocker8/budgetmaster/ui/HomeController.java index 6035ff1ea..2257b415a 100644 --- a/src/de/deadlocker8/budgetmaster/ui/HomeController.java +++ b/src/de/deadlocker8/budgetmaster/ui/HomeController.java @@ -73,9 +73,9 @@ public class HomeController implements Refreshable private void refreshCounter() { - if(controller.getPayments() != null) + if(controller.getPaymentHandler().getPayments() != null) { - Budget budget = new Budget(controller.getPayments()); + Budget budget = new Budget(controller.getPaymentHandler().getPayments()); double remaining = budget.getIncomeSum() + budget.getPaymentSum(); labelBudget.setText(String.valueOf(Helpers.NUMBER_FORMAT.format(remaining).replace(".", ",")) + " " + controller.getSettings().getCurrency()); if(remaining <= 0) diff --git a/src/de/deadlocker8/budgetmaster/ui/PaymentController.java b/src/de/deadlocker8/budgetmaster/ui/PaymentController.java index 5a3009bfd..fd83ab92b 100644 --- a/src/de/deadlocker8/budgetmaster/ui/PaymentController.java +++ b/src/de/deadlocker8/budgetmaster/ui/PaymentController.java @@ -160,7 +160,7 @@ public class PaymentController implements Refreshable { listView.getItems().clear(); - ArrayList<Payment> payments = controller.getPayments(); + ArrayList<Payment> payments = controller.getPaymentHandler().getPayments(); if(payments != null) { listView.getItems().setAll(payments); -- GitLab