public static InputEvent getInputEvent(String actionName) { final Shortcut[] shortcuts = KeymapManager.getInstance().getActiveKeymap().getShortcuts(actionName); KeyStroke keyStroke = null; for (Shortcut each : shortcuts) { if (each instanceof KeyboardShortcut) { keyStroke = ((KeyboardShortcut) each).getFirstKeyStroke(); if (keyStroke != null) break; } } if (keyStroke != null) { return new KeyEvent( JOptionPane.getRootFrame(), KeyEvent.KEY_PRESSED, System.currentTimeMillis(), keyStroke.getModifiers(), keyStroke.getKeyCode(), keyStroke.getKeyChar(), KeyEvent.KEY_LOCATION_STANDARD); } else { return new MouseEvent( JOptionPane.getRootFrame(), MouseEvent.MOUSE_PRESSED, 0, 0, 0, 0, 1, false, MouseEvent.BUTTON1); } }
public static String keyStroke2String(KeyStroke key) { StringBuffer s = new StringBuffer(50); int m = key.getModifiers(); if ((m & 0x41) != 0) s.append("shift "); if ((m & 0x82) != 0) s.append("ctrl "); if ((m & 0x104) != 0) s.append("meta "); if ((m & 0x208) != 0) s.append("alt "); if ((m & 0x410) != 0) s.append("button1 "); if ((m & 0x808) != 0) s.append("button2 "); if ((m & 0x1004) != 0) s.append("button3 "); switch (key.getKeyEventType()) { case 400: s.append("typed "); s.append(key.getKeyChar() + " "); break; case 401: s.append("pressed "); s.append(getKeyText(key.getKeyCode()) + " "); break; case 402: s.append("released "); s.append(getKeyText(key.getKeyCode()) + " "); break; default: s.append("unknown-event-type"); break; } return s.toString(); }
/** * This is hack. AWT doesn't allow to create KeyStroke with specified key code and key char * simultaneously. Therefore we are using reflection. */ private static KeyStroke getKeyStrokeWithoutMouseModifiers(KeyStroke originalKeyStroke) { int modifier = originalKeyStroke.getModifiers() & ~InputEvent.BUTTON1_DOWN_MASK & ~InputEvent.BUTTON1_MASK & ~InputEvent.BUTTON2_DOWN_MASK & ~InputEvent.BUTTON2_MASK & ~InputEvent.BUTTON3_DOWN_MASK & ~InputEvent.BUTTON3_MASK; try { Method[] methods = AWTKeyStroke.class.getDeclaredMethods(); Method getCachedStrokeMethod = null; for (Method method : methods) { if (GET_CACHED_STROKE_METHOD_NAME.equals(method.getName())) { getCachedStrokeMethod = method; getCachedStrokeMethod.setAccessible(true); break; } } if (getCachedStrokeMethod == null) { throw new IllegalStateException("not found method with name getCachedStrokeMethod"); } Object[] getCachedStrokeMethodArgs = new Object[] { originalKeyStroke.getKeyChar(), originalKeyStroke.getKeyCode(), modifier, originalKeyStroke.isOnKeyRelease() }; return (KeyStroke) getCachedStrokeMethod.invoke(originalKeyStroke, getCachedStrokeMethodArgs); } catch (Exception exc) { throw new IllegalStateException(exc.getMessage()); } }
@Nullable private static String toEscapeNotation(@NotNull KeyStroke key) { final char c = key.getKeyChar(); if (isControlCharacter(c)) { return "^" + String.valueOf((char) (c + 'A' - 1)); } else if (isControlKeyCode(key)) { return "^" + String.valueOf((char) (key.getKeyCode() + 'A' - 1)); } return null; }
/** Get the text in the register. */ @Nullable public String getText() { final StringBuilder builder = new StringBuilder(); for (KeyStroke key : keys) { final char c = key.getKeyChar(); if (c == KeyEvent.CHAR_UNDEFINED) { return null; } builder.append(c); } return builder.toString(); }
public void newAccelerator(final JMenuItem editedItem, final KeyStroke newAccelerator) { final Object key = menuBuilder.getKeyByUserObject(editedItem); final String shortcutKey = menuBuilder.getShortcutKey(key.toString()); final String oldShortcut = ResourceController.getResourceController().getProperty(shortcutKey); if (newAccelerator == null || !new KeystrokeValidator(editedItem, key, editedItem) .isValid(newAccelerator, newAccelerator.getKeyChar())) { final GrabKeyDialog grabKeyDialog = new GrabKeyDialog(oldShortcut); final IKeystrokeValidator validator = new KeystrokeValidator(grabKeyDialog, key, editedItem); grabKeyDialog.setValidator(validator); grabKeyDialog.setVisible(true); if (grabKeyDialog.isOK()) { final String shortcut = grabKeyDialog.getShortcut(); final KeyStroke accelerator = UITools.getKeyStroke(shortcut); menuBuilder.setAccelerator((Node) menuBuilder.get(key), accelerator); ResourceController.getResourceController().setProperty(shortcutKey, shortcut); LogUtils.info( "created shortcut '" + shortcut + "' for menuitem '" + key + "', shortcutKey '" + shortcutKey + "' (" + editedItem.getText() + ")"); } } else { if (oldShortcut != null) { final int replace = JOptionPane.showConfirmDialog( editedItem, oldShortcut, TextUtils.getText("remove_shortcut_question"), JOptionPane.YES_NO_OPTION); if (replace != JOptionPane.YES_OPTION) { return; } } menuBuilder.setAccelerator((Node) menuBuilder.get(key), newAccelerator); ResourceController.getResourceController().setProperty(shortcutKey, toString(newAccelerator)); LogUtils.info( "created shortcut '" + toString(newAccelerator) + "' for menuitem '" + key + "', shortcutKey '" + shortcutKey + "' (" + editedItem.getText() + ")"); } }
private int getMnemonicCharIndex(String text) { final int mnemonicIndex = myPresentation.getDisplayedMnemonicIndex(); if (mnemonicIndex != -1) { return mnemonicIndex; } final ShortcutSet shortcutSet = myAction.getShortcutSet(); final Shortcut[] shortcuts = shortcutSet.getShortcuts(); for (Shortcut shortcut : shortcuts) { if (!(shortcut instanceof KeyboardShortcut)) continue; KeyboardShortcut keyboardShortcut = (KeyboardShortcut) shortcut; if (keyboardShortcut.getSecondKeyStroke() == null) { // we are interested only in "mnemonic-like" shortcuts final KeyStroke keyStroke = keyboardShortcut.getFirstKeyStroke(); final int modifiers = keyStroke.getModifiers(); if (BitUtil.isSet(modifiers, InputEvent.ALT_MASK)) { return (keyStroke.getKeyChar() != KeyEvent.CHAR_UNDEFINED) ? text.indexOf(keyStroke.getKeyChar()) : text.indexOf(KeyEvent.getKeyText(keyStroke.getKeyCode())); } } } return -1; }
@NotNull public static String toKeyNotation(@NotNull KeyStroke key) { final char c = key.getKeyChar(); final int keyCode = key.getKeyCode(); final int modifiers = key.getModifiers(); if (c != CHAR_UNDEFINED && !isControlCharacter(c)) { return String.valueOf(c); } String prefix = ""; if ((modifiers & META_MASK) != 0) { prefix += "M-"; } if ((modifiers & ALT_MASK) != 0) { prefix += "A-"; } if ((modifiers & CTRL_MASK) != 0) { prefix += "C-"; } if ((modifiers & SHIFT_MASK) != 0) { prefix += "S-"; } String name = VIM_KEY_VALUES.get(keyCode); if (name != null) { if (UPPERCASE_DISPLAY_KEY_NAMES.contains(name)) { name = name.toUpperCase(); } else { name = StringUtil.capitalize(name); } } if (name == null) { final String escape = toEscapeNotation(key); if (escape != null) { return escape; } try { name = String.valueOf(Character.toChars(keyCode)); } catch (IllegalArgumentException ignored) { } } return name != null ? "<" + prefix + name + ">" : "<<" + key.toString() + ">>"; }
private static boolean isControlKeyCode(@NotNull KeyStroke key) { return key.getKeyChar() == CHAR_UNDEFINED && key.getKeyCode() < 0x20 && key.getModifiers() == 0; }
/* * FIXME: The trigger set here IS inserted when no matching template * is found, but a space character (" ") is always used as the "trigger" * to look for templates. This is because it is hardcoded in * RSyntaxTextArea's input map this way. We need to change this. * See RSyntaxTextAreaDefaultInputMap.java. */ public void setInsertTrigger(KeyStroke trigger) { if (trigger != null) { insertTrigger = trigger; insertTriggerString = Character.toString(trigger.getKeyChar()); } }
@NotNull public DigraphResult processKey(@NotNull KeyStroke key, @NotNull Editor editor) { switch (digraphState) { case DIG_STATE_START: logger.debug("DIG_STATE_START"); if (key.getKeyCode() == KeyEvent.VK_K && (key.getModifiers() & KeyEvent.CTRL_MASK) != 0) { logger.debug("found Ctrl-K"); digraphState = DIG_STATE_DIG_ONE; return DigraphResult.OK; } else if ((key.getKeyCode() == KeyEvent.VK_V || key.getKeyCode() == KeyEvent.VK_Q) && (key.getModifiers() & KeyEvent.CTRL_MASK) != 0) { logger.debug("found Ctrl-V"); digraphState = DIG_STATE_CODE_START; codeChars = new char[8]; codeCnt = 0; return DigraphResult.OK; } else { return new DigraphResult(key); } case DIG_STATE_DIG_ONE: logger.debug("DIG_STATE_DIG_ONE"); if (key.getKeyChar() != KeyEvent.CHAR_UNDEFINED) { digraphChar = key.getKeyChar(); digraphState = DIG_STATE_DIG_TWO; return DigraphResult.OK; } else { digraphState = DIG_STATE_START; return DigraphResult.BAD; } case DIG_STATE_DIG_TWO: logger.debug("DIG_STATE_DIG_TWO"); digraphState = DIG_STATE_START; if (key.getKeyChar() != KeyEvent.CHAR_UNDEFINED) { char ch = VimPlugin.getDigraph().getDigraph(digraphChar, key.getKeyChar()); return new DigraphResult(KeyStroke.getKeyStroke(ch)); } return DigraphResult.BAD; case DIG_STATE_CODE_START: logger.debug("DIG_STATE_CODE_START"); switch (key.getKeyChar()) { case 'o': case 'O': codeMax = 3; digraphState = DIG_STATE_CODE_CHAR; codeType = 8; logger.debug("Octal"); return DigraphResult.OK; case 'x': case 'X': codeMax = 2; digraphState = DIG_STATE_CODE_CHAR; codeType = 16; logger.debug("hex2"); return DigraphResult.OK; case 'u': codeMax = 4; digraphState = DIG_STATE_CODE_CHAR; codeType = 16; logger.debug("hex4"); return DigraphResult.OK; case 'U': codeMax = 8; digraphState = DIG_STATE_CODE_CHAR; codeType = 16; logger.debug("hex8"); return DigraphResult.OK; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': codeMax = 3; digraphState = DIG_STATE_CODE_CHAR; codeType = 10; codeChars[codeCnt++] = key.getKeyChar(); logger.debug("decimal"); return DigraphResult.OK; default: switch (key.getKeyCode()) { case KeyEvent.VK_TAB: KeyStroke code = KeyStroke.getKeyStroke('\t'); digraphState = DIG_STATE_START; return new DigraphResult(code); default: logger.debug("unknown"); digraphState = DIG_STATE_START; return new DigraphResult(key); } } case DIG_STATE_CODE_CHAR: logger.debug("DIG_STATE_CODE_CHAR"); boolean valid = false; switch (codeType) { case 10: if (key.getKeyChar() >= '0' && key.getKeyChar() <= '9') { valid = true; } break; case 8: if (key.getKeyChar() >= '0' && key.getKeyChar() <= '7') { valid = true; } break; case 16: if (key.getKeyChar() >= '0' && key.getKeyChar() <= '9' || key.getKeyChar() >= 'a' && key.getKeyChar() <= 'f' || key.getKeyChar() >= 'A' && key.getKeyChar() <= 'F') { valid = true; } break; } if (valid) { logger.debug("valid"); codeChars[codeCnt++] = key.getKeyChar(); if (codeCnt == codeMax) { String digits = new String(codeChars, 0, codeCnt); int val = Integer.parseInt(digits, codeType); KeyStroke code = KeyStroke.getKeyStroke((char) val); digraphState = DIG_STATE_START; return new DigraphResult(code); } else { return DigraphResult.OK; } } else if (codeCnt > 0) { logger.debug("invalid"); String digits = new String(codeChars, 0, codeCnt); int val = Integer.parseInt(digits, codeType); digraphState = DIG_STATE_START; KeyStroke code = KeyStroke.getKeyStroke((char) val); VimPlugin.getMacro().postKey(key, editor); return new DigraphResult(code); } else { return DigraphResult.BAD; } default: return DigraphResult.BAD; } }