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); } }
/** * 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()); } }
/** 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(); }
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 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; } }