Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified spending.db
Binary file not shown.
15 changes: 11 additions & 4 deletions src/main/java/edu/ucsd/spendingtracker/App.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package edu.ucsd.spendingtracker;

import edu.ucsd.spendingtracker.datasource.InMemoryDataSource;
import java.util.ArrayList;
import java.util.List;

import edu.ucsd.spendingtracker.datasource.SqlDataSource;
import edu.ucsd.spendingtracker.model.Model;
import edu.ucsd.spendingtracker.presenter.PresenterManager;
Expand All @@ -9,24 +11,29 @@
import edu.ucsd.spendingtracker.repository.ExpenseRepository;
import edu.ucsd.spendingtracker.view.SpendingView;
import edu.ucsd.spendingtracker.view.SummaryView;
import edu.ucsd.spendingtracker.view.charts.BarChartProvider;
import edu.ucsd.spendingtracker.view.charts.PieChartProvider;
import edu.ucsd.spendingtracker.view.charts.IChartProvider;
import javafx.application.Application;
import javafx.stage.Stage;

public class App extends Application {
@Override
public void start(Stage primaryStage) {
// InMemoryDataSource dataSource = InMemoryDataSource.getDefaultDataSource();
SqlDataSource dataSource = new SqlDataSource();

ExpenseRepository repository = new ExpenseRepository(dataSource);

Model sharedModel = new Model(repository);

SpendingView spendingView = new SpendingView();
SummaryView summaryView = new SummaryView();

List<IChartProvider> chartProviders = new ArrayList<>();
chartProviders.add(new BarChartProvider());
chartProviders.add(new PieChartProvider());

SpendingPresenter listPresenter = new SpendingPresenter(sharedModel, spendingView);
SummaryPresenter summaryPresenter = new SummaryPresenter(sharedModel, summaryView);
SummaryPresenter summaryPresenter = new SummaryPresenter(sharedModel, summaryView, chartProviders);

PresenterManager manager = new PresenterManager();
manager.defineInteractions(primaryStage, "Spending Tracker", listPresenter, summaryPresenter);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,37 @@
package edu.ucsd.spendingtracker.presenter;

import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import edu.ucsd.spendingtracker.model.Expense;
import edu.ucsd.spendingtracker.model.Model;
import edu.ucsd.spendingtracker.view.SummaryView;
import edu.ucsd.spendingtracker.model.Category;
import edu.ucsd.spendingtracker.view.charts.IChartProvider;

import javafx.scene.Node;


public class SummaryPresenter extends AbstractPresenter<SummaryView> {
private Runnable onBack;
private final List<IChartProvider> chartProviders;

public SummaryPresenter(Model model, SummaryView view) {
public SummaryPresenter(Model model, SummaryView view, List<IChartProvider> chartProviders) {
super(model, view);
this.chartProviders = chartProviders;
this.view.getChartSelector().getItems().addAll(this.chartProviders);

if(!this.chartProviders.isEmpty()) {
this.view.getChartSelector().setValue(this.chartProviders.get(0));
}

this.view.getBackButton().setOnAction(e -> {
if (onBack != null)
onBack.run();
});

this.view.getChartSelector().setOnAction(e -> updateView());
}

public void setOnBack(Runnable action) {
Expand All @@ -21,7 +40,28 @@ public void setOnBack(Runnable action) {

@Override
public void updateView() {
List<Expense> expenses = model.getExpenses();
Map<Category, Double> totals = new TreeMap<>();

for (Category cat : Category.values()) {
totals.put(cat, 0.0);
}

for (Expense expense : expenses) {
Category category = expense.getCategory();
double amount = expense.getAmount();

totals.put(category, totals.get(category) + amount);
}

view.setTotal(model.getTotalSpending());

IChartProvider selectedProvider = view.getChartSelector().getValue();

if (selectedProvider != null) {
Node chartNode = selectedProvider.createChart(totals);
view.setChartDisplay(chartNode);
}
}

@Override
Expand Down
49 changes: 47 additions & 2 deletions src/main/java/edu/ucsd/spendingtracker/view/SummaryView.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,57 @@
package edu.ucsd.spendingtracker.view;

import edu.ucsd.spendingtracker.view.charts.IChartProvider;
import javafx.geometry.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.util.StringConverter;
import javafx.scene.Node;

public class SummaryView extends VBox {
private Label totalLabel = new Label();
private Button backButton = new Button("Back to Expenses");

private final ComboBox<IChartProvider> chartSelector = new ComboBox<>();

private final StackPane chartContainer = new StackPane();

public SummaryView() {
this.setAlignment(Pos.CENTER);
this.setSpacing(20);
this.setPadding(new Insets(30));
this.setStyle("-fx-background-color: #FFFFFF;");

Label title = new Label("Total Spending");
Label title = new Label("Spending Analysis");
title.setStyle("-fx-font-size: 20px; -fx-font-weight: bold;");
totalLabel.setStyle("-fx-font-size: 32px; -fx-text-fill: #2E7D32;");

this.getChildren().addAll(title, totalLabel, backButton);
chartSelector.setPromptText("Select Visualization Type");
chartSelector.setPrefWidth(200);

chartSelector.setConverter(new StringConverter<IChartProvider>() {
@Override
public String toString(IChartProvider provider) {
return (provider == null) ? "" : provider.getDisplayName();
}

@Override
public IChartProvider fromString(String string) {
return null;
}
});

chartContainer.setPrefSize(400, 300);
chartContainer.setStyle("-fx-border-color: #EEEEEE; -fx-border-width: 1; -fx-border-radius: 5;");

backButton.setStyle("-fx-background-color: #757575; -fx-text-fill: white;");

this.getChildren().addAll(
title,
totalLabel,
new Label("View Mode: "),
chartSelector,
chartContainer,
backButton);
}

public void setTotal(double total) {
Expand All @@ -27,4 +61,15 @@ public void setTotal(double total) {
public Button getBackButton() {
return backButton;
}

public void setChartDisplay(Node chartNode) {
chartContainer.getChildren().clear();
if(chartNode != null) {
chartContainer.getChildren().add(chartNode);
}
}

public ComboBox<IChartProvider> getChartSelector() {
return chartSelector;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package edu.ucsd.spendingtracker.view.charts;

import edu.ucsd.spendingtracker.model.Category;
import javafx.scene.Node;
import javafx.scene.chart.*;

import java.util.Map;


public class BarChartProvider implements IChartProvider {
@Override
public Node createChart(Map<Category, Double> data) {
CategoryAxis xAxis = new CategoryAxis();
NumberAxis yAxis = new NumberAxis();
BarChart<String, Number> chart = new BarChart<>(xAxis, yAxis);

XYChart.Series<String, Number> series = new XYChart.Series<>();

data.forEach((cat, sum) -> {
series.getData().add(new XYChart.Data<>(cat.name(), sum));
});

chart.getData().add(series);
for (XYChart.Data<String, Number> entry : series.getData()) {
String color = Category.valueOf(entry.getXValue()).color;
Node bar = entry.getNode();
if (bar != null) {
bar.setStyle("-fx-bar-fill: " + color + ";");
}
}

chart.setLegendVisible(false);

return chart;
}

@Override
public String getDisplayName() {
return "Bar Chart";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package edu.ucsd.spendingtracker.view.charts;

import edu.ucsd.spendingtracker.model.Category;
import javafx.scene.Node;
import java.util.Map;

public interface IChartProvider {
Node createChart(Map<Category, Double> data);

String getDisplayName();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package edu.ucsd.spendingtracker.view.charts;

import edu.ucsd.spendingtracker.model.Category;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.chart.PieChart;
import javafx.scene.Node;
import java.util.Map;

public class PieChartProvider implements IChartProvider {
@Override
public Node createChart(Map<Category, Double> data) {
ObservableList<PieChart.Data> chartData = FXCollections.observableArrayList();

data.forEach((cat, sum) -> {
chartData.add(new PieChart.Data(cat.name(), sum));
});

PieChart chart = new PieChart(chartData);

for (PieChart.Data entry : chartData) {
String color = Category.valueOf(entry.getName()).color;
System.out.println(entry.getName());
Node slice = entry.getNode();
if (slice != null) {
slice.setStyle("-fx-pie-color: " + color + ";");
}
}

chart.setLegendVisible(false);

return chart;
}

@Override
public String getDisplayName() {
return "Pie Chart";
}

}
1 change: 1 addition & 0 deletions src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
requires javafx.controls;
requires javafx.fxml;
requires java.sql;
requires javafx.base;

opens edu.ucsd.spendingtracker to javafx.fxml;
exports edu.ucsd.spendingtracker;
Expand Down
Binary file modified target/classes/edu/ucsd/spendingtracker/App.class
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified target/classes/edu/ucsd/spendingtracker/view/SummaryView.class
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified target/classes/module-info.class
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ edu/ucsd/spendingtracker/view/SummaryView.class
edu/ucsd/spendingtracker/presenter/SpendingPresenter.class
edu/ucsd/spendingtracker/model/Model.class
edu/ucsd/spendingtracker/presenter/SummaryPresenter.class
edu/ucsd/spendingtracker/view/charts/PieChartProvider.class
edu/ucsd/spendingtracker/App.class
edu/ucsd/spendingtracker/view/charts/IChartProvider.class
edu/ucsd/spendingtracker/view/charts/BarChartProvider.class
edu/ucsd/spendingtracker/view/SummaryView$1.class
module-info.class
edu/ucsd/spendingtracker/repository/ExpenseRepository.class
edu/ucsd/spendingtracker/datasource/IDataSource.class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@
/Users/rickyzam/Documents/UCSD/CSE110/CSE110-Lab4/src/main/java/edu/ucsd/spendingtracker/repository/ExpenseRepository.java
/Users/rickyzam/Documents/UCSD/CSE110/CSE110-Lab4/src/main/java/edu/ucsd/spendingtracker/view/SpendingView.java
/Users/rickyzam/Documents/UCSD/CSE110/CSE110-Lab4/src/main/java/edu/ucsd/spendingtracker/view/SummaryView.java
/Users/rickyzam/Documents/UCSD/CSE110/CSE110-Lab4/src/main/java/edu/ucsd/spendingtracker/view/charts/BarChartProvider.java
/Users/rickyzam/Documents/UCSD/CSE110/CSE110-Lab4/src/main/java/edu/ucsd/spendingtracker/view/charts/IChartProvider.java
/Users/rickyzam/Documents/UCSD/CSE110/CSE110-Lab4/src/main/java/edu/ucsd/spendingtracker/view/charts/PieChartProvider.java
/Users/rickyzam/Documents/UCSD/CSE110/CSE110-Lab4/src/main/java/module-info.java