Gridarta Editor
DefaultInputHandler.java
Go to the documentation of this file.
1 /*
2  * DefaultInputHandler.java - Default implementation of an input handler
3  * Copyright (C) 1999 Slava Pestov
4  * Copyright (C) 2000-2023 The Gridarta Developers.
5  *
6  * You may use and modify this package for any purpose. Redistribution is
7  * permitted, in both source and binary form, provided that this notice
8  * remains intact in all source distributions of this package.
9  */
10 
11 package net.sf.gridarta.textedit.textarea;
12 
13 import java.awt.event.ActionListener;
14 import java.awt.event.InputEvent;
15 import java.awt.event.KeyEvent;
16 import java.util.HashMap;
17 import java.util.Map;
18 import javax.swing.KeyStroke;
22 import org.apache.log4j.Category;
23 import org.apache.log4j.Logger;
24 import org.jetbrains.annotations.NotNull;
25 import org.jetbrains.annotations.Nullable;
26 
33 public class DefaultInputHandler extends InputHandler {
34 
35  @NotNull
36  private final Map<KeyStroke, ActionListener> bindings;
37 
41  private static final Category LOG = Logger.getLogger(DefaultInputHandler.class);
42 
43  @NotNull
44  private final InputActions inputActions;
45 
52  public DefaultInputHandler(@NotNull final ScriptEditControl scriptEditControl, @NotNull final MenuEntries menuEntries) {
53  inputActions = new InputActions(scriptEditControl, menuEntries);
54  bindings = new HashMap<>();
55  }
56 
60  @Override
61  public void addDefaultKeyBindings() {
62  addKeyBinding("BACK_SPACE", inputActions.backspace);
63  addKeyBinding("C+BACK_SPACE", inputActions.backspaceWord);
66 
69 
72 
81 
83  addKeyBinding("PAGE_DOWN", inputActions.nextPage);
86 
99 
100  addKeyBinding("C+ENTER", inputActions.repeat);
101 
103  }
104 
114  private void addKeyBinding(final String keyBinding, final ActionListener action) {
115  final KeyStroke keyStroke = parseKeyStroke(keyBinding);
116  if (keyStroke != null) {
117  bindings.put(keyStroke, action);
118  }
119  }
120 
125  @Override
126  public InputHandler copy() {
127  return new DefaultInputHandler(this);
128  }
129 
134  @Override
135  public void keyPressed(final KeyEvent e) {
136  final int keyCode = e.getKeyCode();
137  final int modifiers = e.getModifiers();
138 
139  if (keyCode == KeyEvent.VK_CONTROL || keyCode == KeyEvent.VK_SHIFT || keyCode == KeyEvent.VK_ALT || keyCode == KeyEvent.VK_META) {
140  return;
141  }
142 
143  if ((modifiers & ~InputEvent.SHIFT_MASK) != 0 || e.isActionKey() || keyCode == KeyEvent.VK_BACK_SPACE || keyCode == KeyEvent.VK_DELETE || keyCode == KeyEvent.VK_ENTER || keyCode == KeyEvent.VK_TAB || keyCode == KeyEvent.VK_ESCAPE) {
144  if (handleGrabAction(e)) {
145  return;
146  }
147 
148  final KeyStroke keyStroke = KeyStroke.getKeyStroke(keyCode, modifiers);
149  final ActionListener actionListener = bindings.get(keyStroke);
150  if (actionListener != null) {
151  executeAction(actionListener, e.getSource(), null);
152  e.consume();
153  }
154  }
155  }
156 
157  @Override
158  public void keyReleased(final KeyEvent e) {
159  }
160 
164  @Override
165  public void keyTyped(final KeyEvent e) {
166  final int modifiers = e.getModifiers();
167  final char c = e.getKeyChar();
168 
169  if (c != KeyEvent.CHAR_UNDEFINED && (modifiers & InputEvent.ALT_MASK) == 0) {
170  if (c >= (char) 0x20 && c != (char) 0x7f) {
171  final KeyStroke keyStroke = KeyStroke.getKeyStroke(Character.toUpperCase(c));
172  final ActionListener actionListener = bindings.get(keyStroke);
173 
174  if (actionListener != null) {
175  executeAction(actionListener, e.getSource(), String.valueOf(c));
176  return;
177  }
178 
179  if (handleGrabAction(e)) {
180  return;
181  }
182 
183  // 0-9 adds another 'digit' to the repeat number
184  if (isRepeatEnabled() && Character.isDigit(c)) {
185  repeatCount *= 10;
186  repeatCount += c - '0';
187  return;
188  }
189 
190  executeAction(inputActions.insertChar, e.getSource(), String.valueOf(e.getKeyChar()));
191 
192  repeatCount = 0;
193  setRepeatEnabled(false);
194  }
195  }
196  }
197 
207  @Nullable
208  private static KeyStroke parseKeyStroke(final String keyStroke) {
209  if (keyStroke == null) {
210  return null;
211  }
212 
213  int modifiers = 0;
214  final int index = keyStroke.indexOf('+');
215  if (index != -1) {
216  for (int i = 0; i < index; i++) {
217  switch (Character.toUpperCase(keyStroke.charAt(i))) {
218  case 'A':
219  modifiers |= InputEvent.ALT_MASK;
220  break;
221  case 'C':
222  modifiers |= InputEvent.CTRL_MASK;
223  break;
224  case 'M':
225  modifiers |= InputEvent.META_MASK;
226  break;
227  case 'S':
228  modifiers |= InputEvent.SHIFT_MASK;
229  break;
230  }
231  }
232  }
233 
234  final String key = keyStroke.substring(index + 1);
235  if (key.length() == 1) {
236  final char ch = Character.toUpperCase(key.charAt(0));
237  return modifiers == 0 ? KeyStroke.getKeyStroke(ch) : KeyStroke.getKeyStroke(ch, modifiers);
238  }
239  if (key.isEmpty()) {
240  LOG.error("Invalid key stroke: " + keyStroke);
241  return null;
242  }
243  final int ch;
244 
245  try {
246  ch = KeyEvent.class.getField("VK_" + key).getInt(null);
247  } catch (final IllegalAccessException | NoSuchFieldException ignored) {
248  LOG.error("Invalid key stroke: " + keyStroke);
249  return null;
250  }
251 
252  return KeyStroke.getKeyStroke(ch, modifiers);
253  }
254 
256  inputActions = copy.inputActions;
257  bindings = copy.bindings;
258  }
259 
260 }
net.sf.gridarta.textedit.textarea.actions.InputActions.selectDocHome
final ActionListener selectDocHome
Definition: InputActions.java:61
net.sf.gridarta.textedit.textarea.actions.InputActions.selectPrevLine
final ActionListener selectPrevLine
Definition: InputActions.java:91
net.sf.gridarta.textedit.textarea.actions.InputActions.nextPage
final ActionListener nextPage
Definition: InputActions.java:67
net.sf.gridarta.textedit.scripteditor
Classes for the script editor used within the editor to create and modify Python and Lua scripts.
Definition: Actions.java:20
net.sf.gridarta.textedit.textarea.DefaultInputHandler.bindings
final Map< KeyStroke, ActionListener > bindings
Definition: DefaultInputHandler.java:36
net.sf.gridarta.textedit.textarea
This package contains the other part of the script editor.
net.sf.gridarta.textedit.textarea.actions.InputActions.selectPrevWord
final ActionListener selectPrevWord
Definition: InputActions.java:95
net.sf.gridarta.textedit.textarea.DefaultInputHandler.parseKeyStroke
static KeyStroke parseKeyStroke(final String keyStroke)
Converts a string to a keystroke.
Definition: DefaultInputHandler.java:208
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.textedit.textarea.actions.InputActions.home
final ActionListener home
Definition: InputActions.java:55
net.sf.gridarta.textedit.textarea.actions.InputActions.insertChar
final ActionListener insertChar
Definition: InputActions.java:105
net.sf.gridarta.textedit.textarea.actions.InputActions.prevChar
final ActionListener prevChar
Definition: InputActions.java:81
net.sf
net.sf.gridarta.textedit.textarea.DefaultInputHandler.keyPressed
void keyPressed(final KeyEvent e)
Handle a key pressed event.
Definition: DefaultInputHandler.java:135
net.sf.gridarta.textedit.textarea.actions.InputActions.delete
final ActionListener delete
Definition: InputActions.java:39
net.sf.gridarta.textedit.textarea.InputHandler
An input handler converts the user's key strokes into concrete actions.
Definition: InputHandler.java:36
net.sf.gridarta.textedit.textarea.actions.InputActions.documentHome
final ActionListener documentHome
Definition: InputActions.java:57
net.sf.gridarta.textedit
net.sf.gridarta.textedit.textarea.DefaultInputHandler.LOG
static final Category LOG
The Logger for printing log messages.
Definition: DefaultInputHandler.java:41
net.sf.gridarta.textedit.textarea.actions.InputActions.overwrite
final ActionListener overwrite
Definition: InputActions.java:79
net.sf.gridarta.textedit.textarea.actions.InputActions.nextChar
final ActionListener nextChar
Definition: InputActions.java:63
net.sf.gridarta.textedit.textarea.InputHandler.repeatCount
int repeatCount
Definition: InputHandler.java:48
net.sf.gridarta.textedit.textarea.actions.InputActions.nextWord
final ActionListener nextWord
Definition: InputActions.java:69
net.sf.gridarta.textedit.textarea.InputHandler.isRepeatEnabled
boolean isRepeatEnabled()
Returns if repetition is enabled.
Definition: InputHandler.java:63
net
net.sf.gridarta.textedit.scripteditor.MenuEntries
List of menu entries (all CFPython commands).
Definition: MenuEntries.java:42
net.sf.gridarta.textedit.textarea.DefaultInputHandler.addDefaultKeyBindings
void addDefaultKeyBindings()
Sets up the default key bindings.
Definition: DefaultInputHandler.java:61
net.sf.gridarta.textedit.textarea.actions.InputActions.insertBreak
final ActionListener insertBreak
Definition: InputActions.java:51
net.sf.gridarta.textedit.textarea.actions.InputActions.nextLine
final ActionListener nextLine
Definition: InputActions.java:65
net.sf.gridarta.textedit.textarea.InputHandler.setRepeatEnabled
void setRepeatEnabled(final boolean repeat)
Sets the enabled state of repetition.
Definition: InputHandler.java:74
net.sf.gridarta.textedit.textarea.DefaultInputHandler.inputActions
final InputActions inputActions
Definition: DefaultInputHandler.java:44
net.sf.gridarta.textedit.textarea.DefaultInputHandler.keyTyped
void keyTyped(final KeyEvent e)
Handle a key typed event.
Definition: DefaultInputHandler.java:165
net.sf.gridarta.textedit.textarea.actions.InputActions.selectHome
final ActionListener selectHome
Definition: InputActions.java:59
net.sf.gridarta.textedit.textarea.DefaultInputHandler
The default input handler.
Definition: DefaultInputHandler.java:33
net.sf.gridarta.textedit.textarea.actions.InputActions.selectPrevPage
final ActionListener selectPrevPage
Definition: InputActions.java:93
net.sf.gridarta.textedit.textarea.DefaultInputHandler.DefaultInputHandler
DefaultInputHandler(final DefaultInputHandler copy)
Definition: DefaultInputHandler.java:255
net.sf.gridarta.textedit.textarea.actions
Definition: Backspace.java:11
net.sf.gridarta.textedit.textarea.actions.InputActions.selectDocEnd
final ActionListener selectDocEnd
Definition: InputActions.java:49
net.sf.gridarta.textedit.textarea.actions.InputActions.insertTab
final ActionListener insertTab
Definition: InputActions.java:53
net.sf.gridarta.textedit.textarea.actions.InputActions.selectPrevChar
final ActionListener selectPrevChar
Definition: InputActions.java:89
net.sf.gridarta.textedit.textarea.actions.InputActions.selectNextChar
final ActionListener selectNextChar
Definition: InputActions.java:71
net.sf.gridarta.textedit.textarea.actions.InputActions.documentEnd
final ActionListener documentEnd
Definition: InputActions.java:45
net.sf.gridarta.textedit.textarea.actions.InputActions.selectEnd
final ActionListener selectEnd
Definition: InputActions.java:47
net.sf.gridarta.textedit.textarea.actions.InputActions
Definition: InputActions.java:25
net.sf.gridarta.textedit.textarea.actions.InputActions.toggleRectangle
final ActionListener toggleRectangle
Definition: InputActions.java:99
net.sf.gridarta.textedit.textarea.actions.InputActions.selectNextWord
final ActionListener selectNextWord
Definition: InputActions.java:77
net.sf.gridarta.textedit.textarea.DefaultInputHandler.addKeyBinding
void addKeyBinding(final String keyBinding, final ActionListener action)
Adds a key binding to this input handler.
Definition: DefaultInputHandler.java:114
net.sf.gridarta.textedit.textarea.DefaultInputHandler.DefaultInputHandler
DefaultInputHandler(@NotNull final ScriptEditControl scriptEditControl, @NotNull final MenuEntries menuEntries)
Creates a new input handler with no key bindings defined.
Definition: DefaultInputHandler.java:52
net.sf.gridarta.textedit.textarea.InputHandler.executeAction
void executeAction(final ActionListener listener, final Object source, @Nullable final String actionCommand)
Executes the specified action, repeating and recording it as necessary.
Definition: InputHandler.java:108
net.sf.gridarta.textedit.scripteditor.ScriptEditControl
ScriptEditControl - Manages events and data flow for the script editor entity.
Definition: ScriptEditControl.java:59
net.sf.gridarta.textedit.textarea.actions.InputActions.prevWord
final ActionListener prevWord
Definition: InputActions.java:87
net.sf.gridarta.textedit.textarea.InputHandler.handleGrabAction
boolean handleGrabAction(final KeyEvent evt)
If a key is being grabbed, this method should be called with the appropriate key event.
Definition: InputHandler.java:182
net.sf.gridarta.textedit.textarea.actions.InputActions.prevLine
final ActionListener prevLine
Definition: InputActions.java:83
net.sf.gridarta.textedit.textarea.actions.InputActions.prevPage
final ActionListener prevPage
Definition: InputActions.java:85
net.sf.gridarta.textedit.textarea.actions.InputActions.selectNextPage
final ActionListener selectNextPage
Definition: InputActions.java:75
net.sf.gridarta.textedit.textarea.actions.InputActions.functionMenu
final ActionListener functionMenu
Definition: InputActions.java:101
net.sf.gridarta.textedit.textarea.DefaultInputHandler.keyReleased
void keyReleased(final KeyEvent e)
Definition: DefaultInputHandler.java:158
net.sf.gridarta.textedit.textarea.actions.InputActions.backspaceWord
final ActionListener backspaceWord
Definition: InputActions.java:37
net.sf.gridarta.textedit.textarea.actions.InputActions.selectNextLine
final ActionListener selectNextLine
Definition: InputActions.java:73
net.sf.gridarta.textedit.textarea.actions.InputActions.end
final ActionListener end
Definition: InputActions.java:43
net.sf.gridarta.textedit.textarea.DefaultInputHandler.copy
InputHandler copy()
Returns a copy of this input handler that shares the same key bindings.
Definition: DefaultInputHandler.java:126
net.sf.gridarta.textedit.textarea.actions.InputActions.backspace
final ActionListener backspace
Definition: InputActions.java:35
net.sf.gridarta.textedit.textarea.actions.InputActions.deleteWord
final ActionListener deleteWord
Definition: InputActions.java:41
net.sf.gridarta.textedit.textarea.actions.InputActions.repeat
final ActionListener repeat
Definition: InputActions.java:97