From 40a4aefa9359808b926fa5baf03f786f2b93e80f Mon Sep 17 00:00:00 2001 From: Nathan McRae Date: Sun, 19 Jan 2025 21:34:10 -0800 Subject: [PATCH] Customize prefix text entry To only allow digits and to respect the digitsPerGroup spacing --- .../numbersstation/AddPrefixController.java | 145 ++++++++++++++++++ .../numbersstation/AddPrefixView.fxml | 20 +++ .../MainSettingsController.java | 60 +++++++- 3 files changed, 218 insertions(+), 7 deletions(-) create mode 100644 src/main/java/name/nathanmcrae/numbersstation/AddPrefixController.java create mode 100644 src/main/java/name/nathanmcrae/numbersstation/AddPrefixView.fxml diff --git a/src/main/java/name/nathanmcrae/numbersstation/AddPrefixController.java b/src/main/java/name/nathanmcrae/numbersstation/AddPrefixController.java new file mode 100644 index 0000000..8ffcc21 --- /dev/null +++ b/src/main/java/name/nathanmcrae/numbersstation/AddPrefixController.java @@ -0,0 +1,145 @@ + package name.nathanmcrae.numbersstation; + + import java.lang.StringBuilder; + import javafx.application.Platform; + import javafx.fxml.FXML; + import javafx.scene.control.Button; + import javafx.scene.control.TextField; + import javafx.stage.Stage; + import javafx.scene.input.KeyCode; + import javafx.scene.input.KeyEvent; + + public class AddPrefixController { + @FXML + private TextField prefixField; + + @FXML + private Button okButton; + + @FXML + private Button cancelButton; + + private int digitsPerGroup; + private MainSettingsController mainSettingsController; + + public void setDigitsPerGroup(int newDigitsPerGroup) { + digitsPerGroup = newDigitsPerGroup; + } + + public void setMainSettingsController(MainSettingsController mainSettingsController) { + this.mainSettingsController = mainSettingsController; + } + + @FXML + private void initialize() { + okButton.setOnAction(event -> handleOkButtonPress()); + cancelButton.setOnAction(event -> handleCancelButtonPress()); + + // Set focus on the text field when the window is shown + Platform.runLater(() -> prefixField.requestFocus()); + + // Add event filter to handle Enter key press + prefixField.addEventFilter(KeyEvent.ANY, event -> { + if (event.getCode() == KeyCode.ENTER) { + handleOkButtonPress(); + event.consume(); + } + + int cursorPosition = prefixField.getCaretPosition(); + + String character = event.getCharacter(); + KeyCode code = event.getCode(); + + String str = event.getText(); + + // Consume the event to block the default behavior + if (!(code == KeyCode.DOWN || + code == KeyCode.END || + code == KeyCode.HOME || + code == KeyCode.LEFT || + code == KeyCode.PAGE_DOWN || + code == KeyCode.PAGE_UP || + code == KeyCode.RIGHT || + code == KeyCode.UP)) { + event.consume(); + } + + if (event.getEventType() == KeyEvent.KEY_PRESSED && + (code == KeyCode.BACK_SPACE || + code == KeyCode.DELETE)) { + + String newText = prefixField.getText(); + if (code == KeyCode.BACK_SPACE) { + newText = (newText.substring(0, cursorPosition - 1) + newText.substring(cursorPosition)).replaceAll(" ", ""); + } + else if (code == KeyCode.DELETE) { + newText = (newText.substring(0, cursorPosition) + newText.substring(cursorPosition + 1)).replaceAll(" ", ""); + } + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < newText.length(); i++) { + sb.append(newText.charAt(i)); + if ((i + 1) % (digitsPerGroup) == 0) { + sb.append(' '); + } + } + + prefixField.setText(sb.toString()); + if (code == KeyCode.BACK_SPACE) { + prefixField.positionCaret(cursorPosition - 1); + } else if (code == KeyCode.DELETE) { + prefixField.positionCaret(cursorPosition); + } + } + + if (event.getEventType() == KeyEvent.KEY_PRESSED && + (code == KeyCode.DIGIT0 || + code == KeyCode.DIGIT1 || + code == KeyCode.DIGIT2 || + code == KeyCode.DIGIT3 || + code == KeyCode.DIGIT4 || + code == KeyCode.DIGIT5 || + code == KeyCode.DIGIT6 || + code == KeyCode.DIGIT7 || + code == KeyCode.DIGIT8 || + code == KeyCode.DIGIT9)) { + + String newText = prefixField.getText().substring(0, cursorPosition) + str + prefixField.getText().substring(cursorPosition); + newText = newText.replaceAll(" ", ""); + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < newText.length(); i++) { + sb.append(newText.charAt(i)); + if ((i + 1) % (digitsPerGroup) == 0) { + sb.append(' '); + } + } + + prefixField.setText(sb.toString()); + if (prefixField.getText().charAt(cursorPosition) == ' ') { + cursorPosition++; + } + prefixField.positionCaret(cursorPosition + 1); + } + }); + } + + private void handleOkButtonPress() { + String prefix = prefixField.getText(); + if (prefix != null && !prefix.isEmpty()) { + mainSettingsController.addPrefix(prefix.replaceAll(" ", "")); + closeWindow(); + } + } + + private void handleCancelButtonPress() { + closeWindow(); + } + + private void closeWindow() { + Stage stage = (Stage) okButton.getScene().getWindow(); + stage.close(); + } + } diff --git a/src/main/java/name/nathanmcrae/numbersstation/AddPrefixView.fxml b/src/main/java/name/nathanmcrae/numbersstation/AddPrefixView.fxml new file mode 100644 index 0000000..6160948 --- /dev/null +++ b/src/main/java/name/nathanmcrae/numbersstation/AddPrefixView.fxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + +