package no.ntnu.idatt1002.demo.controller; import java.io.IOException; import java.time.LocalDate; import java.util.Arrays; import java.util.List; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.DatePicker; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; 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.ExpenseCategory; import no.ntnu.idatt1002.demo.data.Economics.ExpenseRegister; import no.ntnu.idatt1002.demo.data.Economics.FileHandling; import no.ntnu.idatt1002.demo.data.Economics.IncomeRegister; import no.ntnu.idatt1002.demo.data.Economics.Overview; public class MainMenu { @FXML private Label balanceLbl; @FXML private ProgressBar bookBar; @FXML private Label bookLbl; @FXML private Button budgetBtn; @FXML private ProgressBar clothesBar; @FXML private Label clothesLbl; @FXML private DatePicker date; @FXML private Button expenseBtn; @FXML private ProgressBar foodBar; @FXML private Button foodBtn; @FXML private Label foodLbl; @FXML private Button incomeBtn; @FXML private ProgressBar mainBar; @FXML private ProgressBar otherBar; @FXML private Label otherLbl; @FXML private Button returnBtn; @FXML private Label title; @FXML private Label usageLbl; @FXML private AnchorPane root; @FXML private Label daysLeftLbl; GeneralBudget generalBudget; ExpenseRegister expenseRegister; IncomeRegister incomeRegister; FileHandling fileHandling; Overview overview; @FXML public void initialize() { fileHandling = new FileHandling(); //Initialize all registers + overview try { incomeRegister = loadIncomeDataFromFile("Income"); expenseRegister = loadExpenseDataFromFile("Expense"); generalBudget = loadBudgetDataFromFile("Budget"); } catch (IOException ioe) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Could not load register data"); alert.setHeaderText("Could not load register data"); alert.setContentText("There was an error loading in the registers"); alert.showAndWait(); } overview = new Overview(incomeRegister, expenseRegister, generalBudget); mainBar.setStyle("-fx-accent: green;"); refreshProgressBars(); refreshLabels(); //Set progress when opening scene double maxAmount = generalBudget.getMaxAmount(); double expenseSum = expenseRegister.getTotalSum(); //Displaying month title.setText("BUDGET " + (LocalDate.now().getMonth())); double balance = maxAmount - expenseSum; //Set balance balanceLbl.setText("Balance: " + (balance)); //Displaying how much of the monthly budget has been spent. usageLbl.setText("Used " + expenseSum + " out of " + generalBudget.getMaxAmount()); if (balance < 0) { balanceLbl.setTextFill(Color.RED); } //Make calendar uneditable formatDatePicker(); daysLeftLbl.setText("Days left: 31"); //date.restrict } private void refreshLabels() { } /** * Sets the progress of the progress bars to their most updated data. */ private void refreshProgressBars() { mainBar.setProgress(expenseRegister.getTotalSum()/generalBudget.getMaxAmount()); foodBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.FOOD).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.FOOD))/generalBudget.getBudgetItem(ExpenseCategory.FOOD).getBudgetAmount()); clothesBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.CLOTHES).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.CLOTHES))/generalBudget.getBudgetItem(ExpenseCategory.CLOTHES).getBudgetAmount()); bookBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.BOOKS).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.BOOKS))/generalBudget.getBudgetItem(ExpenseCategory.BOOKS).getBudgetAmount()); otherBar.setProgress((generalBudget.getBudgetItem(ExpenseCategory.OTHER).getBudgetAmount() - overview.getBudgetItemMinusExpense(ExpenseCategory.OTHER))/generalBudget.getBudgetItem(ExpenseCategory.OTHER).getBudgetAmount()); } /** * Method that either reads data from a file with which it fills an income register, if older changes exist, or instantiates an income register if the file is empty. * @param fileName The name of the file that is being read from. * @return An object of type IncomeRegister. * @throws IOException If an error occurs while reading from the file. */ public IncomeRegister loadIncomeDataFromFile(String fileName) throws IOException { //Instantiate incomeRegister if (fileHandling.isEmpty(fileName)) { incomeRegister = new IncomeRegister(); } else { //Load previous income register try { incomeRegister = fileHandling.readIncomeRegisterFromFile(fileName); } catch (IOException e) { e.printStackTrace(); } } return incomeRegister; } /** * Method that either reads data from a file with which it fills an expense register, if older changes exist, or instantiates an expense register if the file is empty. * @param fileName The name of the file that is being read from. * @return An object of type IncomeRegister. * @throws IOException If an error occurs while reading from the file. */ public ExpenseRegister loadExpenseDataFromFile(String fileName) throws IOException { //Instantiate expense register if (fileHandling.isEmpty(fileName)) { expenseRegister = new ExpenseRegister(); } else { try { expenseRegister = fileHandling.readExpenseRegisterFromFile(fileName); } catch (IOException e) { e.printStackTrace(); } } return expenseRegister; } /** * Method that either reads data from a file with which it fills a budget register, if this is an old budget, or instantiates a budget register if this is a new budget. * @param fileName The name of the file that is being read from. * @return An object of type GeneralBudget. * @throws IOException If an error occurs while reading from the file. */ public GeneralBudget loadBudgetDataFromFile(String fileName) throws IOException { FileHandlingBudget fileHandlingBudget = new FileHandlingBudget(); //Instantiate new budget if (fileHandlingBudget.isEmpty(fileName)) { generalBudget = new GeneralBudget(1000); } else { //Load previous budget try { generalBudget = fileHandlingBudget.readGeneralBudgetFromFile(fileName); } catch (IOException e) { e.printStackTrace(); } } return generalBudget; } /** * Method for disabling the date picker, yet having its opacity at max. */ private void formatDatePicker() { date.setValue(LocalDate.now()); date.setDisable(true); date.setStyle("-fx-opacity: 1"); date.getEditor().setStyle("-fx-opacity: 1"); } @FXML private void switchScene(ActionEvent event) throws IOException { FXMLLoader loader = new FXMLLoader(); if (event.getSource() == foodBtn) { System.out.println("Food button pressed"); } else if (event.getSource() == expenseBtn) { loader.setLocation(getClass().getResource("/view/IncomeAndExpenses.fxml")); } else if (event.getSource() == incomeBtn) { loader.setLocation(getClass().getResource("/view/IncomeAndExpenses.fxml")); } else if (event.getSource() == budgetBtn) { loader.setLocation(getClass().getResource("/view/BudgetNewest.fxml")); } else if (event.getSource() == returnBtn) { loader.setLocation(getClass().getResource("/view/FirstMenu.fxml")); } Parent root = loader.load(); Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); Scene scene = new Scene(root); stage.setScene(scene); stage.setResizable(false); stage.show(); } }