From e76913409dda60e42cce536361d2b1aadd4e94f1 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 23 Apr 2017 20:11:26 +0200 Subject: [PATCH] added LineChart and todos --- .../chartGenerators/LineChartGenerator.java | 90 +++++++++++++++++++ .../budgetmaster/ui/ChartController.java | 36 ++++++++ .../deadlocker8/budgetmaster/ui/ChartTab.fxml | 52 +++++++++++ 3 files changed, 178 insertions(+) create mode 100644 src/de/deadlocker8/budgetmaster/logic/chartGenerators/LineChartGenerator.java diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LineChartGenerator.java b/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LineChartGenerator.java new file mode 100644 index 000000000..f7eba69ef --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LineChartGenerator.java @@ -0,0 +1,90 @@ +package de.deadlocker8.budgetmaster.logic.chartGenerators; + +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.Helpers; +import de.deadlocker8.budgetmaster.logic.MonthInOutSum; +import javafx.event.EventHandler; +import javafx.geometry.Point2D; +import javafx.scene.Node; +import javafx.scene.chart.CategoryAxis; +import javafx.scene.chart.LineChart; +import javafx.scene.chart.NumberAxis; +import javafx.scene.chart.XYChart; +import javafx.scene.control.Tooltip; +import javafx.scene.input.MouseEvent; + +//TODO ? +public class LineChartGenerator +{ + private ArrayList<MonthInOutSum> monthInOutSums; + private String currency; + + public LineChartGenerator(ArrayList<MonthInOutSum> monthInOutSums, String currency) + { + this.monthInOutSums = monthInOutSums; + this.currency = currency; + } + + public LineChart<String, Number> generate() + { + final CategoryAxis xAxis = new CategoryAxis(); + final NumberAxis yAxis = new NumberAxis(); + final LineChart<String, Number> generatedChart = new LineChart<>(xAxis, yAxis); + generatedChart.setTitle(null); + + xAxis.setLabel(""); + yAxis.setLabel("Summe in " + currency); + + XYChart.Series<String, Number> seriesIN = new XYChart.Series<String, Number>(); + seriesIN.setName("Einnahmen"); + XYChart.Series<String, Number> seriesOUT = new XYChart.Series<String, Number>(); + seriesOUT.setName("Ausgaben"); + + for(MonthInOutSum currentItem : monthInOutSums) + { + String label = currentItem.getDate().toString("MMMM"); + + seriesIN.getData().add(new XYChart.Data<String, Number>(label, currentItem.getBudgetIN()/100.0)); + seriesOUT.getData().add(new XYChart.Data<String, Number>(label, currentItem.getBudgetOUT()/100.0)); + } + + generatedChart.getData().add(seriesIN); + generatedChart.getData().add(seriesOUT); + + generatedChart.setLegendVisible(true); + + // add tooltip to every segment + generatedChart.getData().stream().forEach(tool -> { + for(XYChart.Data<String, Number> data : tool.getData()) + { + Tooltip tooltip = new Tooltip(); + + tooltip.setText(Helpers.NUMBER_FORMAT.format(data.getYValue()).replace(".", ",") + currency); + Tooltip.install(tool.getNode(), tooltip); + Node node = data.getNode(); + node.setOnMouseEntered(new EventHandler<MouseEvent>() + { + @Override + public void handle(MouseEvent event) + { + Point2D p = node.localToScreen(event.getX() + 5, event.getY() + 7); + tooltip.show(node, p.getX(), p.getY()); + } + }); + node.setOnMouseExited(new EventHandler<MouseEvent>() + { + @Override + public void handle(MouseEvent event) + { + tooltip.hide(); + } + }); + } + }); + + //TODO color income green and payments red + + return generatedChart; + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/ChartController.java b/src/de/deadlocker8/budgetmaster/ui/ChartController.java index 6a4113d9a..d2fa8c944 100644 --- a/src/de/deadlocker8/budgetmaster/ui/ChartController.java +++ b/src/de/deadlocker8/budgetmaster/ui/ChartController.java @@ -9,11 +9,13 @@ import de.deadlocker8.budgetmaster.logic.CategoryInOutSum; import de.deadlocker8.budgetmaster.logic.MonthInOutSum; import de.deadlocker8.budgetmaster.logic.ServerConnection; import de.deadlocker8.budgetmaster.logic.chartGenerators.BarChartGenerator; +import de.deadlocker8.budgetmaster.logic.chartGenerators.LineChartGenerator; import de.deadlocker8.budgetmaster.logic.chartGenerators.PieChartGenerator; import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.fxml.FXML; import javafx.scene.chart.BarChart; +import javafx.scene.chart.LineChart; import javafx.scene.control.Accordion; import javafx.scene.control.Button; import javafx.scene.control.DateCell; @@ -32,6 +34,7 @@ public class ChartController implements Refreshable @FXML private HBox hboxChartCategories; @FXML private DatePicker datePickerEnd; @FXML private AnchorPane anchorPaneChartMonth; + @FXML private AnchorPane anchorPaneLineChart; @FXML private Button buttonChartCategoriesShow; private Controller controller; @@ -124,6 +127,35 @@ public class ChartController implements Refreshable //controller.showConnectionErrorAlert(e.getMessage()); } } + + public void chartLineChartShow() + { + //DEBUG get date from comboboxes + DateTime startDate = controller.getCurrentDate().withMonthOfYear(1); + DateTime endDate = controller.getCurrentDate().withMonthOfYear(12); + + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + //DEBUG + ArrayList<MonthInOutSum> sums = connection.getMonthInOutSum(startDate, endDate); + + anchorPaneLineChart.getChildren().clear(); + LineChartGenerator generator = new LineChartGenerator(sums, controller.getSettings().getCurrency()); + LineChart<String, Number> chartMonth = generator.generate(); + anchorPaneLineChart.getChildren().add(chartMonth); + AnchorPane.setTopAnchor(chartMonth, 0.0); + AnchorPane.setRightAnchor(chartMonth, 0.0); + AnchorPane.setBottomAnchor(chartMonth, 0.0); + AnchorPane.setLeftAnchor(chartMonth, 0.0); + } + catch(Exception e) + { + Logger.error(e); + //TODO + //controller.showConnectionErrorAlert(e.getMessage()); + } + } @Override public void refresh() @@ -140,6 +172,10 @@ public class ChartController implements Refreshable //chart month chartMonthShow(); + chartLineChartShow(); + + //TODO combine bar und line chart (radio buttons) + accordion.setExpandedPane(accordion.getPanes().get(0)); } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml b/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml index 41854a762..36aa80c10 100644 --- a/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml +++ b/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml @@ -118,6 +118,58 @@ </VBox> </content> </TitledPane> + <TitledPane animated="false" text="Einnahmen/Ausgaben pro Monat Verlauf"> + <font> + <Font name="System Bold" size="12.0" /> + </font> + <content> + <VBox spacing="20.0"> + <children> + <HBox alignment="CENTER" prefHeight="8.0" prefWidth="750.0"> + <children> + <HBox alignment="CENTER_RIGHT" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label text="Von:"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <ComboBox prefHeight="25.0" prefWidth="100.0" /> + <ComboBox prefWidth="70.0" /> + </children> + <HBox.margin> + <Insets right="15.0" /> + </HBox.margin> + </HBox> + <HBox alignment="CENTER_LEFT" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label text="Bis:"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <ComboBox prefWidth="100.0" /> + <ComboBox prefWidth="70.0" /> + <Button fx:id="buttonChartCategoriesShow11" mnemonicParsing="false" onAction="#chartCategoriesShow"> + <font> + <Font name="System Bold" size="12.0" /> + </font> + <HBox.margin> + <Insets left="15.0" /> + </HBox.margin> + </Button> + </children> + <HBox.margin> + <Insets left="15.0" /> + </HBox.margin> + </HBox> + </children> + </HBox> + <AnchorPane fx:id="anchorPaneLineChart" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" /> + </children> + </VBox> + </content> + </TitledPane> </panes> </Accordion> </children> -- GitLab