From 21b139cc6ced6a39d511e46cf8b4a59318f6bf0f Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Tue, 12 Jan 2016 22:42:24 +0100 Subject: [PATCH] usability of preferences dialog --- .../smartcsv/fx/SmartCSVController.java | 7 ++++ .../fx/preferences/PreferencesController.java | 40 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java b/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java index 530b8f4..43c279b 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java @@ -31,6 +31,7 @@ import javafx.beans.property.SimpleBooleanProperty; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; +import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; @@ -249,12 +250,18 @@ public class SmartCSVController extends FXMLController { alert.setTitle(resourceBundle.getString("dialog.preferences.title")); alert.setHeaderText(resourceBundle.getString("dialog.preferences.header.text")); alert.getDialogPane().setContent(preferencesController.getView()); + + Node okButton = alert.getDialogPane().lookupButton(ButtonType.OK); + okButton.disableProperty().bind(preferencesController.validProperty().not()); + Optional result = alert.showAndWait(); if (result.get() == ButtonType.OK){ CsvPreference csvPreference = preferencesController.getCsvPreference(); setCsvPreference(csvPreference); saveCsvPreferences(csvPreference); + } else { + preferencesController.setCsvPreference(preferencesLoader.getCSVpreference()); } } diff --git a/src/main/java/ninja/javafx/smartcsv/fx/preferences/PreferencesController.java b/src/main/java/ninja/javafx/smartcsv/fx/preferences/PreferencesController.java index e91ebed..01ad86b 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/preferences/PreferencesController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/preferences/PreferencesController.java @@ -26,10 +26,17 @@ package ninja.javafx.smartcsv.fx.preferences; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; +import javafx.scene.control.TextFormatter; import ninja.javafx.smartcsv.fx.FXMLController; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -37,6 +44,7 @@ import org.supercsv.prefs.CsvPreference; import java.net.URL; import java.util.ResourceBundle; +import java.util.function.UnaryOperator; import static ninja.javafx.smartcsv.preferences.QuoteModeHelper.getQuoteMode; import static ninja.javafx.smartcsv.preferences.QuoteModeHelper.getQuoteModeName; @@ -64,6 +72,8 @@ public class PreferencesController extends FXMLController { private String endOfLineSymbols; + private BooleanProperty valid = new SimpleBooleanProperty(true); + @Value("${fxml.smartcvs.preferences.view}") @Override @@ -74,6 +84,24 @@ public class PreferencesController extends FXMLController { @Override public void initialize(URL location, ResourceBundle resources) { quoteMode.getItems().addAll("normal", "always", "column"); + + UnaryOperator allowOnlyOneCharacter = change -> { + if (change.isContentChange()) { + if (change.getControlNewText().length() > 1) { + return null; + } + } + return change; + }; + quoteChar.setTextFormatter(new TextFormatter(allowOnlyOneCharacter)); + quoteChar.textProperty().addListener(observable -> {revalidate();}); + + delimiterChar.setTextFormatter(new TextFormatter(allowOnlyOneCharacter)); + delimiterChar.textProperty().addListener(observable -> {revalidate();}); + } + + private void revalidate() { + valid.setValue(quoteChar.getText().length() == 1 && delimiterChar.getText().length() == 1); } public void setCsvPreference(CsvPreference csvPreference) { @@ -92,4 +120,16 @@ public class PreferencesController extends FXMLController { .ignoreEmptyLines(ignoreEmptyLines.isSelected()) .build(); } + + public boolean getValid() { + return valid.get(); + } + + public BooleanProperty validProperty() { + return valid; + } + + public void setValid(boolean valid) { + this.valid.set(valid); + } }