From 36d3eff3b1ea86ee0c09317754288dbcc40b09aa Mon Sep 17 00:00:00 2001
From: Harry Linrui XU <xulr0820@hotmail.com>
Date: Thu, 30 Mar 2023 12:18:53 +0200
Subject: [PATCH] Added piecharts. Split initialize into smaller methods.
 Filled returnToMainMenu() body

---
 .../controller/IncomeExpenseController.java   | 95 ++++++++++++++++---
 1 file changed, 80 insertions(+), 15 deletions(-)

diff --git a/src/main/java/no/ntnu/idatt1002/demo/controller/IncomeExpenseController.java b/src/main/java/no/ntnu/idatt1002/demo/controller/IncomeExpenseController.java
index 281232de..95b78b47 100644
--- a/src/main/java/no/ntnu/idatt1002/demo/controller/IncomeExpenseController.java
+++ b/src/main/java/no/ntnu/idatt1002/demo/controller/IncomeExpenseController.java
@@ -3,9 +3,17 @@ package no.ntnu.idatt1002.demo.controller;
 import java.awt.event.ActionEvent;
 import java.io.IOException;
 import java.util.Optional;
+import javafx.beans.binding.Bindings;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.geometry.Side;
+import javafx.scene.Node;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.scene.chart.PieChart;
+import javafx.scene.chart.PieChart.Data;
 import javafx.scene.control.Button;
 import javafx.scene.control.ButtonType;
 import javafx.scene.control.ComboBox;
@@ -16,6 +24,7 @@ import javafx.scene.control.TableColumn;
 import javafx.scene.control.TableView;
 import javafx.scene.control.cell.PropertyValueFactory;
 import javafx.scene.text.Text;
+import javafx.stage.Stage;
 import no.ntnu.idatt1002.demo.data.Budget.FileHandlingBudget;
 import no.ntnu.idatt1002.demo.data.Budget.GeneralBudget;
 import no.ntnu.idatt1002.demo.data.Economics.Expense;
@@ -108,12 +117,45 @@ public class IncomeExpenseController implements FinanceController {
 
   private ObservableList<Expense> expenses;
 
+  @FXML
+  private PieChart expensePieChart;
+
+  @FXML
+  private PieChart incomePieChart;
 
   FileHandling fileHandling;
 
   @FXML
   public void initialize() throws IOException {
+    fileHandling = new FileHandling();
+
     //Initialize columns
+    setColumns();
+
+    //Initialize registers and tableview
+    incomeRegister = loadIncomeDataFromFile("Income");
+    income = FXCollections.observableArrayList(incomeRegister.getItems());
+    incomeTableView.setItems(income);
+
+    expenseRegister = loadExpenseDataFromFile("Expense");
+    expenses = FXCollections.observableArrayList(expenseRegister.getItems());
+    expenseTableView.setItems(expenses);
+
+    incomePieChart.getData().addAll(createIncomePyChart());
+    expensePieChart.getData().addAll(createExpensePyChart());
+
+    incomePieChart.setLegendSide(Side.LEFT);
+    expensePieChart.setTitle("Expenses");
+    expensePieChart.setLegendSide(Side.LEFT);
+    expensePieChart.setLabelLineLength(10);
+
+    //Initialize sum field under the tableview
+   // inSum.setText(String.valueOf(incomeRegister.getTotalSum()));
+    //expSum.setText(String.valueOf(expenseRegister.getTotalSum()));
+
+  }
+
+  private void setColumns() {
     inDateCol.setCellValueFactory(new PropertyValueFactory<Income, String>("date"));
     inAmountCol.setCellValueFactory(new PropertyValueFactory<Income, Double>("amount"));
     inCategoryCol.setCellValueFactory(new PropertyValueFactory<Income, IncomeCategory>("category"));
@@ -125,21 +167,36 @@ public class IncomeExpenseController implements FinanceController {
     expCategoryCol.setCellValueFactory(new PropertyValueFactory<Expense, ExpenseCategory>("category"));
     expDescriptionCol.setCellValueFactory(new PropertyValueFactory<Expense, String>("description"));
     expRecurringCol.setCellValueFactory(new PropertyValueFactory<Expense, Boolean>("recurring"));
+  }
 
-    //Initialize registers and tableview
-    incomeRegister = loadIncomeDataFromFile("Income");
-    income = FXCollections.observableArrayList(incomeRegister.getItems());
-    incomeTableView.setItems(income);
-
-    expenseRegister = loadExpenseDataFromFile("Expense");
-    expenses = FXCollections.observableArrayList(expenseRegister.getItems());
-    expenseTableView.setItems(expenses);
-
-    //Initialize sum field under the tableview
-    inSum.setText(String.valueOf(incomeRegister.getTotalSum()));
-    expSum.setText(String.valueOf(expenseRegister.getTotalSum()));
+  private ObservableList<PieChart.Data> createExpensePyChart() {
+    ObservableList<PieChart.Data> expensePieChartData =
+        FXCollections.observableArrayList(
+            new PieChart.Data("Food", expenseRegister.getExpenseByCategory(ExpenseCategory.FOOD).getTotalSum()),
+            new PieChart.Data("Books", expenseRegister.getExpenseByCategory(ExpenseCategory.BOOKS).getTotalSum()),
+            new PieChart.Data("Clothes", expenseRegister.getExpenseByCategory(ExpenseCategory.CLOTHES).getTotalSum()),
+            new PieChart.Data("Other", expenseRegister.getExpenseByCategory(ExpenseCategory.OTHER).getTotalSum())
+        );
+    expensePieChartData.forEach(data ->
+        data.nameProperty().bind(
+            Bindings.concat(
+                data.getName() + " " + data.pieValueProperty())
+        ));
+    return expensePieChartData;
+  }
 
-    fileHandling = new FileHandling();
+  private ObservableList<PieChart.Data> createIncomePyChart() {
+    ObservableList<PieChart.Data> incomePieChartData =
+        FXCollections.observableArrayList(
+            new PieChart.Data("Food", incomeRegister.getIncomeByCategory(IncomeCategory.GIFT).getTotalSum()),
+            new PieChart.Data("Books", incomeRegister.getIncomeByCategory(IncomeCategory.SALARY).getTotalSum())
+        );
+    incomePieChartData.forEach(data ->
+        data.nameProperty().bind(
+            Bindings.concat(
+                data.getName() + " " + data.pieValueProperty())
+        ));
+    return incomePieChartData;
   }
 
   /**
@@ -268,7 +325,15 @@ public class IncomeExpenseController implements FinanceController {
   /**
    * Switches the scene to the Main Menu scene.
    */
-  private void returnToMainMenu() {
-
+  @FXML
+  private void returnToMainMenu(javafx.event.ActionEvent event) throws IOException {
+    FXMLLoader loader = new FXMLLoader();
+    loader.setLocation(getClass().getResource("/view/MainMenuNew.fxml"));
+
+    Parent root = loader.load();
+    Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
+    Scene scene = new Scene(root);
+    stage.setScene(scene);
+    stage.show();
   }
 }
-- 
GitLab