Skip to content

Commit 79751d9

Browse files
authored
Move to next token when using the tabulator (#573)
1 parent 1edc1eb commit 79751d9

File tree

3 files changed

+58
-17
lines changed

3 files changed

+58
-17
lines changed

enigma-swing/src/main/java/cuchaz/enigma/gui/elements/ConvertingTextField.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.formdev.flatlaf.FlatClientProperties;
1919

2020
import cuchaz.enigma.gui.events.ConvertingTextFieldListener;
21+
import cuchaz.enigma.gui.events.ConvertingTextFieldListener.StopEditingCause;
2122
import cuchaz.enigma.gui.util.GuiUtil;
2223
import cuchaz.enigma.utils.validation.ParameterizedMessage;
2324
import cuchaz.enigma.utils.validation.Validatable;
@@ -38,6 +39,7 @@ public ConvertingTextField(String text) {
3839
this.ui = new JPanel();
3940
this.ui.setLayout(new GridLayout(1, 1, 0, 0));
4041
this.textField = new ValidatableTextField(text);
42+
this.textField.setFocusTraversalKeysEnabled(false);
4143
this.textField.putClientProperty(FlatClientProperties.SELECT_ALL_ON_FOCUS_POLICY, FlatClientProperties.SELECT_ALL_ON_FOCUS_POLICY_NEVER);
4244
this.label = GuiUtil.unboldLabel(new JLabel(text));
4345
this.label.setBorder(BorderFactory.createLoweredBevelBorder());
@@ -53,18 +55,26 @@ public void mouseClicked(MouseEvent e) {
5355
@Override
5456
public void focusLost(FocusEvent e) {
5557
if (!hasChanges()) {
56-
stopEditing(true);
58+
stopEditing(StopEditingCause.ABORT);
5759
}
5860
}
5961
});
6062

6163
this.textField.addKeyListener(new KeyAdapter() {
6264
@Override
6365
public void keyPressed(KeyEvent e) {
64-
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
65-
stopEditing(true);
66-
} else if (e.getKeyCode() == KeyEvent.VK_ENTER) {
67-
stopEditing(false);
66+
switch (e.getKeyCode()) {
67+
case KeyEvent.VK_ESCAPE:
68+
stopEditing(StopEditingCause.ABORT);
69+
break;
70+
case KeyEvent.VK_ENTER:
71+
stopEditing(StopEditingCause.DO);
72+
break;
73+
case KeyEvent.VK_TAB:
74+
stopEditing(StopEditingCause.TAB);
75+
break;
76+
default:
77+
break;
6878
}
6979
}
7080
});
@@ -87,16 +97,16 @@ public void startEditing() {
8797
this.listeners.forEach(l -> l.onStartEditing(this));
8898
}
8999

90-
public void stopEditing(boolean abort) {
100+
public void stopEditing(StopEditingCause cause) {
91101
if (!editing) {
92102
return;
93103
}
94104

95-
if (!listeners.stream().allMatch(l -> l.tryStopEditing(this, abort))) {
105+
if (!listeners.stream().allMatch(l -> l.tryStopEditing(this, cause))) {
96106
return;
97107
}
98108

99-
if (abort) {
109+
if (cause == StopEditingCause.ABORT) {
100110
this.textField.setText(this.label.getText());
101111
} else {
102112
this.label.setText(this.textField.getText());
@@ -107,11 +117,11 @@ public void stopEditing(boolean abort) {
107117
this.editing = false;
108118
this.ui.validate();
109119
this.ui.repaint();
110-
this.listeners.forEach(l -> l.onStopEditing(this, abort));
120+
this.listeners.forEach(l -> l.onStopEditing(this, cause));
111121
}
112122

113123
public void setText(String text) {
114-
stopEditing(true);
124+
stopEditing(StopEditingCause.ABORT);
115125
this.label.setText(text);
116126
this.textField.setText(text);
117127
}
@@ -126,7 +136,7 @@ public void setEditText(String text) {
126136

127137
public void setEditable(boolean editable) {
128138
if (!editable) {
129-
this.stopEditing(true);
139+
this.stopEditing(StopEditingCause.ABORT);
130140
}
131141

132142
this.label.setEnabled(editable);

enigma-swing/src/main/java/cuchaz/enigma/gui/events/ConvertingTextFieldListener.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,19 @@
33
import cuchaz.enigma.gui.elements.ConvertingTextField;
44

55
public interface ConvertingTextFieldListener {
6+
enum StopEditingCause {
7+
ABORT,
8+
DO,
9+
TAB
10+
}
11+
612
default void onStartEditing(ConvertingTextField field) {
713
}
814

9-
default boolean tryStopEditing(ConvertingTextField field, boolean abort) {
15+
default boolean tryStopEditing(ConvertingTextField field, StopEditingCause cause) {
1016
return true;
1117
}
1218

13-
default void onStopEditing(ConvertingTextField field, boolean abort) {
19+
default void onStopEditing(ConvertingTextField field, StopEditingCause cause) {
1420
}
1521
}

enigma-swing/src/main/java/cuchaz/enigma/gui/panels/IdentifierPanel.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import javax.swing.JComboBox;
1414
import javax.swing.JLabel;
1515
import javax.swing.JPanel;
16+
import javax.swing.SwingUtilities;
1617

1718
import cuchaz.enigma.EnigmaProject;
1819
import cuchaz.enigma.gui.EditableType;
@@ -22,6 +23,8 @@
2223
import cuchaz.enigma.gui.util.GridBagConstraintsBuilder;
2324
import cuchaz.enigma.gui.util.GuiUtil;
2425
import cuchaz.enigma.gui.util.ScaleUtil;
26+
import cuchaz.enigma.source.RenamableTokenType;
27+
import cuchaz.enigma.source.Token;
2528
import cuchaz.enigma.translation.mapping.AccessModifier;
2629
import cuchaz.enigma.translation.mapping.EntryChange;
2730
import cuchaz.enigma.translation.mapping.EntryMapping;
@@ -181,8 +184,8 @@ public void onStartEditing(ConvertingTextField field) {
181184
}
182185

183186
@Override
184-
public boolean tryStopEditing(ConvertingTextField field, boolean abort) {
185-
if (abort) {
187+
public boolean tryStopEditing(ConvertingTextField field, StopEditingCause cause) {
188+
if (cause == StopEditingCause.ABORT) {
186189
return true;
187190
}
188191

@@ -193,11 +196,33 @@ public boolean tryStopEditing(ConvertingTextField field, boolean abort) {
193196
}
194197

195198
@Override
196-
public void onStopEditing(ConvertingTextField field, boolean abort) {
197-
if (!abort) {
199+
public void onStopEditing(ConvertingTextField field, StopEditingCause cause) {
200+
if (cause != StopEditingCause.ABORT) {
198201
vc.reset();
199202
vc.setActiveElement(field);
200203
doRename(field.getText());
204+
205+
if (cause == StopEditingCause.TAB) {
206+
EditorPanel editor = gui.getActiveEditor();
207+
208+
if (editor == null) {
209+
return;
210+
}
211+
212+
Token token = editor.getToken(editor.getEditor().getCaretPosition());
213+
214+
SwingUtilities.invokeLater(() -> {
215+
Token next = editor.getSource().getTokenStore().getByType().get(RenamableTokenType.OBFUSCATED).higher(token);
216+
217+
if (next == null) {
218+
editor.getEditor().requestFocusInWindow();
219+
} else {
220+
editor.navigateToToken(next);
221+
}
222+
});
223+
224+
return;
225+
}
201226
}
202227

203228
EditorPanel e = gui.getActiveEditor();

0 commit comments

Comments
 (0)