When entering mnemonic words, don't close dropdown when a prefix is encountered, and move focus to the next field upon completion

This commit is contained in:
Haakon Nilsen 2021-05-27 10:56:47 +02:00
parent 3ae63408e6
commit 4cbde7e7aa

View file

@ -36,7 +36,6 @@ import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
public class MnemonicKeystoreImportPane extends TitledDescriptionPane { public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
@ -159,15 +158,20 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
ObservableList<String> wordEntryList = FXCollections.observableArrayList(words); ObservableList<String> wordEntryList = FXCollections.observableArrayList(words);
wordEntriesProperty = new SimpleListProperty<>(wordEntryList); wordEntriesProperty = new SimpleListProperty<>(wordEntryList);
List<WordEntry> wordEntries = new ArrayList<>(numWords);
for(int i = 0; i < numWords; i++) { for(int i = 0; i < numWords; i++) {
WordEntry wordEntry = new WordEntry(i, wordEntryList); wordEntries.add(new WordEntry(i, wordEntryList));
wordsPane.getChildren().add(wordEntry);
} }
for(int i = 0; i < numWords - 1; i++) {
wordEntries.get(i).setNext(wordEntries.get(i + 1).getEditor());
}
wordsPane.getChildren().addAll(wordEntries);
vBox.getChildren().add(wordsPane); vBox.getChildren().add(wordsPane);
if(!displayWordsOnly) { if(!displayWordsOnly) {
PassphraseEntry passphraseEntry = new PassphraseEntry(); PassphraseEntry passphraseEntry = new PassphraseEntry();
wordEntries.get(wordEntries.size() - 1).setNext(passphraseEntry.getEditor());
passphraseEntry.setPadding(new Insets(0, 26, 10, 10)); passphraseEntry.setPadding(new Insets(0, 26, 10, 10));
vBox.getChildren().add(passphraseEntry); vBox.getChildren().add(passphraseEntry);
@ -397,6 +401,7 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
private static class WordEntry extends HBox { private static class WordEntry extends HBox {
private static List<String> wordList; private static List<String> wordList;
private final TextField wordField; private final TextField wordField;
private Node next;
public WordEntry(int wordNumber, ObservableList<String> wordEntryList) { public WordEntry(int wordNumber, ObservableList<String> wordEntryList) {
super(); super();
@ -425,6 +430,11 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
wordList = Bip39MnemonicCode.INSTANCE.getWordList(); wordList = Bip39MnemonicCode.INSTANCE.getWordList();
AutoCompletionBinding<String> autoCompletionBinding = TextFields.bindAutoCompletion(wordField, new WordlistSuggestionProvider(wordList)); AutoCompletionBinding<String> autoCompletionBinding = TextFields.bindAutoCompletion(wordField, new WordlistSuggestionProvider(wordList));
autoCompletionBinding.setDelay(50); autoCompletionBinding.setDelay(50);
autoCompletionBinding.setOnAutoCompleted(event -> {
if (next != null) {
next.requestFocus();
}
});
ValidationSupport validationSupport = new ValidationSupport(); ValidationSupport validationSupport = new ValidationSupport();
validationSupport.setValidationDecorator(new StyleClassValidationDecoration()); validationSupport.setValidationDecorator(new StyleClassValidationDecoration());
@ -444,6 +454,10 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
return wordField; return wordField;
} }
public void setNext(Node node) {
next = node;
}
public static boolean isValid(String word) { public static boolean isValid(String word) {
return wordList.contains(word); return wordList.contains(word);
} }
@ -461,10 +475,6 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
List<String> suggestions = new ArrayList<>(); List<String> suggestions = new ArrayList<>();
if(!request.getUserText().isEmpty()) { if(!request.getUserText().isEmpty()) {
for(String word : wordList) { for(String word : wordList) {
if(word.equals(request.getUserText())) {
return Collections.emptyList();
}
if(word.startsWith(request.getUserText())) { if(word.startsWith(request.getUserText())) {
suggestions.add(word); suggestions.add(word);
} }
@ -476,13 +486,15 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
} }
private class PassphraseEntry extends HBox { private class PassphraseEntry extends HBox {
private final CustomTextField passphraseField;
public PassphraseEntry() { public PassphraseEntry() {
super(); super();
setAlignment(Pos.CENTER_LEFT); setAlignment(Pos.CENTER_LEFT);
setSpacing(10); setSpacing(10);
Label passphraseLabel = new Label("Passphrase:"); Label passphraseLabel = new Label("Passphrase:");
CustomTextField passphraseField = (CustomTextField) TextFields.createClearableTextField(); passphraseField = (CustomTextField) TextFields.createClearableTextField();
passphraseProperty.bind(passphraseField.textProperty()); passphraseProperty.bind(passphraseField.textProperty());
passphraseField.setPromptText("Leave blank for none"); passphraseField.setPromptText("Leave blank for none");
@ -492,6 +504,10 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
getChildren().addAll(passphraseLabel, passphraseField, helpLabel); getChildren().addAll(passphraseLabel, passphraseField, helpLabel);
} }
public TextField getEditor() {
return passphraseField;
}
} }
private Node getDerivationEntry(List<ChildNumber> derivation) { private Node getDerivationEntry(List<ChildNumber> derivation) {