diff --git a/build.gradle b/build.gradle index 9d57db0..8991317 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,10 @@ dependencies { compile group: 'org.springframework', name:'spring-context', version: '4.3.1.RELEASE' compile group: 'net.sf.supercsv', name: 'super-csv', version: '2.4.0' compile group: 'commons-validator', name: 'commons-validator', version: '1.5.1' - compile group: 'de.jensd', name: 'fontawesomefx', version: '8.9' + compile group: 'de.jensd', name: 'fontawesomefx-commons', version: '8.12' + compile group: 'de.jensd', name: 'fontawesomefx-fontawesome', version: '4.6.3' + compile group: 'de.jensd', name: 'fontawesomefx-materialdesignfont', version: '1.6.50' + compile group: 'de.jensd', name: 'fontawesomefx-materialicons', version: '2.2.0' compile group: 'org.controlsfx', name: 'controlsfx', version: '8.40.11' compile group: 'com.google.code.gson', name: 'gson', version: '2.7' compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2' diff --git a/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java b/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java index ea2f932..7833e8a 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java @@ -135,6 +135,9 @@ public class SmartCSVController extends FXMLController { @FXML private MenuItem saveAsMenuItem; + @FXML + private MenuItem createConfigMenuItem; + @FXML private MenuItem loadConfigMenuItem; @@ -156,6 +159,9 @@ public class SmartCSVController extends FXMLController { @FXML private Button saveAsButton; + @FXML + private Button createConfigButton; + @FXML private Button loadConfigButton; @@ -199,11 +205,11 @@ public class SmartCSVController extends FXMLController { setupTableCellFactory(); setupErrorSideBar(resourceBundle); - bindMenuItemsToFileExistence(currentCsvFile, saveMenuItem, saveAsMenuItem, addRowMenuItem, loadConfigMenuItem); - bindButtonsToFileExistence(currentCsvFile, saveButton, saveAsButton, addRowButton, loadConfigButton); + bindMenuItemsToContentExistence(currentCsvFile, saveMenuItem, saveAsMenuItem, addRowMenuItem, createConfigMenuItem, loadConfigMenuItem); + bindButtonsToContentExistence(currentCsvFile, saveButton, saveAsButton, addRowButton, createConfigButton, loadConfigButton); - bindMenuItemsToFileExistence(currentConfigFile, saveConfigMenuItem, saveAsConfigMenuItem); - bindButtonsToFileExistence(currentConfigFile, saveAsConfigButton, saveConfigButton); + bindMenuItemsToContentExistence(currentConfigFile, saveConfigMenuItem, saveAsConfigMenuItem); + bindButtonsToContentExistence(currentConfigFile, saveAsConfigButton, saveConfigButton); bindCsvFileName(); bindConfigFileName(); @@ -251,6 +257,13 @@ public class SmartCSVController extends FXMLController { loadFile(JSON_FILTER_TEXT, JSON_FILTER_EXTENSION, "Open Validation Configuration", currentConfigFile); } + @FXML + public void createConfig(ActionEvent actionEvent) { + currentConfigFile.setContent(currentCsvFile.getContent().createValidationConfiguration()); + currentConfigFile.setFile(null); + currentConfigFile.setFileChanged(true); + } + @FXML public void saveCsv(ActionEvent actionEvent) { useSaveFileService(currentCsvFile); @@ -263,7 +276,11 @@ public class SmartCSVController extends FXMLController { @FXML public void saveConfig(ActionEvent actionEvent) { - useSaveFileService(currentConfigFile); + if (currentConfigFile.getFile() == null) { + saveAsConfig(actionEvent); + } else { + useSaveFileService(currentConfigFile); + } } @FXML @@ -375,15 +392,15 @@ public class SmartCSVController extends FXMLController { tableView.getSelectionModel().select(lastRow); } - private void bindMenuItemsToFileExistence(FileStorage file, MenuItem... items) { + private void bindMenuItemsToContentExistence(FileStorage file, MenuItem... items) { for (MenuItem item: items) { - item.disableProperty().bind(isNull(file.fileProperty())); + item.disableProperty().bind(isNull(file.contentProperty())); } } - private void bindButtonsToFileExistence(FileStorage file, Button... items) { + private void bindButtonsToContentExistence(FileStorage file, Button... items) { for (Button item: items) { - item.disableProperty().bind(isNull(file.fileProperty())); + item.disableProperty().bind(isNull(file.contentProperty())); } } @@ -461,50 +478,45 @@ public class SmartCSVController extends FXMLController { File file = fileChooser.showOpenDialog(applicationPane.getScene().getWindow()); if (file != null) { storageFile.setFile(file); - useLoadFileService(storageFile, event -> runLater(() -> { - resetContent(); - storageFile.setFileChanged(false); - })); + useLoadFileService(storageFile, t -> resetContent()); } } - private File saveFile(String filterText, String filter, FileStorage initFile) { - File file = initFile.getFile(); - if (initFile.getContent() != null) { + private File saveFile(String filterText, String filter, FileStorage fileStorage) { + File file = fileStorage.getFile(); + if (fileStorage.getContent() != null) { final FileChooser fileChooser = new FileChooser(); //Set extension filter final FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter(filterText, filter); fileChooser.getExtensionFilters().add(extFilter); - if (initFile.getFile() != null) { - fileChooser.setInitialDirectory(initFile.getFile().getParentFile()); - fileChooser.setInitialFileName(initFile.getFile().getName()); + if (fileStorage.getFile() != null) { + fileChooser.setInitialDirectory(fileStorage.getFile().getParentFile()); + fileChooser.setInitialFileName(fileStorage.getFile().getName()); } fileChooser.setTitle("Save File"); //Show open file dialog file = fileChooser.showSaveDialog(applicationPane.getScene().getWindow()); if (file != null) { - initFile.setFile(file); - useSaveFileService(currentCsvFile); + fileStorage.setFile(file); + useSaveFileService(fileStorage); } } return file; } - private void useLoadFileService(FileStorage fileStorage, EventHandler value) { + private void useLoadFileService(FileStorage fileStorage, EventHandler onSucceededHandler) { loadFileService.setFileStorage(fileStorage); loadFileService.restart(); - loadFileService.setOnSucceeded(value); + loadFileService.setOnSucceeded(onSucceededHandler); } private void useSaveFileService(FileStorage fileStorage) { saveFileService.setFileStorage(fileStorage); saveFileService.restart(); - saveFileService.setOnSucceeded(event -> runLater(() -> { - resetContent(); - })); + saveFileService.setOnSucceeded(t -> resetContent()); } /** @@ -569,7 +581,7 @@ public class SmartCSVController extends FXMLController { private ContextMenu contextMenuForColumn(String header) { ContextMenu contextMenu = new ContextMenu(); MenuItem editColumnRulesMenuItem = new MenuItem(resourceBundle.getString("context.menu.edit.column.rules")); - bindMenuItemsToFileExistence(currentConfigFile, editColumnRulesMenuItem); + bindMenuItemsToContentExistence(currentConfigFile, editColumnRulesMenuItem); editColumnRulesMenuItem.setOnAction(e -> showValidationEditor(header)); contextMenu.getItems().addAll(editColumnRulesMenuItem); return contextMenu; diff --git a/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java b/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java index 65beb6e..72e97f0 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java @@ -126,6 +126,14 @@ public class CSVModel { return validator != null && validator.hasConfig(); } + public ValidationConfiguration createValidationConfiguration() { + ValidationConfiguration newValidationConfiguration = new ValidationConfiguration(); + newValidationConfiguration.setHeaderNames(this.header); + this.validator = new Validator(newValidationConfiguration); + this.revalidate(); + return newValidationConfiguration; + } + private static class RevalidationService extends Service> { private Validator validator; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java index f5d1256..1bcabea 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java @@ -39,4 +39,8 @@ public class HeaderConfiguration { public String[] getNames() { return names; } + + public void setNames(String[] names) { + this.names = names; + } } diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java index cadfebb..ebb5ca2 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java @@ -48,6 +48,10 @@ public class ValidationConfiguration { return headerConfiguration.getNames(); } + public void setHeaderNames(String[] headerNames) { + headerConfiguration.setNames(headerNames); + } + public Boolean getIntegerRuleFor(String column) { return (Boolean)getValue(column, "integer"); } diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css index 782de96..77951a5 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css @@ -15,48 +15,68 @@ } .open-icon { - -glyph-name: "FILE_TEXT_ALT"; - -glyph-size: 14px; + -glyph-name: "FILE_IMPORT"; + -glyph-size: 16px; +} + +.file-document-icon { + -glyph-name: "FILE_DOCUMENT"; + -glyph-size: 16px; } .config-icon { - -glyph-name: "CHECK"; - -glyph-size: 14px; + -glyph-name: "CLIPBOARD"; + -glyph-size: 16px; +} + +.create-config-icon { + -glyph-name: "STAR"; + -glyph-size: 10px; +} + +.load-config-icon { + -glyph-name: "ARROW_UP_BOLD"; + -glyph-size: 10px; +} + +.save-config-icon { + -glyph-name: "ARROW_DOWN_BOLD"; + -glyph-size: 10px; } .save-icon { - -glyph-name: "FLOPPY_ALT"; - -glyph-size: 14px; + -glyph-name: "FILE_EXPORT"; + -glyph-size: 16px; } .exit-icon { - -glyph-name: "SIGN_OUT"; - -glyph-size: 14px; + -glyph-name: "EXIT_TO_APP"; + -glyph-size: 16px; } .info-icon { - -glyph-name: "INFO"; - -glyph-size: 14px; + -glyph-name: "INFORMATION_OUTLINE"; + -glyph-size: 16px; } -.error-title-icon { - -glyph-name: "EXCLAMATION_TRIANGLE"; - -glyph-size: 14px; +.config-check-icon { + -glyph-name: "CLIPBOARD_CHECK"; + -glyph-size: 16px; } .preferences-icon { - -glyph-name: "COG"; - -glyph-size: 14px; + -glyph-name: "SETTINGS"; + -glyph-size: 16px; } .delete-icon { - -glyph-name: "MINUS"; - -glyph-size: 14px; + -glyph-name: "TABLE_ROW_REMOVE"; + -glyph-size: 16px; } .add-icon { - -glyph-name: "PLUS"; - -glyph-size: 14px; + -glyph-name: "TABLE_ROW_PLUS_AFTER"; + -glyph-size: 16px; } /* toolbar customization based on http://fxexperience.com/2012/02/customized-segmented-toolbar-buttons/ */ @@ -91,6 +111,13 @@ -fx-fill: white; } +.menu-item .load-config-icon, +.menu-item .save-config-icon, +.menu-item .create-config-icon +{ + -fx-fill: white; +} + .tool-bar .save-icon { -glyph-size: 16px; -fx-fill: white; diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.fxml b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.fxml index 7fc539b..96d1739 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.fxml +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.fxml @@ -1,7 +1,6 @@ - @@ -22,6 +21,7 @@ + @@ -32,57 +32,72 @@ - + - + - + + + + + + + + + + + - + + + + + + - - + + - - - - - - + + + + + + - + - + @@ -91,12 +106,12 @@ - + - + @@ -105,7 +120,7 @@ - + @@ -119,7 +134,7 @@ - + + @@ -203,7 +236,7 @@ - + @@ -248,10 +281,10 @@ - + diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties index a965d51..6c026c3 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties @@ -1,5 +1,6 @@ menu.open.csv = Open CSV File menu.open.config = Open Validation Config +menu.create.config = Create Validation Config menu.save = Save menu.save.as = Save As ... menu.save.config = Save Validation Config diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties index c215b9c..cfe414c 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties @@ -8,6 +8,7 @@ menu.open.csv = CSV Datei \u00f6ffnen menu.open.config = Pr\u00fcfkonfiguration \u00f6ffnen +menu.create.config = Pr\u00fcfkonfiguration erzeugen menu.save = Speichern menu.save.as = Speichern als ... menu.save.config = Pr\u00fcfkonfiguration speichern