From d46b3591c2245700c6f6fe606eaa4553daefe7b8 Mon Sep 17 00:00:00 2001 From: Harry Linrui XU <xulr0820@hotmail.com> Date: Wed, 12 Apr 2023 10:19:16 +0200 Subject: [PATCH] Implemented pie charts display in BudgetController --- .../demo/controller/BudgetController.java | 53 +++++++++++++------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java b/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java index 1325d296..76008f73 100644 --- a/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java +++ b/src/main/java/no/ntnu/idatt1002/demo/controller/BudgetController.java @@ -1,6 +1,9 @@ package no.ntnu.idatt1002.demo.controller; import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; @@ -20,6 +23,7 @@ import javafx.stage.Stage; import no.ntnu.idatt1002.demo.data.Budget.BudgetItem; import no.ntnu.idatt1002.demo.data.Budget.FileHandlingBudget; import no.ntnu.idatt1002.demo.data.Budget.GeneralBudget; +import no.ntnu.idatt1002.demo.data.Economics.Expense; import no.ntnu.idatt1002.demo.data.Economics.ExpenseCategory; @@ -70,14 +74,16 @@ public class BudgetController implements FinanceController { @FXML private ObservableList<BudgetItem> budgetList; + @FXML + private PieChart budgetPieChart; + /** * Initializes the budget register, the observable budget list and the tableview, along with the values of the dropbox used for filtering the tableview. - * @throws IOException If there occurs any exception when loading the budget register from a file. */ @FXML - public void initialize() throws IOException { + public void initialize() { //TODO if budget is not empty (HAS VALUES) -> make uneditable -> EVENT FILTER TO CONTEXT MENU //TODO disable return to main menu when creating budget because this is the same view as when you create budeget //TODO make budget item throw exception with negative amount @@ -88,29 +94,42 @@ public class BudgetController implements FinanceController { amountCol.setCellValueFactory(new PropertyValueFactory<BudgetItem, Double>("budgetAmount")); descriptionCol.setCellValueFactory(new PropertyValueFactory<BudgetItem, String>("budgetDescription")); + try { + general = loadBudgetDataFromFile("Budget"); + budgetList = FXCollections.observableArrayList(general.getBudgetItems()); + budgetTableView.setItems(budgetList); + + refreshPieChart(); + } catch(IOException ioe) { + sum.setText("Invalid budget file format"); + } catch(IllegalArgumentException iae) { + sum.setText("Cannot load pie charts"); + } //Initialize registers and tableview - general = loadBudgetDataFromFile("Budget"); - budgetList = FXCollections.observableArrayList(general.getBudgetItems()); - budgetTableView.setItems(budgetList); + formatDatePicker(); - //createBudgetPieChart(); //Initialize sum field under the tableview //sum.setText(String.valueOf(general.totalSum())); } - private ObservableList<PieChart.Data> createBudgetPieChart() throws IllegalArgumentException { //TODO DOESNT WORK IF BUDGETITEM HAS NO BUDGET - try { - return FXCollections.observableArrayList( - new Data("Food", general.getBudgetItem(ExpenseCategory.FOOD).getBudgetAmount()), - new Data("Books", general.getBudgetItem(ExpenseCategory.BOOKS).getBudgetAmount()), - new Data("Clothes", - general.getBudgetItem(ExpenseCategory.CLOTHES).getBudgetAmount()), - new Data("Other", general.getBudgetItem(ExpenseCategory.OTHER).getBudgetAmount()) - ); - } catch(IllegalArgumentException iae) { - return FXCollections.observableArrayList(); + private List<ExpenseCategory> getChosenBudgetCategories() { //todo could be moved to generalbudget + return Arrays.stream(ExpenseCategory.values()).toList(). + stream().filter(expenseCategory -> general.hasBudgetCategory(expenseCategory)).toList(); + } + private ObservableList<PieChart.Data> createBudgetPieChart() throws IllegalArgumentException { // + ObservableList<PieChart.Data> budgetData = FXCollections.observableArrayList(); + List<ExpenseCategory> chosenCategories = getChosenBudgetCategories(); + for (ExpenseCategory category : chosenCategories) { + budgetData.add(new Data(category.toString().substring(0, 1).toUpperCase(). + concat(category.toString().substring(1)), + general.getBudgetItem(category).getBudgetAmount())); } + return budgetData; + } + + private void refreshPieChart() { + this.budgetPieChart.setData(createBudgetPieChart()); } /** -- GitLab