diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java index 62aaeb9e254c5237a0ea5cb2b1a88d1eba435ef7..b049de10d75a6207b0988943d6d4a1347e994940 100644 --- a/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java +++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java @@ -20,4 +20,10 @@ public class ColumnOrder { columns.add(column); } + + @Override + public String toString() + { + return "ColumnOrder [columns=" + columns + "]"; + } } \ 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 index f67740ae4e959045076f06b94b7ef08f9737c0cc..60380bd2d412d3c67fb3bd1376e04d880cf190bc 100644 --- a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java +++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java @@ -34,23 +34,17 @@ public class ReportGenerator { private ArrayList<ReportItem> reportItems; private ArrayList<CategoryBudget> categoryBudgets; - private ColumnOrder columnOrder; - private boolean includeBudget; - private boolean splitTable; - private boolean includeCategoryBudgets; + private ReportPreferences reportPreferences; private File savePath; private String currency; private DateTime date; private Budget budget; - public ReportGenerator(ArrayList<ReportItem> reportItems, ArrayList<CategoryBudget> categoryBudgets, ColumnOrder columnOrder, boolean includeBudget, boolean splitTable, boolean includeCategoryBudgets, File savePath, String currency, DateTime date, Budget budget) + public ReportGenerator(ArrayList<ReportItem> reportItems, ArrayList<CategoryBudget> categoryBudgets, ReportPreferences reportPreferences, File savePath, String currency, DateTime date, Budget budget) { this.reportItems = reportItems; this.categoryBudgets = categoryBudgets; - this.columnOrder = columnOrder; - this.includeBudget = includeBudget; - this.splitTable = splitTable; - this.includeCategoryBudgets = includeCategoryBudgets; + this.reportPreferences = reportPreferences; this.savePath = savePath; this.currency = currency; this.date = date; @@ -69,23 +63,23 @@ public class ReportGenerator private PdfPTable generateTable(int tableWidth, AmountType amountType) { - int numberOfColumns = columnOrder.getColumns().size(); + int numberOfColumns = reportPreferences.getColumnOrder().getColumns().size(); int totalIncome = 0; int totalPayment = 0; if(numberOfColumns > 0) { float[] proportions = new float[numberOfColumns]; - for(int i = 0; i < columnOrder.getColumns().size(); i++) + for(int i = 0; i < reportPreferences.getColumnOrder().getColumns().size(); i++) { - proportions[i] = columnOrder.getColumns().get(i).getProportion(); + proportions[i] = reportPreferences.getColumnOrder().getColumns().get(i).getProportion(); } PdfPTable table = new PdfPTable(proportions); table.setWidthPercentage(tableWidth); Font font = new Font(FontFamily.HELVETICA, 8, Font.NORMAL, GrayColor.BLACK); - for(ColumnType column : columnOrder.getColumns()) + for(ColumnType column : reportPreferences.getColumnOrder().getColumns()) { PdfPCell cell = new PdfPCell(new Phrase(column.getName(), font)); cell.setBackgroundColor(GrayColor.LIGHT_GRAY); @@ -112,7 +106,7 @@ public class ReportGenerator } } - for(ColumnType column : columnOrder.getColumns()) + for(ColumnType column : reportPreferences.getColumnOrder().getColumns()) { PdfPCell cell = new PdfPCell(new Phrase(getProperty(currentItem, column), font)); cell.setBackgroundColor(new BaseColor(Color.WHITE)); @@ -164,7 +158,7 @@ public class ReportGenerator document.add(generateHeader()); document.add(Chunk.NEWLINE); - if(includeBudget) + if(reportPreferences.isIncludeBudget()) { Font fontGreen = new Font(FontFamily.HELVETICA, 12, Font.NORMAL, new BaseColor(36, 122, 45)); Font fontRed = new Font(FontFamily.HELVETICA, 12, Font.NORMAL, BaseColor.RED); @@ -180,7 +174,7 @@ public class ReportGenerator document.add(new Paragraph(Localization.getString(Strings.REPORT_HEADLINE_PAYMENTS_OVERVIEW), headerFont)); document.add(Chunk.NEWLINE); - if(splitTable) + if(reportPreferences.isSplitTable()) { document.add(new Paragraph(Localization.getString(Strings.TITLE_INCOMES), smallHeaderFont)); document.add(Chunk.NEWLINE); @@ -210,7 +204,7 @@ public class ReportGenerator } } - if(includeCategoryBudgets) + if(reportPreferences.isIncludeCategoryBudgets()) { document.add(Chunk.NEWLINE); document.add(new Paragraph(Localization.getString(Strings.TITLE_CATEGORY_BUDGETS), headerFont)); diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportPreferences.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportPreferences.java new file mode 100644 index 0000000000000000000000000000000000000000..9f1b89a7b926a360406c5856a25eb72cdfb04362 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportPreferences.java @@ -0,0 +1,80 @@ +package de.deadlocker8.budgetmaster.logic.report; + +public class ReportPreferences +{ + private ColumnOrder columnOrder; + private boolean includeBudget; + private boolean splitTable; + private boolean includeCategoryBudgets; + private ReportSorting reportSorting; + + public ReportPreferences() + { + + } + + public ReportPreferences(ColumnOrder columnOrder, boolean includeBudget, boolean splitTable, boolean includeCategoryBudgets, ReportSorting reportSorting) + { + this.columnOrder = columnOrder; + this.includeBudget = includeBudget; + this.splitTable = splitTable; + this.includeCategoryBudgets = includeCategoryBudgets; + this.reportSorting = reportSorting; + } + + public ColumnOrder getColumnOrder() + { + return columnOrder; + } + + public void setColumnOrder(ColumnOrder columnOrder) + { + this.columnOrder = columnOrder; + } + + public boolean isIncludeBudget() + { + return includeBudget; + } + + public void setIncludeBudget(boolean includeBudget) + { + this.includeBudget = includeBudget; + } + + public boolean isSplitTable() + { + return splitTable; + } + + public void setSplitTable(boolean splitTable) + { + this.splitTable = splitTable; + } + + public boolean isIncludeCategoryBudgets() + { + return includeCategoryBudgets; + } + + public void setIncludeCategoryBudgets(boolean includeCategoryBudgets) + { + this.includeCategoryBudgets = includeCategoryBudgets; + } + + public ReportSorting getReportSorting() + { + return reportSorting; + } + + public void setReportSorting(ReportSorting reportSorting) + { + this.reportSorting = reportSorting; + } + + @Override + public String toString() + { + return "ReportPreferences [columnOrder=" + columnOrder + ", includeBudget=" + includeBudget + ", splitTable=" + splitTable + ", includeCategoryBudgets=" + includeCategoryBudgets + ", reportSorting=" + reportSorting + "]"; + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportSorting.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportSorting.java new file mode 100644 index 0000000000000000000000000000000000000000..3607a97e1230569a8fcf5e478bff1782e21f1b65 --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportSorting.java @@ -0,0 +1,46 @@ +package de.deadlocker8.budgetmaster.logic.report; + +import javafx.scene.control.TableColumn.SortType; + +public class ReportSorting +{ + private ColumnType columnType; + private SortType sortType; + + public ReportSorting() + { + + } + + public ReportSorting(ColumnType columnType, SortType sortType) + { + this.columnType = columnType; + this.sortType = sortType; + } + + public ColumnType getColumnType() + { + return columnType; + } + + public void setColumnType(ColumnType columnType) + { + this.columnType = columnType; + } + + public SortType getSortType() + { + return sortType; + } + + public void setSortType(SortType sortType) + { + this.sortType = sortType; + } + + @Override + public String toString() + { + return "ReportSorting [columnType=" + columnType + ", sortType=" + sortType + "]"; + } +} \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java b/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java index 0aa0e89e7f43e2bfc0d77ddf25cac2e965c69392..3b0c4da6d85cf27f17078403097d5649d4110f26 100644 --- a/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java +++ b/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java @@ -59,4 +59,30 @@ public class FileHelper writer.write(databaseJSON); writer.close(); } + + public static Object loadObjectFromJSON(String fileName, Object objectype) + { + try + { + Gson gson = new Gson(); + Reader reader = Files.newBufferedReader(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8")); + Object preferences = gson.fromJson(reader, objectype.getClass()); + reader.close(); + return preferences; + } + catch(IOException e) + { + return null; + } + } + + public static void saveObjectToJSON(String fileName, Object objectToSave) throws IOException + { + Gson gson = new Gson(); + String jsonString = gson.toJson(objectToSave); + PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER))); + Writer writer = Files.newBufferedWriter(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8")); + writer.write(jsonString); + writer.close(); + } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java b/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java index af57c52c8509fa71620e8a8c737626c6979bb634..d53fa9cea838916d762e41f7418a443076e2b889 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.Optional; @@ -22,7 +23,10 @@ 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 de.deadlocker8.budgetmaster.logic.report.ReportPreferences; +import de.deadlocker8.budgetmaster.logic.report.ReportSorting; import de.deadlocker8.budgetmaster.logic.utils.Colors; +import de.deadlocker8.budgetmaster.logic.utils.FileHelper; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; import de.deadlocker8.budgetmaster.ui.Refreshable; @@ -36,6 +40,7 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; +import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Alert; @@ -47,6 +52,7 @@ import javafx.scene.control.Label; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn.CellDataFeatures; +import javafx.scene.control.TableColumn.SortType; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; @@ -77,6 +83,15 @@ public class ReportController implements Refreshable private Controller controller; private ColumnFilter columnFilter; private String initialReportPath; + + private TableColumn<ReportItem, Integer> columnPosition; + private TableColumn<ReportItem, String> columnDate; + private TableColumn<ReportItem, Boolean> columnIsRepeating; + private TableColumn<ReportItem, String> columnCategory; + private TableColumn<ReportItem, Integer> columnName; + private TableColumn<ReportItem, String> columnDescription; + private TableColumn<ReportItem, Integer> columnRating; + private TableColumn<ReportItem, String> columnAmount; public void init(Controller controller) { @@ -96,13 +111,94 @@ public class ReportController implements Refreshable checkBoxIncludeBudget.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT) + "; -fx-font-size: 14;"); checkBoxSplitTable.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT) + "; -fx-font-size: 14;"); checkBoxIncludeCategoryBudgets.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT) + "; -fx-font-size: 14;"); + refresh(); + prefill(); } - private void initColumnPosition() + private void initColumn(ColumnType columnType, boolean activated) { - TableColumn<ReportItem, Integer> columnPosition = new TableColumn<>(); + switch(columnType) + { + case AMOUNT: + initColumnAmount(activated); + toggleColumn(columnAmount, activated); + break; + case CATEGORY: + initColumnCategory(activated); + toggleColumn(columnCategory, activated); + break; + case DATE: + initColumnDate(activated); + toggleColumn(columnDate, activated); + break; + case DESCRIPTION: + initColumnDescription(activated); + toggleColumn(columnDescription, activated); + break; + case NAME: + initColumnName(activated); + toggleColumn(columnName, activated); + break; + case POSITION: + initColumnPosition(activated); + toggleColumn(columnPosition, activated); + break; + case RATING: + initColumnRating(activated); + toggleColumn(columnRating, activated); + break; + case REPEATING: + initColumnIsRepeating(activated); + toggleColumn(columnIsRepeating, activated); + break; + default: + break; + } + } + + private void prefill() + { + Object loadedObject = FileHelper.loadObjectFromJSON("reportPreferences", new ReportPreferences()); + if(loadedObject != null) + { + ReportPreferences reportPreferences = (ReportPreferences)loadedObject; + checkBoxIncludeBudget.setSelected(reportPreferences.isIncludeBudget()); + checkBoxSplitTable.setSelected(reportPreferences.isSplitTable()); + checkBoxIncludeCategoryBudgets.setSelected(reportPreferences.isIncludeCategoryBudgets()); + + ArrayList<ColumnType> allColumns = new ArrayList<>(Arrays.asList(ColumnType.values())); + + for(ColumnType currentType : reportPreferences.getColumnOrder().getColumns()) + { + initColumn(currentType, true); + allColumns.remove(currentType); + } + + for(ColumnType currentColumn : allColumns) + { + initColumn(currentColumn, false); + } + + //TODO prefill sorting + } + else + { + initColumnPosition(true); + initColumnDate(true); + initColumnIsRepeating(true); + initColumnCategory(true); + initColumnName(true); + initColumnDescription(true); + initColumnRating(true); + initColumnAmount(true); + } + } + + private void initColumnPosition(boolean activated) + { + columnPosition = new TableColumn<>(); columnPosition.setUserData(ColumnType.POSITION); columnPosition.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("position")); columnPosition.setStyle("-fx-alignment: CENTER;"); @@ -112,24 +208,22 @@ public class ReportController implements Refreshable hboxColumnPosition.setSpacing(3); CheckBox checkBoxPositions = new CheckBox(); - checkBoxPositions.setSelected(true); hboxColumnPosition.getChildren().add(checkBoxPositions); Label labelColumnPosition = new Label(Localization.getString(Strings.REPORT_POSITION)); hboxColumnPosition.getChildren().add(labelColumnPosition); checkBoxPositions.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnPosition.setStyle(style); - columnFilter.toggleColumn(ColumnType.POSITION, c); + toggleColumn(columnPosition, c); }); + checkBoxPositions.setSelected(activated); columnPosition.setGraphic(hboxColumnPosition); tableView.getColumns().add(columnPosition); } - private void initColumnDate() + private void initColumnDate(boolean activated) { - TableColumn<ReportItem, String> columnDate = new TableColumn<>(); + columnDate = new TableColumn<>(); columnDate.setUserData(ColumnType.DATE); columnDate.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>() { @@ -159,25 +253,23 @@ public class ReportController implements Refreshable hboxColumnDate.setSpacing(3); CheckBox checkBoxDate = new CheckBox(); - checkBoxDate.setSelected(true); hboxColumnDate.getChildren().add(checkBoxDate); Label labelComlumnDate = new Label(Localization.getString(Strings.REPORT_DATE)); hboxColumnDate.getChildren().add(labelComlumnDate); checkBoxDate.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnDate.setStyle(style); - columnFilter.toggleColumn(ColumnType.DATE, c); + toggleColumn(columnDate, c); }); + checkBoxDate.setSelected(activated); columnDate.setGraphic(hboxColumnDate); columnDate.setComparator(new DateComparator()); tableView.getColumns().add(columnDate); } - private void initColumnIsRepeating() + private void initColumnIsRepeating(boolean activated) { - TableColumn<ReportItem, Boolean> columnIsRepeating = new TableColumn<>(); + columnIsRepeating = new TableColumn<>(); columnIsRepeating.setUserData(ColumnType.REPEATING); columnIsRepeating.setCellValueFactory(new PropertyValueFactory<ReportItem, Boolean>("repeating")); columnIsRepeating.setCellFactory(new Callback<TableColumn<ReportItem, Boolean>, TableCell<ReportItem, Boolean>>() @@ -221,25 +313,23 @@ public class ReportController implements Refreshable hboxColumnIsRepeating.setSpacing(3); CheckBox checkBoxRepeating = new CheckBox(); - checkBoxRepeating.setSelected(true); hboxColumnIsRepeating.getChildren().add(checkBoxRepeating); Label labelColumnIsRepeating = new Label(Localization.getString(Strings.REPORT_REPEATING)); hboxColumnIsRepeating.getChildren().add(labelColumnIsRepeating); checkBoxRepeating.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnIsRepeating.setStyle(style); - columnFilter.toggleColumn(ColumnType.REPEATING, c); + toggleColumn(columnIsRepeating, c); }); + checkBoxRepeating.setSelected(activated); columnIsRepeating.setGraphic(hboxColumnIsRepeating); tableView.getColumns().add(columnIsRepeating); } - private void initColumnCategory() + private void initColumnCategory(boolean activated) { - TableColumn<ReportItem, String> columnCategory = new TableColumn<>(); + columnCategory = new TableColumn<>(); columnCategory.setUserData(ColumnType.CATEGORY); columnCategory.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>() { @@ -256,24 +346,22 @@ public class ReportController implements Refreshable hboxColumnCategory.setSpacing(3); CheckBox checkBoxCategory = new CheckBox(); - checkBoxCategory.setSelected(true); hboxColumnCategory.getChildren().add(checkBoxCategory); Label labelColumnCategory = new Label(Localization.getString(Strings.REPORT_CATEGORY)); hboxColumnCategory.getChildren().add(labelColumnCategory); checkBoxCategory.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnCategory.setStyle(style); - columnFilter.toggleColumn(ColumnType.CATEGORY, c); + toggleColumn(columnCategory, c); }); + checkBoxCategory.setSelected(activated); columnCategory.setGraphic(hboxColumnCategory); tableView.getColumns().add(columnCategory); } - private void initColumnName() + private void initColumnName(boolean activated) { - TableColumn<ReportItem, Integer> columnName = new TableColumn<>(); + columnName = new TableColumn<>(); columnName.setUserData(ColumnType.NAME); columnName.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("name")); columnName.setStyle("-fx-alignment: CENTER;"); @@ -283,24 +371,22 @@ public class ReportController implements Refreshable hboxColumnName.setSpacing(3); CheckBox checkBoxName = new CheckBox(); - checkBoxName.setSelected(true); hboxColumnName.getChildren().add(checkBoxName); Label labelColumnName = new Label(Localization.getString(Strings.REPORT_NAME)); hboxColumnName.getChildren().add(labelColumnName); checkBoxName.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnName.setStyle(style); - columnFilter.toggleColumn(ColumnType.NAME, c); + toggleColumn(columnName, c); }); + checkBoxName.setSelected(activated); columnName.setGraphic(hboxColumnName); tableView.getColumns().add(columnName); } - private void initColumnDescription() + private void initColumnDescription(boolean activated) { - TableColumn<ReportItem, String> columnDescription = new TableColumn<>(); + columnDescription = new TableColumn<>(); columnDescription.setUserData(ColumnType.DESCRIPTION); columnDescription.setCellValueFactory(new PropertyValueFactory<ReportItem, String>("description")); columnDescription.setStyle("-fx-alignment: CENTER;"); @@ -310,24 +396,22 @@ public class ReportController implements Refreshable hboxColumnDescription.setSpacing(3); CheckBox checkBoxDescription = new CheckBox(); - checkBoxDescription.setSelected(true); hboxColumnDescription.getChildren().add(checkBoxDescription); Label labelColumnDescription = new Label(Localization.getString(Strings.REPORT_DESCRIPTION)); hboxColumnDescription.getChildren().add(labelColumnDescription); checkBoxDescription.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnDescription.setStyle(style); - columnFilter.toggleColumn(ColumnType.DESCRIPTION, c); + toggleColumn(columnDescription, c); }); + checkBoxDescription.setSelected(activated); columnDescription.setGraphic(hboxColumnDescription); tableView.getColumns().add(columnDescription); } - private void initColumnRating() + private void initColumnRating(boolean activated) { - TableColumn<ReportItem, Integer> columnRating = new TableColumn<>(); + columnRating = new TableColumn<>(); columnRating.setUserData(ColumnType.RATING); columnRating.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("amount")); columnRating.setCellFactory(new Callback<TableColumn<ReportItem, Integer>, TableCell<ReportItem, Integer>>() @@ -371,25 +455,34 @@ public class ReportController implements Refreshable hboxColumnRating.setSpacing(3); CheckBox checkBoxRating = new CheckBox(); - checkBoxRating.setSelected(true); hboxColumnRating.getChildren().add(checkBoxRating); Label labelColumnRating = new Label(Localization.getString(Strings.REPORT_RATING)); hboxColumnRating.getChildren().add(labelColumnRating); checkBoxRating.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnRating.setStyle(style); - columnFilter.toggleColumn(ColumnType.RATING, c); + toggleColumn(columnRating, c); }); + checkBoxRating.setSelected(activated); columnRating.setGraphic(hboxColumnRating); columnRating.setComparator(new RatingComparator()); tableView.getColumns().add(columnRating); } - private void initColumnAmount() + private void toggleColumn(TableColumn<ReportItem, ?> column, boolean activated) + { + String style = activated ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); + Node graphic = column.getGraphic(); + if(graphic != null) + { + graphic.setStyle(style); + } + columnFilter.toggleColumn((ColumnType)column.getUserData(), activated); + } + + private void initColumnAmount(boolean activated) { - TableColumn<ReportItem, String> columnAmount = new TableColumn<>(); + columnAmount = new TableColumn<>(); columnAmount.setUserData(ColumnType.AMOUNT); columnAmount.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>() { @@ -409,19 +502,17 @@ public class ReportController implements Refreshable hboxColumnAmount.setSpacing(3); CheckBox checkBoxAmount = new CheckBox(); - checkBoxAmount.setSelected(true); hboxColumnAmount.getChildren().add(checkBoxAmount); Label labelColumnAmount = new Label(Localization.getString(Strings.REPORT_AMOUNT)); hboxColumnAmount.getChildren().add(labelColumnAmount); checkBoxAmount.selectedProperty().addListener((a, b, c)->{ - String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED); - hboxColumnAmount.setStyle(style); - columnFilter.toggleColumn(ColumnType.AMOUNT, c); + toggleColumn(columnAmount, c); }); + checkBoxAmount.setSelected(activated); columnAmount.setGraphic(hboxColumnAmount); - tableView.getColumns().add(columnAmount); + tableView.getColumns().add(columnAmount); } private void initTable() @@ -438,14 +529,9 @@ public class ReportController implements Refreshable tableView.setFixedCellSize(26); - initColumnPosition(); - initColumnDate(); - initColumnIsRepeating(); - initColumnCategory(); - initColumnName(); - initColumnDescription(); - initColumnRating(); - initColumnAmount(); + tableView.setOnSort((event)->{ + System.out.println("sort"); + }); } public void filter() @@ -517,6 +603,35 @@ public class ReportController implements Refreshable { columnOrder.addColumn(currentType); } + } + + ReportSorting reportSorting = new ReportSorting(); + ObservableList<TableColumn<ReportItem, ?>> sortOrder = tableView.getSortOrder(); + if(sortOrder.size() > 0) + { + reportSorting.setColumnType((ColumnType)sortOrder.get(0).getUserData()); + reportSorting.setSortType(sortOrder.get(0).getSortType()); + } + else + { + reportSorting.setColumnType(ColumnType.DATE); + reportSorting.setSortType(SortType.DESCENDING); + } + + ReportPreferences reportPreferences = new ReportPreferences(columnOrder, + checkBoxIncludeBudget.isSelected(), + checkBoxSplitTable.isSelected(), + checkBoxIncludeCategoryBudgets.isSelected(), + reportSorting); + + //save report preferences + try + { + FileHelper.saveObjectToJSON("reportPreferences", reportPreferences); + } + catch(IOException e2) + { + Logger.error(e2); } FileChooser fileChooser = new FileChooser(); @@ -531,10 +646,7 @@ public class ReportController implements Refreshable ReportGenerator reportGenerator = new ReportGenerator(new ArrayList<ReportItem>(tableView.getItems()), controller.getCategoryBudgets(), - columnOrder, - checkBoxIncludeBudget.isSelected(), - checkBoxSplitTable.isSelected(), - checkBoxIncludeCategoryBudgets.isSelected(), + reportPreferences, file, controller.getSettings().getCurrency(), controller.getCurrentDate(),