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