diff --git a/build/BudgetMaster.exe b/build/BudgetMaster.exe index ef395b57ce00f9c3d544f7abed500a8cd1b6656a..adad21672f117432ecba5acc5880cd4de2b94f58 100644 Binary files a/build/BudgetMaster.exe and b/build/BudgetMaster.exe differ diff --git a/build/BudgetMasterClient.jar b/build/BudgetMasterClient.jar index 6dfd13846f8e36ec5f30cc3a7d34fce9b244e3b6..3fd4c2f6cf2308eab6c361001b09d5bb34572977 100644 Binary files a/build/BudgetMasterClient.jar and b/build/BudgetMasterClient.jar differ diff --git a/build/BudgetMasterServer.jar b/build/BudgetMasterServer.jar index 78f8a39be4b9aa71bfe1a8fd5b35a37419b8ef19..7f2b0defbbc1662462382008db0793389329842a 100644 Binary files a/build/BudgetMasterServer.jar and b/build/BudgetMasterServer.jar differ diff --git a/src/de/deadlocker8/budgetmaster/logic/FilterSettings.java b/src/de/deadlocker8/budgetmaster/logic/FilterSettings.java new file mode 100644 index 0000000000000000000000000000000000000000..7a72815d0674d66ea5925873bbe18ece78606aee --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/FilterSettings.java @@ -0,0 +1,174 @@ +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 + "]"; + } + + public boolean equals(Object other) + { + if(other == null) return false; + if(other == this) return true; + if(!(other instanceof FilterSettings)) return false; + FilterSettings otherSettings = (FilterSettings)other; + if(isIncomeAllowed == otherSettings.isIncomeAllowed() && + isPaymentAllowed == otherSettings.isPaymentAllowed && + isNoRepeatingAllowed == otherSettings.isNoRepeatingAllowed && + isMonthlyRepeatingAllowed == otherSettings.isMonthlyRepeatingAllowed && + isRepeatingEveryXDaysAllowed == otherSettings.isRepeatingEveryXDaysAllowed) + { + if(name == null) + { + if(otherSettings.getName() != null) + { + return false; + } + } + else + { + if(otherSettings.getName() == null) + { + return false; + } + else + { + if(!name.equals(otherSettings.getName())) return false; + } + } + + + if(allowedCategoryIDs == null) + { + if(otherSettings.getAllowedCategoryIDs() != null) + { + return false; + } + else + { + return true; + } + } + else + { + if(otherSettings.getAllowedCategoryIDs() == null) + { + return false; + } + else + { + if(allowedCategoryIDs.equals(otherSettings.getAllowedCategoryIDs())) + { + return true; + } + } + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/NormalPayment.java b/src/de/deadlocker8/budgetmaster/logic/NormalPayment.java index 1f4bf8cff6d1c102858758857b63032d6c777bf4..f06a91e6ea961f4796f234a47d4d0a1327ba4690 100644 --- a/src/de/deadlocker8/budgetmaster/logic/NormalPayment.java +++ b/src/de/deadlocker8/budgetmaster/logic/NormalPayment.java @@ -10,6 +10,6 @@ public class NormalPayment extends Payment @Override public String toString() { - return "Payment [ID=" + super.getID() + ", amount=" + super.getAmount() + ", date=" + super.getDate() + ", categoryID=" + super.getCategoryID() + ", name=" + super.getName() + ", description=" + super.getDescription() + "]"; + return "NormalPayment [ID=" + super.getID() + ", amount=" + super.getAmount() + ", date=" + super.getDate() + ", categoryID=" + super.getCategoryID() + ", name=" + super.getName() + ", description=" + super.getDescription() + "]"; } } \ 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 0000000000000000000000000000000000000000..ecb61a71ccee4b7ca9cabcd9e3f5c7bdb26d39ce --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/PaymentHandler.java @@ -0,0 +1,152 @@ +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 paymentsList; + } + + ArrayList<Payment> filteredPayments = new ArrayList<>(); + for(Payment currentPayment : paymentsList) + { + //NormalPayment or rest + if(currentPayment instanceof NormalPayment || currentPayment.getID() == -1) + { + if(filterSettings.isNoRepeatingAllowed()) + { + filteredPayments.add(currentPayment); + } + } + //RepeatingPayment + else + { + RepeatingPaymentEntry repeatingPayment = (RepeatingPaymentEntry)currentPayment; + if((repeatingPayment.getRepeatInterval() != 0 && filterSettings.isRepeatingEveryXDaysAllowed()) || + (repeatingPayment.getRepeatMonthDay() != 0 && filterSettings.isMonthlyRepeatingAllowed())) + { + filteredPayments.add(currentPayment); + } + } + } + + return filteredPayments; + } + + private ArrayList<Payment> filterByCategory(FilterSettings filterSettings, ArrayList<Payment> paymentsList) + { + if(filterSettings.getAllowedCategoryIDs() == null) + { + return paymentsList; + } + + if(filterSettings.getAllowedCategoryIDs().size() == 0) + { + return new ArrayList<>(); + } + + 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().toLowerCase().contains(filterSettings.getName().toLowerCase())) + { + 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 = filterByRepeating(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/main/_de.properties b/src/de/deadlocker8/budgetmaster/main/_de.properties index f083d697d2985676e121ab2270c8a15a9d761b3a..4e7b83ceadac1175fddd4a734c5008a4c550d4d2 100644 --- a/src/de/deadlocker8/budgetmaster/main/_de.properties +++ b/src/de/deadlocker8/budgetmaster/main/_de.properties @@ -1,7 +1,7 @@ app.name=BudgetMaster -version.code=1 -version.name=1.0.0 -version.date=08.04.17 +version.code=2 +version.name=1.1.0 +version.date=12.04.17 author=Robert Goldmann folder=Deadlocker/BudgetMaster diff --git a/src/de/deadlocker8/budgetmaster/ui/CategoryController.java b/src/de/deadlocker8/budgetmaster/ui/CategoryController.java index 132ff978a14404d405a50888dcf9feb172bcb0ef..0cdb686ec6f8cef2adb986699347810bbe9e468c 100644 --- a/src/de/deadlocker8/budgetmaster/ui/CategoryController.java +++ b/src/de/deadlocker8/budgetmaster/ui/CategoryController.java @@ -157,7 +157,7 @@ public class CategoryController implements Refreshable { ServerConnection connection = new ServerConnection(controller.getSettings()); connection.deleteCategory(ID); - controller.refresh(); + controller.refresh(controller.getFilterSettings()); } catch(Exception e) { diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java index c70f4fd819f9fcafa3eade3d5e5b974c086aa11a..0c7c7cbf73a750e58bcba1ea941896bd5f470cc6 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; @@ -11,8 +9,9 @@ import org.joda.time.DateTime; import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmaster.logic.CategoryHandler; +import de.deadlocker8.budgetmaster.logic.FilterSettings; 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; @@ -37,7 +36,7 @@ import javafx.util.Duration; import logger.Logger; import tools.AlertGenerator; -public class Controller implements Refreshable +public class Controller { @FXML private AnchorPane anchorPaneMain; @FXML private Label labelMonth; @@ -64,8 +63,9 @@ 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 FilterSettings filterSettings; private boolean alertIsShowing = false; @@ -74,6 +74,9 @@ public class Controller implements Refreshable this.stage = stage; currentDate = DateTime.now(); labelMonth.setText(currentDate.toString("MMMM yyyy")); + + filterSettings = new FilterSettings(); + paymentHandler = new PaymentHandler(); settings = Utils.loadSettings(); @@ -146,7 +149,7 @@ public class Controller implements Refreshable } else { - refresh(); + refresh(filterSettings); } } @@ -201,7 +204,7 @@ public class Controller implements Refreshable currentDate = currentDate.minusMonths(1); labelMonth.setText(currentDate.toString("MMMM yyyy")); - refresh(); + refresh(filterSettings); } public void nextMonth() @@ -209,7 +212,7 @@ public class Controller implements Refreshable currentDate = currentDate.plusMonths(1); labelMonth.setText(currentDate.toString("MMMM yyyy")); - refresh(); + refresh(filterSettings); } public void today() @@ -217,7 +220,7 @@ public class Controller implements Refreshable currentDate = DateTime.now(); labelMonth.setText(currentDate.toString("MMMM yyyy")); - refresh(); + refresh(filterSettings); } public DateTime getCurrentDate() @@ -246,7 +249,7 @@ public class Controller implements Refreshable } } - private void refreshAllTabs() + public void refreshAllTabs() { homeController.refresh(); paymentController.refresh(); @@ -259,9 +262,9 @@ public class Controller implements Refreshable return categoryBudgets; } - public ArrayList<Payment> getPayments() + public PaymentHandler getPaymentHandler() { - return payments; + return paymentHandler; } public CategoryHandler getCategoryHandler() @@ -269,38 +272,42 @@ public class Controller implements Refreshable return categoryHandler; } + public FilterSettings getFilterSettings() + { + return filterSettings; + } + + public void setFilterSettings(FilterSettings filterSettings) + { + this.filterSettings = filterSettings; + } + public void about() { AlertGenerator.showAboutAlert(bundle.getString("app.name"), bundle.getString("version.name"), bundle.getString("version.code"), bundle.getString("version.date"), bundle.getString("author"), icon, stage, null, false); - } + } - @Override - public void refresh() + public void refresh(FilterSettings newFilterSettings) { try { 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()); - categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); + categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); + paymentHandler.filter(newFilterSettings); } catch(Exception e) { diff --git a/src/de/deadlocker8/budgetmaster/ui/FilterController.java b/src/de/deadlocker8/budgetmaster/ui/FilterController.java new file mode 100644 index 0000000000000000000000000000000000000000..49b2a1505ffed5d3cb1363c181fcc66bb0015d05 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/ui/FilterController.java @@ -0,0 +1,167 @@ +package de.deadlocker8.budgetmaster.ui; + +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.Category; +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 buttonReset; + @FXML private Button buttonFilter; + @FXML private Button buttonCategoryAll; + @FXML private Button buttonCategoryNone; + + private Stage stage; + private Controller controller; + private PaymentController paymentController; + private FilterSettings filterSetttings; + + public void init(Stage stage, Controller controller, PaymentController paymentController, FilterSettings filterSettings) + { + this.stage = stage; + this.controller = controller; + this.paymentController = paymentController; + this.filterSetttings = filterSettings; + + FontIcon iconCancel = new FontIcon(FontIconType.TIMES); + iconCancel.setSize(17); + iconCancel.setStyle("-fx-text-fill: white"); + buttonCancel.setGraphic(iconCancel); + FontIcon iconReset = new FontIcon(FontIconType.UNDO); + iconReset.setSize(17); + iconReset.setStyle("-fx-text-fill: white"); + buttonReset.setGraphic(iconReset); + FontIcon iconSave = new FontIcon(FontIconType.FILTER); + 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;"); + buttonReset.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;"); + buttonCategoryAll.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 13;"); + buttonCategoryNone.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 13;"); + + for(Category currentCategory : controller.getCategoryHandler().getCategories()) + { + CheckBox newCheckBox = new CheckBox(); + newCheckBox.setText(currentCategory.getName()); + newCheckBox.setUserData(currentCategory.getID()); + newCheckBox.setStyle("-fx-font-size: 14;"); + vboxCategories.getChildren().add(newCheckBox); + } + + preselect(); + } + + private void preselect() + { + checkBoxIncome.setSelected(filterSetttings.isIncomeAllowed()); + checkBoxPayment.setSelected(filterSetttings.isPaymentAllowed()); + checkBoxNoRepeating.setSelected(filterSetttings.isNoRepeatingAllowed()); + checkBoxMonthlyRepeating.setSelected(filterSetttings.isMonthlyRepeatingAllowed()); + checkBoxRepeatEveryXDays.setSelected(filterSetttings.isRepeatingEveryXDaysAllowed()); + + ArrayList<Integer> allowedCategoryIDs = filterSetttings.getAllowedCategoryIDs(); + + for(Node node : vboxCategories.getChildren()) + { + CheckBox currentCheckBox = (CheckBox)node; + if(allowedCategoryIDs == null || allowedCategoryIDs.contains(currentCheckBox.getUserData())) + { + currentCheckBox.setSelected(true); + } + } + + textFieldSearch.setText(filterSetttings.getName()); + } + + public void filter() + { + boolean isIncomeAllowed = checkBoxIncome.isSelected(); + boolean isPaymentAllowed = checkBoxPayment.isSelected(); + + boolean isNoRepeatingAllowed = checkBoxNoRepeating.isSelected(); + boolean isMonthlyRepeatingAllowed = checkBoxMonthlyRepeating.isSelected(); + boolean isRepeatingEveryXDaysAllowed = checkBoxRepeatEveryXDays.isSelected(); + + ArrayList<Integer> allowedCategoryIDs = new ArrayList<>(); + for(Node node : vboxCategories.getChildren()) + { + CheckBox currentCheckBox = (CheckBox)node; + if(currentCheckBox.isSelected()) + { + allowedCategoryIDs.add((int)currentCheckBox.getUserData()); + } + } + + if(allowedCategoryIDs.size() == controller.getCategoryHandler().getCategories().size()) + { + allowedCategoryIDs = null; + } + + String name = textFieldSearch.getText(); + if(name != null && name.equals("")) + { + name = null; + } + + // get new unfiltered list from server + controller.refresh(new FilterSettings()); + + FilterSettings newFilterSettings = new FilterSettings(isIncomeAllowed, isPaymentAllowed, isNoRepeatingAllowed, isMonthlyRepeatingAllowed, isRepeatingEveryXDaysAllowed, allowedCategoryIDs, name); + + controller.setFilterSettings(newFilterSettings); + controller.getPaymentHandler().filter(newFilterSettings); + + stage.close(); + paymentController.getController().refreshAllTabs(); + } + + public void reset() + { + filterSetttings = new FilterSettings(); + preselect(); + controller.setFilterSettings(filterSetttings); + controller.refresh(filterSetttings); + } + + public void cancel() + { + stage.close(); + } + + public void enableAllCategories() + { + for(Node node : vboxCategories.getChildren()) + { + ((CheckBox)node).setSelected(true); + } + } + + public void disableAllCategories() + { + for(Node node : vboxCategories.getChildren()) + { + ((CheckBox)node).setSelected(false); + } + } +} \ 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 0000000000000000000000000000000000000000..643fd670ecbe7c76ad87e023a0608e9037bac18c --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/ui/FilterGUI.fxml @@ -0,0 +1,141 @@ +<?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.ScrollPane?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Region?> +<?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.FilterController"> + <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="monatlich"> + <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="150.0" prefWidth="422.0" spacing="10.0"> + <children> + <HBox spacing="10.0"> + <children> + <Label text="Kategorien"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Region prefWidth="200.0" HBox.hgrow="ALWAYS" /> + <Button fx:id="buttonCategoryAll" mnemonicParsing="false" onAction="#enableAllCategories" text="Alle"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + </Button> + <Button fx:id="buttonCategoryNone" mnemonicParsing="false" onAction="#disableAllCategories" text="Keine"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + </Button> + </children> + </HBox> + <ScrollPane prefHeight="93.0" prefWidth="422.0" VBox.vgrow="ALWAYS"> + <content> + <VBox fx:id="vboxCategories" spacing="5.0" /> + </content> + </ScrollPane> + </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="buttonReset" mnemonicParsing="false" onAction="#reset" text="Zurücksetzen"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + <HBox.margin> + <Insets left="25.0" /> + </HBox.margin> + </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 6035ff1ea0fe95add2391f1745baada876f0d366..ab2bb352069d6ad6a76237b90cd55989d57e64f4 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) @@ -84,7 +84,7 @@ public class HomeController implements Refreshable } else { - labelBudget.setStyle("-fx-text-fill: #000000"); + labelBudget.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text")); } labelStartBudget.setText("von " + String.valueOf(Helpers.NUMBER_FORMAT.format(budget.getIncomeSum()).replace(".", ",")) + " " + controller.getSettings().getCurrency() + " verbleibend"); diff --git a/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java b/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java index 5f34e6cd4186045210fec19f36c31e13bd5d799c..4a94063bfc834cc950c48a9956a696740eb65fb2 100644 --- a/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java +++ b/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java @@ -166,7 +166,7 @@ public class NewCategoryController } stage.close(); - categoryController.getController().refresh(); + categoryController.getController().refresh(controller.getFilterSettings()); } public void cancel() diff --git a/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java b/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java index 06c3c5ff48fe075f12d3cc42633caf9521bd1e57..51355b5c2be6edac9a67530244c1cdb6299c48b4 100644 --- a/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java +++ b/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java @@ -368,7 +368,7 @@ public class NewPaymentController } stage.close(); - paymentController.getController().refresh(); + paymentController.getController().refresh(controller.getFilterSettings()); } public void cancel() diff --git a/src/de/deadlocker8/budgetmaster/ui/PaymentController.java b/src/de/deadlocker8/budgetmaster/ui/PaymentController.java index 5a3009bfdaaf3ed58b29e8ec1c99df5f31622b2c..db5adcc84d3d952eae84f269b1acce9e1e9d976e 100644 --- a/src/de/deadlocker8/budgetmaster/ui/PaymentController.java +++ b/src/de/deadlocker8/budgetmaster/ui/PaymentController.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.ArrayList; import de.deadlocker8.budgetmaster.logic.Budget; +import de.deadlocker8.budgetmaster.logic.FilterSettings; import de.deadlocker8.budgetmaster.logic.Helpers; import de.deadlocker8.budgetmaster.logic.NormalPayment; import de.deadlocker8.budgetmaster.logic.Payment; @@ -39,8 +40,10 @@ public class PaymentController implements Refreshable @FXML private Label labelIncomes; @FXML private Label labelPayment; @FXML private Label labelPayments; + @FXML private Label labelFilterActive; @FXML private ListView<Payment> listView; @FXML private Button buttonNewIncome; + @FXML private Button buttonFilter; @FXML private Button buttonNewPayment; private Controller controller; @@ -94,10 +97,19 @@ public class PaymentController implements Refreshable iconIncome.setSize(18); iconIncome.setStyle("-fx-text-fill: white"); buttonNewIncome.setGraphic(iconIncome); + FontIcon iconFilter = new FontIcon(FontIconType.FILTER); + iconFilter.setSize(18); + iconFilter.setStyle("-fx-text-fill: white"); + buttonFilter.setGraphic(iconFilter); FontIcon iconPayment = new FontIcon(FontIconType.UPLOAD); iconPayment.setSize(18); iconPayment.setStyle("-fx-text-fill: white"); buttonNewPayment.setGraphic(iconPayment); + + FontIcon iconWarning = new FontIcon(FontIconType.WARNING); + iconWarning.setSize(13); + iconWarning.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text")); + labelFilterActive.setGraphic(iconWarning); // apply theme anchorPaneMain.setStyle("-fx-background-color: #F4F4F4;"); @@ -105,7 +117,9 @@ public class PaymentController implements Refreshable labelIncomes.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text")); labelPayment.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text")); labelPayments.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text")); + labelFilterActive.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text")); buttonNewIncome.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); + buttonFilter.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); buttonNewPayment.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); refresh(); @@ -160,7 +174,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); @@ -185,7 +199,7 @@ public class PaymentController implements Refreshable { ServerConnection connection = new ServerConnection(controller.getSettings()); connection.deleteNormalPayment(payment); - controller.refresh(); + controller.refresh(controller.getFilterSettings()); } catch(Exception e) { @@ -200,7 +214,7 @@ public class PaymentController implements Refreshable { ServerConnection connection = new ServerConnection(controller.getSettings()); connection.deleteRepeatingPayment(payment); - controller.refresh(); + controller.refresh(controller.getFilterSettings()); } catch(Exception e) { @@ -219,7 +233,7 @@ public class PaymentController implements Refreshable connection.deleteRepeatingPayment(payment); connection.addRepeatingPayment(newRepeatingPayment); - controller.refresh(); + controller.refresh(controller.getFilterSettings()); } catch(Exception e) { @@ -227,6 +241,29 @@ public class PaymentController implements Refreshable controller.showConnectionErrorAlert(); } } + + public void filter() + { + try + { + FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/de/deadlocker8/budgetmaster/ui/FilterGUI.fxml")); + Parent root = (Parent)fxmlLoader.load(); + Stage newStage = new Stage(); + newStage.initOwner(controller.getStage()); + newStage.initModality(Modality.APPLICATION_MODAL); + newStage.setTitle("Filter"); + newStage.setScene(new Scene(root)); + newStage.getIcons().add(controller.getIcon()); + newStage.setResizable(false); + FilterController newController = fxmlLoader.getController(); + newController.init(newStage, controller, this, controller.getFilterSettings()); + newStage.show(); + } + catch(IOException e) + { + Logger.error(e); + } + } public Controller getController() { @@ -238,6 +275,15 @@ public class PaymentController implements Refreshable { refreshListView(); refreshCounter(); + + if(controller.getFilterSettings().equals(new FilterSettings())) + { + labelFilterActive.setVisible(false); + } + else + { + labelFilterActive.setVisible(true); + } Label labelPlaceholder = new Label("Keine Daten verfügbar"); labelPlaceholder.setStyle("-fx-font-size: 16"); diff --git a/src/de/deadlocker8/budgetmaster/ui/PaymentTab.fxml b/src/de/deadlocker8/budgetmaster/ui/PaymentTab.fxml index c4e1cfb32007347f48279cf2f4163540eee1957b..6222f5e8f8219b798a02de61cdcab31573d41e66 100644 --- a/src/de/deadlocker8/budgetmaster/ui/PaymentTab.fxml +++ b/src/de/deadlocker8/budgetmaster/ui/PaymentTab.fxml @@ -22,6 +22,21 @@ </font> </Button> <Region HBox.hgrow="ALWAYS" /> + <VBox alignment="CENTER" spacing="10.0"> + <children> + <Button fx:id="buttonFilter" mnemonicParsing="false" onAction="#filter" text="Filter"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Label fx:id="labelFilterActive" text="Filter aktiv"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + </Label> + </children> + </VBox> + <Region HBox.hgrow="ALWAYS" /> <Button fx:id="buttonNewPayment" mnemonicParsing="false" onAction="#newPayment" text=" Neue Ausgabe"> <font> <Font name="System Bold" size="14.0" /> diff --git a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java index d82df810dbb1aaf7349dd76e6e6c2cce5bd943ec..471619dc9dbe1c4788c6de5b70a64e7354e13d9f 100644 --- a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java +++ b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java @@ -98,7 +98,7 @@ public class SettingsController Logger.error(e); AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Beim Speichern der Einstellungen ist ein Fehler aufgetreten", controller.getIcon(), controller.getStage(), null, false); } - controller.refresh(); + controller.refresh(controller.getFilterSettings()); controller.showNotification("Erfolgreich gespeichert"); } else diff --git a/src/de/deadlocker8/budgetmasterserver/main/_de.properties b/src/de/deadlocker8/budgetmasterserver/main/_de.properties index ed61ad0100bb678c945a6c00046ce13b823c4836..b231f1d78f4e46819869a44ca52fbc7a2efe6b88 100644 --- a/src/de/deadlocker8/budgetmasterserver/main/_de.properties +++ b/src/de/deadlocker8/budgetmasterserver/main/_de.properties @@ -1,5 +1,5 @@ app.name=BudgetMasterServer -version.code=1 -version.name=1.0.0 -version.date=08.04.17 +version.code=2 +version.name=1.1.0 +version.date=12.04.17 author=Robert Goldmann \ No newline at end of file