From 79751d99e8a0945a21344684df43edda3ba21e0c Mon Sep 17 00:00:00 2001 From: Geolykt Date: Sat, 18 Oct 2025 17:50:51 +0200 Subject: Move to next token when using the tabulator (#573) --- .../enigma/gui/elements/ConvertingTextField.java | 32 +++++++++++++-------- .../gui/events/ConvertingTextFieldListener.java | 10 +++++-- .../cuchaz/enigma/gui/panels/IdentifierPanel.java | 33 +++++++++++++++++++--- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ConvertingTextField.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ConvertingTextField.java index 301ae7f..2b80765 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ConvertingTextField.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ConvertingTextField.java @@ -18,6 +18,7 @@ import javax.swing.text.Document; import com.formdev.flatlaf.FlatClientProperties; import cuchaz.enigma.gui.events.ConvertingTextFieldListener; +import cuchaz.enigma.gui.events.ConvertingTextFieldListener.StopEditingCause; import cuchaz.enigma.gui.util.GuiUtil; import cuchaz.enigma.utils.validation.ParameterizedMessage; import cuchaz.enigma.utils.validation.Validatable; @@ -38,6 +39,7 @@ public class ConvertingTextField implements Validatable { this.ui = new JPanel(); this.ui.setLayout(new GridLayout(1, 1, 0, 0)); this.textField = new ValidatableTextField(text); + this.textField.setFocusTraversalKeysEnabled(false); this.textField.putClientProperty(FlatClientProperties.SELECT_ALL_ON_FOCUS_POLICY, FlatClientProperties.SELECT_ALL_ON_FOCUS_POLICY_NEVER); this.label = GuiUtil.unboldLabel(new JLabel(text)); this.label.setBorder(BorderFactory.createLoweredBevelBorder()); @@ -53,7 +55,7 @@ public class ConvertingTextField implements Validatable { @Override public void focusLost(FocusEvent e) { if (!hasChanges()) { - stopEditing(true); + stopEditing(StopEditingCause.ABORT); } } }); @@ -61,10 +63,18 @@ public class ConvertingTextField implements Validatable { this.textField.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { - stopEditing(true); - } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { - stopEditing(false); + switch (e.getKeyCode()) { + case KeyEvent.VK_ESCAPE: + stopEditing(StopEditingCause.ABORT); + break; + case KeyEvent.VK_ENTER: + stopEditing(StopEditingCause.DO); + break; + case KeyEvent.VK_TAB: + stopEditing(StopEditingCause.TAB); + break; + default: + break; } } }); @@ -87,16 +97,16 @@ public class ConvertingTextField implements Validatable { this.listeners.forEach(l -> l.onStartEditing(this)); } - public void stopEditing(boolean abort) { + public void stopEditing(StopEditingCause cause) { if (!editing) { return; } - if (!listeners.stream().allMatch(l -> l.tryStopEditing(this, abort))) { + if (!listeners.stream().allMatch(l -> l.tryStopEditing(this, cause))) { return; } - if (abort) { + if (cause == StopEditingCause.ABORT) { this.textField.setText(this.label.getText()); } else { this.label.setText(this.textField.getText()); @@ -107,11 +117,11 @@ public class ConvertingTextField implements Validatable { this.editing = false; this.ui.validate(); this.ui.repaint(); - this.listeners.forEach(l -> l.onStopEditing(this, abort)); + this.listeners.forEach(l -> l.onStopEditing(this, cause)); } public void setText(String text) { - stopEditing(true); + stopEditing(StopEditingCause.ABORT); this.label.setText(text); this.textField.setText(text); } @@ -126,7 +136,7 @@ public class ConvertingTextField implements Validatable { public void setEditable(boolean editable) { if (!editable) { - this.stopEditing(true); + this.stopEditing(StopEditingCause.ABORT); } this.label.setEnabled(editable); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/events/ConvertingTextFieldListener.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/events/ConvertingTextFieldListener.java index d9ec95c..9f20100 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/events/ConvertingTextFieldListener.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/events/ConvertingTextFieldListener.java @@ -3,13 +3,19 @@ package cuchaz.enigma.gui.events; import cuchaz.enigma.gui.elements.ConvertingTextField; public interface ConvertingTextFieldListener { + enum StopEditingCause { + ABORT, + DO, + TAB + } + default void onStartEditing(ConvertingTextField field) { } - default boolean tryStopEditing(ConvertingTextField field, boolean abort) { + default boolean tryStopEditing(ConvertingTextField field, StopEditingCause cause) { return true; } - default void onStopEditing(ConvertingTextField field, boolean abort) { + default void onStopEditing(ConvertingTextField field, StopEditingCause cause) { } } diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/IdentifierPanel.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/IdentifierPanel.java index 4d8ceea..6a8d734 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/IdentifierPanel.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/panels/IdentifierPanel.java @@ -13,6 +13,7 @@ import javax.swing.BorderFactory; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.SwingUtilities; import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.gui.EditableType; @@ -22,6 +23,8 @@ import cuchaz.enigma.gui.events.ConvertingTextFieldListener; import cuchaz.enigma.gui.util.GridBagConstraintsBuilder; import cuchaz.enigma.gui.util.GuiUtil; import cuchaz.enigma.gui.util.ScaleUtil; +import cuchaz.enigma.source.RenamableTokenType; +import cuchaz.enigma.source.Token; import cuchaz.enigma.translation.mapping.AccessModifier; import cuchaz.enigma.translation.mapping.EntryChange; import cuchaz.enigma.translation.mapping.EntryMapping; @@ -181,8 +184,8 @@ public class IdentifierPanel { } @Override - public boolean tryStopEditing(ConvertingTextField field, boolean abort) { - if (abort) { + public boolean tryStopEditing(ConvertingTextField field, StopEditingCause cause) { + if (cause == StopEditingCause.ABORT) { return true; } @@ -193,11 +196,33 @@ public class IdentifierPanel { } @Override - public void onStopEditing(ConvertingTextField field, boolean abort) { - if (!abort) { + public void onStopEditing(ConvertingTextField field, StopEditingCause cause) { + if (cause != StopEditingCause.ABORT) { vc.reset(); vc.setActiveElement(field); doRename(field.getText()); + + if (cause == StopEditingCause.TAB) { + EditorPanel editor = gui.getActiveEditor(); + + if (editor == null) { + return; + } + + Token token = editor.getToken(editor.getEditor().getCaretPosition()); + + SwingUtilities.invokeLater(() -> { + Token next = editor.getSource().getTokenStore().getByType().get(RenamableTokenType.OBFUSCATED).higher(token); + + if (next == null) { + editor.getEditor().requestFocusInWindow(); + } else { + editor.navigateToToken(next); + } + }); + + return; + } } EditorPanel e = gui.getActiveEditor(); -- cgit v1.2.3