Skip to content
Snippets Groups Projects
Select Git revision
  • 7c6c130cd4d5a1805339490696f94ac267bf690b
  • master default
  • renovate/junit-jupiter-engine.version
  • renovate/selenium.version
  • renovate/testcontainer.version
  • demo
  • v1_8_1
  • v2.18.1
  • v2.18.0
  • v2.17.2
  • v2.17.1
  • v2.17.0
  • v2.16.1
  • v2.16.0
  • v2.15.1
  • v2.15.0
  • v2.14.0
  • v2.13.0
  • v2.12.0
  • v2.11.0
  • v2.10.0
  • v2.9.2
  • v2.9.1
  • v2.9.0
  • v2.8.0
  • testPipeline2
  • v2.7.0
27 results

MonthChartGenerator.java

Blame
  • MonthChartGenerator.java 5.91 KiB
    package de.deadlocker8.budgetmaster.logic.chartGenerators;
    
    import java.util.ArrayList;
    
    import de.deadlocker8.budgetmaster.logic.CategoryInOutSum;
    import de.deadlocker8.budgetmaster.logic.Helpers;
    import de.deadlocker8.budgetmaster.logic.MonthInOutSum;
    import javafx.geometry.Insets;
    import javafx.geometry.Orientation;
    import javafx.geometry.Pos;
    import javafx.scene.control.Label;
    import javafx.scene.control.Separator;
    import javafx.scene.control.Tooltip;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.Priority;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.scene.text.TextAlignment;
    import tools.ConvertTo;
    
    public class MonthChartGenerator
    {
    	private ArrayList<MonthInOutSum> monthInOutSums;
    	private String currency;
    
    	public MonthChartGenerator(ArrayList<MonthInOutSum> monthInOutSums, String currency)
    	{
    		this.monthInOutSums = monthInOutSums;		
    		this.currency = currency;
    	}
    
    	public HBox generate()
    	{
    		HBox generatedChart = new HBox();
    		generatedChart.setAlignment(Pos.TOP_CENTER);
    		generatedChart.setSpacing(25);
    
    		double total = getMaximum(monthInOutSums);
    
    		for(MonthInOutSum currentMonthSum : monthInOutSums)
    		{
    			VBox chartPart = new VBox();
    			chartPart.setAlignment(Pos.TOP_CENTER);		
    
    			HBox hboxChart = new HBox();
    			hboxChart.setAlignment(Pos.BOTTOM_CENTER);
    			hboxChart.setSpacing(10);
    			VBox chartIncome = generateChart(currentMonthSum.getSums(), total, true);
    			hboxChart.getChildren().add(chartIncome);
    			HBox.setHgrow(chartIncome, Priority.ALWAYS);
    			VBox chartPayment = generateChart(currentMonthSum.getSums(), total, false);
    			hboxChart.getChildren().add(chartPayment);
    			HBox.setHgrow(chartPayment, Priority.ALWAYS);
    
    			chartPart.getChildren().add(hboxChart);
    			VBox.setVgrow(hboxChart, Priority.ALWAYS);
    
    			Label labelTitle = new Label(currentMonthSum.getDate().toString("MMMM \nYY"));
    			labelTitle.setStyle("-fx-font-size: 12;");
    			labelTitle.setTextAlignment(TextAlignment.CENTER);
    			chartPart.getChildren().add(labelTitle);
    			VBox.setMargin(labelTitle, new Insets(10, 0, 0, 0));
    
    			generatedChart.getChildren().add(chartPart);			
    			generatedChart.getChildren().add(new Separator(Orientation.VERTICAL));
    		}
    
    		return generatedChart;
    	}
    
    	private VBox generateChart(ArrayList<CategoryInOutSum> categoryInOutSums, double total, boolean useBudgetIN)
    	{
    		VBox result = new VBox();									
    		Label labelAmount = new Label(Helpers.NUMBER_FORMAT.format(getTotal(categoryInOutSums, useBudgetIN)).replace(".", ",") + currency);
    		labelAmount.setStyle("-fx-font-size: 12; -fx-font-weight: bold;");
    		result.getChildren().add(labelAmount);
    		VBox.setMargin(labelAmount, new Insets(0, 0, 10, 0));
    
    		VBox chart = new VBox();
    		chart.setAlignment(Pos.BOTTOM_CENTER);
    		
    		for(CategoryInOutSum currentItem : categoryInOutSums)
    		{
    			Label currentPart = new Label();
    			currentPart.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(currentItem.getColor()));
    			currentPart.prefWidthProperty().bind(chart.widthProperty());
    			chart.getChildren().add(currentPart);
    
    			double value;
    			if(useBudgetIN)
    			{
    				value = currentItem.getBudgetIN() / 100.0;
    			}
    			else
    			{
    				value = -currentItem.getBudgetOUT() / 100.0;
    			}
    
    			double percentage = value / total;	
    			
    			currentPart.setMinHeight(0);
    			currentPart.prefHeightProperty().bind(chart.heightProperty().multiply(percentage));	
    
    			Tooltip tooltip = new Tooltip();
    			tooltip.setText(currentItem.getName() + "\n"+ Helpers.NUMBER_FORMAT.format(percentage * 100) + " %\n" + Helpers.NUMBER_FORMAT.format(value).replace(".", ",") + currency);//
    			currentPart.setTooltip(tooltip);
    		}
    
    		result.getChildren().add(chart);
    		VBox.setVgrow(chart, Priority.ALWAYS);
    
    		return result;
    	}
    
    	public GridPane generateLegend()
    	{
    		ArrayList<HBox> legendItems = new ArrayList<>();
    		for(CategoryInOutSum currentItem : monthInOutSums.get(0).getSums())
    		{
    			String label = currentItem.getName();
    			if(label.equals("NONE"))
    			{
    				label = "Keine Kategorie";
    			}
    			legendItems.add(getLegendItem(label, currentItem.getColor()));
    		}
    
    		int legendWidth = (int)Math.ceil(Math.sqrt(legendItems.size()));
    		GridPane legend = new GridPane();
    		legend.setPadding(new Insets(10));
    		legend.setHgap(20);
    		legend.setVgap(10);
    		legend.setAlignment(Pos.CENTER);
    		legend.setStyle("-fx-background-color: #EEEEEE; -fx-border-color: #212121; -fx-border-width: 1; -fx-border-radius: 5;");
    
    		for(int i = 0; i < legendItems.size(); i++)
    		{
    			int columnIndex = i % legendWidth;
    			int rowIndex = i / 4;
    			legend.add(legendItems.get(i), columnIndex, rowIndex);
    		}
    
    		return legend;
    	}
    
    	private HBox getLegendItem(String name, Color color)
    	{
    		HBox legendItem = new HBox();
    		Label labelCircle = new Label();
    		labelCircle.setMinWidth(20);
    		labelCircle.setMinHeight(20);
    		labelCircle.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(color) + "; -fx-background-radius: 50%; -fx-border-width: 1; -fx-border-color: black - fx-border-radius: 50%");
    
    		Label labelText = new Label(name);
    		labelText.setStyle("-fx-font-weight: bold;");
    
    		legendItem.getChildren().add(labelCircle);
    		legendItem.getChildren().add(labelText);
    		HBox.setMargin(labelText, new Insets(0, 0, 0, 5));
    
    		return legendItem;
    	}
    
    	private double getTotal(ArrayList<CategoryInOutSum> categoryInOutSums, boolean useBudgetIN)
    	{
    		double total = 0;
    		for(CategoryInOutSum currentItem : categoryInOutSums)
    		{
    			if(useBudgetIN)
    			{
    				total += currentItem.getBudgetIN() / 100.0;
    			}
    			else
    			{
    				total += -currentItem.getBudgetOUT() / 100.0;
    			}
    		}
    		return total;
    	}
    
    	private double getMaximum(ArrayList<MonthInOutSum> monthInOutSums)
    	{
    		double maximum = 0;
    		for(MonthInOutSum currentItem : monthInOutSums)
    		{
    			if(currentItem.getBudgetIN() > maximum)
    			{
    				maximum = currentItem.getBudgetIN();
    			}
    
    			if(Math.abs(currentItem.getBudgetOUT()) > maximum)
    			{
    				maximum = Math.abs(currentItem.getBudgetOUT());
    			}
    		}
    		return maximum / 100.0;
    	}
    }