diff --git a/pom.xml b/pom.xml index 7171a69f22bd6570cca29fa865ec5ae5357aa52d..fee0e286908f96732d52fe82567d1d3f4891e761 100644 --- a/pom.xml +++ b/pom.xml @@ -57,5 +57,10 @@ <artifactId>joda-time</artifactId> <version>2.9.7</version> </dependency> + <dependency> + <groupId>com.itextpdf</groupId> + <artifactId>itextpdf</artifactId> + <version>5.0.6</version> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnFilter.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..cf722850917b0d79e28735d4763cf26981940fff --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnFilter.java @@ -0,0 +1,45 @@ +package de.deadlocker8.budgetmaster.logic.report; + +import java.util.HashSet; + +public class ColumnFilter +{ + private HashSet<ColumnType> columns; + + public ColumnFilter() + { + columns = new HashSet<ColumnType>(); + } + + public void addColumn(ColumnType column) + { + columns.add(column); + } + + public void removeColumn(ColumnType column) + { + columns.remove(column); + } + + public void toggleColumn(ColumnType column, boolean add) + { + if(add) + { + columns.add(column); + } + else + { + columns.remove(column); + } + } + + public HashSet<ColumnType> getColumns() + { + return columns; + } + + public boolean containsColumn(ColumnType column) + { + return columns.contains(column); + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java new file mode 100644 index 0000000000000000000000000000000000000000..62aaeb9e254c5237a0ea5cb2b1a88d1eba435ef7 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java @@ -0,0 +1,23 @@ +package de.deadlocker8.budgetmaster.logic.report; + +import java.util.ArrayList; + +public class ColumnOrder +{ + private ArrayList<ColumnType> columns; + + public ColumnOrder() + { + columns = new ArrayList<ColumnType>(); + } + + public ArrayList<ColumnType> getColumns() + { + return columns; + } + + public void addColumn(ColumnType column) + { + columns.add(column); + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java new file mode 100644 index 0000000000000000000000000000000000000000..22d5fae4a3669e76ab33d3d457b49619c39b68e0 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java @@ -0,0 +1,6 @@ +package de.deadlocker8.budgetmaster.logic.report; + +public enum ColumnType +{ + POSITION, DATE, REPEATING, CATEGORY, NAME, DESCRIPTION, RATING, AMOUNT +} diff --git a/src/de/deadlocker8/budgetmaster/logic/report/HeaderFooterPageEvent.java b/src/de/deadlocker8/budgetmaster/logic/report/HeaderFooterPageEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..9835447d1a281711e50d9882638a5bcd3014e2b0 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/HeaderFooterPageEvent.java @@ -0,0 +1,25 @@ +package de.deadlocker8.budgetmaster.logic.report; + +import org.joda.time.DateTime; + +import com.itextpdf.text.Document; +import com.itextpdf.text.Element; +import com.itextpdf.text.Phrase; +import com.itextpdf.text.pdf.ColumnText; +import com.itextpdf.text.pdf.PdfPageEventHelper; +import com.itextpdf.text.pdf.PdfWriter; + +public class HeaderFooterPageEvent extends PdfPageEventHelper +{ + public void onStartPage(PdfWriter writer, Document document) + { + + } + + public void onEndPage(PdfWriter writer, Document document) + { + ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("BudgetMaster Monatsbericht"), 100, 25, 0); + ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Seite " + document.getPageNumber()), 300, 25, 0); + ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(DateTime.now().toString("dd.MM.YYYY")), 500, 25, 0); + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java new file mode 100644 index 0000000000000000000000000000000000000000..e832b411f6f3115f15ad2b8013d33a7ac0c2089a --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java @@ -0,0 +1,130 @@ +package de.deadlocker8.budgetmaster.logic.report; + +import java.awt.Color; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.util.ArrayList; + +import org.joda.time.DateTime; + +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Chapter; +import com.itextpdf.text.Chunk; +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Element; +import com.itextpdf.text.Font; +import com.itextpdf.text.Font.FontFamily; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.Phrase; +import com.itextpdf.text.pdf.GrayColor; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; + +import de.deadlocker8.budgetmaster.logic.Helpers; + +public class ReportGenerator +{ + private ArrayList<ReportItem> reportItems; + private ColumnOrder columnOrder; + private boolean splitTable; + private boolean includeCategoryBudgets; + private boolean descending; + private File savePath; + private String currency; + private DateTime date; + + public ReportGenerator(ArrayList<ReportItem> reportItems, ColumnOrder columnOrder, boolean splitTable, boolean includeCategoryBudgets, boolean descending, File savePath, String currency, DateTime date) + { + this.reportItems = reportItems; + this.columnOrder = columnOrder; + this.splitTable = splitTable; + this.includeCategoryBudgets = includeCategoryBudgets; + this.descending = descending; + this.savePath = savePath; + this.currency = currency; + this.date = date; + } + + public void generate() throws FileNotFoundException, DocumentException + { + Document document = new Document(); + PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(savePath)); + writer.setPageEvent(new HeaderFooterPageEvent()); + document.open(); + + //header + Font chapterFont = new Font(FontFamily.HELVETICA, 16, Font.BOLDITALIC); + Font paragraphFont = new Font(FontFamily.HELVETICA, 12, Font.NORMAL); + Chunk chunk = new Chunk("Monatsbericht - " + date.toString("MMMM yyyy"), chapterFont); + Chapter chapter = new Chapter(new Paragraph(chunk), 1); + chapter.setNumberDepth(0); + chapter.add(Chunk.NEWLINE); + chapter.add(new Paragraph("Buchungen", paragraphFont)); + document.add(chapter); + document.add(Chunk.NEWLINE); + + //table + int numberOfColumns = columnOrder.getColumns().size(); + if(numberOfColumns > 0) + { + PdfPTable table = new PdfPTable(numberOfColumns); + table.setWidthPercentage(100); + Font font = new Font(FontFamily.HELVETICA, 8, Font.NORMAL, GrayColor.BLACK); + + for(ColumnType column : columnOrder.getColumns()) + { + // TODO get string for enum type + PdfPCell cell = new PdfPCell(new Phrase(column.toString(), font)); + cell.setBackgroundColor(GrayColor.LIGHT_GRAY); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(cell); + } + + + for(ReportItem currentItem : reportItems) + { + for(ColumnType column : columnOrder.getColumns()) + { + PdfPCell cell = new PdfPCell(new Phrase(getProperty(currentItem, column), font)); + cell.setBackgroundColor(new BaseColor(Color.WHITE)); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(cell); + } + } + + + document.add(table); + } + + document.close(); + } + + private String getProperty(ReportItem reportItem, ColumnType columnType) + { + switch(columnType) + { + case AMOUNT: + return String.valueOf(Helpers.NUMBER_FORMAT.format(reportItem.getAmount() / 100.0).replace(".", ",")) + " " + currency; + case CATEGORY: + return reportItem.getCategory().getName(); + case DATE: + return reportItem.getDate(); + case DESCRIPTION: + return reportItem.getDescription(); + case NAME: + return reportItem.getName(); + case POSITION: + return String.valueOf(reportItem.getPosition()); + case RATING: + return reportItem.getAmount() > 0 ? "+" : "-"; + case REPEATING: + //TODO icon + return String.valueOf(reportItem.getRepeating()); + default: + return null; + } + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/ReportItem.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportItem.java similarity index 93% rename from src/de/deadlocker8/budgetmaster/logic/ReportItem.java rename to src/de/deadlocker8/budgetmaster/logic/report/ReportItem.java index 2090e787a5a3a8ae325f9964f317e10c1b9eceeb..d155a69481267a722b24355ae233374f3acc8ea1 100644 --- a/src/de/deadlocker8/budgetmaster/logic/ReportItem.java +++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportItem.java @@ -1,4 +1,6 @@ -package de.deadlocker8.budgetmaster.logic; +package de.deadlocker8.budgetmaster.logic.report; + +import de.deadlocker8.budgetmaster.logic.Category; public class ReportItem { diff --git a/src/de/deadlocker8/budgetmaster/ui/ReportController.java b/src/de/deadlocker8/budgetmaster/ui/ReportController.java index 902a7c51c026c9924ef9aab74ddc2a142c09a228..6ebeaf74918d3b1d34ec437ce4a6ea777a926bba 100644 --- a/src/de/deadlocker8/budgetmaster/ui/ReportController.java +++ b/src/de/deadlocker8/budgetmaster/ui/ReportController.java @@ -1,18 +1,26 @@ package de.deadlocker8.budgetmaster.ui; +import java.awt.Desktop; +import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.Optional; import de.deadlocker8.budgetmaster.logic.FilterSettings; import de.deadlocker8.budgetmaster.logic.Helpers; import de.deadlocker8.budgetmaster.logic.Payment; import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry; -import de.deadlocker8.budgetmaster.logic.ReportItem; +import de.deadlocker8.budgetmaster.logic.report.ColumnFilter; +import de.deadlocker8.budgetmaster.logic.report.ColumnOrder; +import de.deadlocker8.budgetmaster.logic.report.ColumnType; +import de.deadlocker8.budgetmaster.logic.report.ReportGenerator; +import de.deadlocker8.budgetmaster.logic.report.ReportItem; import fontAwesome.FontIcon; import fontAwesome.FontIconType; +import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; @@ -23,7 +31,10 @@ import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; 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.ButtonType; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.TableCell; @@ -37,6 +48,8 @@ import javafx.stage.Modality; import javafx.stage.Stage; import javafx.util.Callback; import logger.Logger; +import tools.AlertGenerator; +import tools.Worker; public class ReportController implements Refreshable { @@ -44,13 +57,14 @@ public class ReportController implements Refreshable @FXML private Label labelPayments; @FXML private Label labelFilterActive; @FXML private CheckBox checkBoxSplitTable; - @FXML private CheckBox checkBoxIncludeChart; + @FXML private CheckBox checkBoxIncludeCategoryBudgets; @FXML private CheckBox checkBoxDescending; @FXML private Button buttonFilter; @FXML private Button buttonGenerate; @FXML private TableView<ReportItem> tableView; private Controller controller; + private ColumnFilter columnFilter; public void init(Controller controller) { @@ -79,7 +93,7 @@ public class ReportController implements Refreshable buttonFilter.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); buttonGenerate.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); checkBoxSplitTable.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;"); - checkBoxIncludeChart.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;"); + checkBoxIncludeCategoryBudgets.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;"); checkBoxDescending.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;"); refresh(); @@ -87,24 +101,33 @@ public class ReportController implements Refreshable private void initTable() { + columnFilter = new ColumnFilter(); + for(ColumnType type : ColumnType.values()) + { + columnFilter.addColumn(type); + } + Label labelPlaceholder = new Label("Keine Daten verfügbar"); labelPlaceholder.setStyle("-fx-font-size: 16"); tableView.setPlaceholder(labelPlaceholder); TableColumn<ReportItem, Integer> columnPosition = new TableColumn<>("Nr."); + columnPosition.setUserData(ColumnType.POSITION); columnPosition.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("position")); columnPosition.setStyle("-fx-alignment: CENTER;"); CheckBox checkBoxPositions = new CheckBox(); checkBoxPositions.setSelected(true); checkBoxPositions.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnPosition.setStyle(style); + columnPosition.setStyle(style); + columnFilter.toggleColumn(ColumnType.POSITION, c); }); columnPosition.setGraphic(checkBoxPositions); columnPosition.setSortable(false); tableView.getColumns().add(columnPosition); TableColumn<ReportItem, String> columnDate = new TableColumn<>("Datum"); + columnDate.setUserData(ColumnType.DATE); columnDate.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>() { @Override @@ -131,13 +154,15 @@ public class ReportController implements Refreshable checkBoxDate.setSelected(true); checkBoxDate.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnDate.setStyle(style); + columnDate.setStyle(style); + columnFilter.toggleColumn(ColumnType.DATE, c); }); columnDate.setGraphic(checkBoxDate); columnDate.setSortable(false); tableView.getColumns().add(columnDate); TableColumn<ReportItem, Boolean> columnIsRepeating = new TableColumn<>("Wiederholend"); + columnIsRepeating.setUserData(ColumnType.REPEATING); columnIsRepeating.setCellValueFactory(new PropertyValueFactory<ReportItem, Boolean>("repeating")); columnIsRepeating.setCellFactory(new Callback<TableColumn<ReportItem, Boolean>, TableCell<ReportItem, Boolean>>() { @@ -176,13 +201,15 @@ public class ReportController implements Refreshable checkBoxRepeating.setSelected(true); checkBoxRepeating.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnIsRepeating.setStyle(style); + columnIsRepeating.setStyle(style); + columnFilter.toggleColumn(ColumnType.REPEATING, c); }); columnIsRepeating.setGraphic(checkBoxRepeating); columnIsRepeating.setSortable(false); tableView.getColumns().add(columnIsRepeating); TableColumn<ReportItem, String> columnCategory = new TableColumn<>("Kategorie"); + columnCategory.setUserData(ColumnType.CATEGORY); columnCategory.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>() { @Override @@ -201,39 +228,45 @@ public class ReportController implements Refreshable checkBoxCategory.setSelected(true); checkBoxCategory.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnCategory.setStyle(style); + columnCategory.setStyle(style); + columnFilter.toggleColumn(ColumnType.CATEGORY, c); }); columnCategory.setGraphic(checkBoxCategory); columnCategory.setSortable(false); tableView.getColumns().add(columnCategory); TableColumn<ReportItem, Integer> columnName = new TableColumn<>("Name"); + columnName.setUserData(ColumnType.NAME); columnName.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("name")); columnName.setStyle("-fx-alignment: CENTER;"); CheckBox checkBoxName = new CheckBox(); checkBoxName.setSelected(true); checkBoxName.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnName.setStyle(style); + columnName.setStyle(style); + columnFilter.toggleColumn(ColumnType.NAME, c); }); columnName.setGraphic(checkBoxName); columnName.setSortable(false); tableView.getColumns().add(columnName); TableColumn<ReportItem, Integer> columnDescription = new TableColumn<>("Notiz"); + columnDescription.setUserData(ColumnType.DESCRIPTION); columnDescription.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("description")); columnDescription.setStyle("-fx-alignment: CENTER;"); CheckBox checkBoxDescription = new CheckBox(); checkBoxDescription.setSelected(true); checkBoxDescription.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnDescription.setStyle(style); + columnDescription.setStyle(style); + columnFilter.toggleColumn(ColumnType.DESCRIPTION, c); }); columnDescription.setGraphic(checkBoxDescription); columnDescription.setSortable(false); tableView.getColumns().add(columnDescription); TableColumn<ReportItem, Integer> columnRating = new TableColumn<>("Bewertung"); + columnRating.setUserData(ColumnType.RATING); columnRating.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("amount")); columnRating.setCellFactory(new Callback<TableColumn<ReportItem, Integer>, TableCell<ReportItem, Integer>>() { @@ -271,13 +304,15 @@ public class ReportController implements Refreshable checkBoxRating.setSelected(true); checkBoxRating.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnRating.setStyle(style); + columnRating.setStyle(style); + columnFilter.toggleColumn(ColumnType.RATING, c); }); columnRating.setGraphic(checkBoxRating); columnRating.setSortable(false); tableView.getColumns().add(columnRating); TableColumn<ReportItem, String> columnAmount = new TableColumn<>("Betrag"); + columnAmount.setUserData(ColumnType.AMOUNT); columnAmount.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>() { @Override @@ -294,7 +329,8 @@ public class ReportController implements Refreshable checkBoxAmount.setSelected(true); checkBoxAmount.selectedProperty().addListener((a, b, c)->{ String style = c ? "" : "-fx-background-color: salmon"; - columnAmount.setStyle(style); + columnAmount.setStyle(style); + columnFilter.toggleColumn(ColumnType.AMOUNT, c); }); columnAmount.setGraphic(checkBoxAmount); columnAmount.setSortable(false); @@ -360,9 +396,108 @@ public class ReportController implements Refreshable } } + @SuppressWarnings("rawtypes") public void generate() { + ColumnOrder columnOrder = new ColumnOrder(); + for(TableColumn currentColumn : tableView.getColumns()) + { + ColumnType currentType = (ColumnType)currentColumn.getUserData(); + if(columnFilter.containsColumn(currentType)) + { + columnOrder.addColumn(currentType); + } + } + //DEBUG +// FileChooser fileChooser = new FileChooser(); +// fileChooser.setTitle("Bericht speichern"); +// FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PDF (*.pdf)", "*.pdf"); +// fileChooser.getExtensionFilters().add(extFilter); +// File file = fileChooser.showSaveDialog(controller.getStage()); + File file = new File("C:/Users/ROGO2/Desktop/123.pdf"); + if(file != null) + { + ReportGenerator reportGenerator = new ReportGenerator(new ArrayList<ReportItem>(tableView.getItems()), + columnOrder, + checkBoxSplitTable.isSelected(), + checkBoxIncludeCategoryBudgets.isSelected(), + checkBoxDescending.isSelected(), + file, + controller.getSettings().getCurrency(), + controller.getCurrentDate()); + + Stage modalStage = Helpers.showModal("Vorgang läuft", "Der Monatsbericht wird erstellt, bitte warten...", controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + reportGenerator.generate(); + + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + + controller.showNotification("Bericht erfolgreich gespeichert"); + + Alert alert = new Alert(AlertType.INFORMATION); + alert.setTitle("Erfolgreich erstellt"); + alert.setHeaderText(""); + alert.setContentText("Der Monatsbericht wurde erfolgreich erstellt"); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + + ButtonType buttonTypeOne = new ButtonType("Ordner öffnen"); + ButtonType buttonTypeTwo = new ButtonType("Bericht öffnen"); + ButtonType buttonTypeThree = new ButtonType("OK"); + alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeThree); + + Optional<ButtonType> result = alert.showAndWait(); + if (result.get() == buttonTypeOne) + { + try + { + Desktop.getDesktop().open(new File(file.getParent().replace("\\", "/"))); + } + catch(IOException e1) + { + Logger.error(e1); + AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Der Ordner konnte nicht geöffnet werden\n\n" + e1.getMessage(), controller.getIcon(), controller.getStage(), null, false); + } + } + else if (result.get() == buttonTypeTwo) + { + try + { + Desktop.getDesktop().open(new File(file.getAbsolutePath().replace("\\", "/"))); + } + catch(IOException e1) + { + Logger.error(e1); + AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Der Bericht konnte nicht geöffnet werden\n\n" + e1.getMessage(), controller.getIcon(), controller.getStage(), null, false); + } + } + else + { + alert.close(); + } + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Beim Erstellen des Monatsberichts ist ein Fehler aufgetreten:\n\n" + e.getMessage(), controller.getIcon(), controller.getStage(), null, false); + }); + } + }); + } } public Controller getController() diff --git a/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml b/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml index 3d84c457b23c76a3cd270f30d242b6744b946507..f0d20b88c933e60553324b03e59243058d015939 100644 --- a/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml +++ b/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml @@ -12,7 +12,7 @@ <AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmaster.ui.ReportController"> <children> - <VBox alignment="TOP_CENTER" layoutY="24.0" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="25.0"> + <VBox alignment="TOP_CENTER" layoutY="24.0" prefHeight="562.0" prefWidth="772.0" spacing="20.0" AnchorPane.bottomAnchor="35.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="25.0"> <children> <HBox alignment="CENTER" prefHeight="11.0" prefWidth="772.0"> <children> @@ -40,11 +40,14 @@ <VBox spacing="10.0"> <children> <CheckBox fx:id="checkBoxSplitTable" mnemonicParsing="false" text="Einnahmen und Ausgaben als getrennte Tabellen" /> - <CheckBox fx:id="checkBoxIncludeChart" mnemonicParsing="false" text="Diagramm hinzufügen" /> + <CheckBox fx:id="checkBoxIncludeCategoryBudgets" mnemonicParsing="false" text="Verbrauch nach Kategorien hizufügen" /> <CheckBox fx:id="checkBoxDescending" mnemonicParsing="false" text="Neuestes Datum zuerst" /> </children> </VBox> </children> + <VBox.margin> + <Insets /> + </VBox.margin> </HBox> <TableView fx:id="tableView" prefHeight="270.0" prefWidth="772.0" VBox.vgrow="ALWAYS"> <columnResizePolicy> @@ -62,6 +65,9 @@ </children> </VBox> </children> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> </HBox> </children> </VBox>