/* $Id: KeyEventUtils.java 17887 2010-01-12 21:17:18Z linus $ ***************************************************************************** * Copyright (c) 2009 Contributors - see below * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * mvw ***************************************************************************** * * Some portions of this file was previously release using the BSD License: */ // Copyright (c) 2006-2007 The Regents of the University of California. All // Rights Reserved. Permission to use, copy, modify, and distribute this // software and its documentation without fee, and without a written // agreement is hereby granted, provided that the above copyright notice // and this paragraph appear in all copies. This software program and // documentation are copyrighted by The Regents of the University of // California. The software program and documentation are supplied "AS // IS", without any accompanying services from The Regents. The Regents // does not warrant that the operation of the program will be // uninterrupted or error-free. The end-user understands that the program // was developed for research purposes and is advised not to rely // exclusively on the program for any reason. IN NO EVENT SHALL THE // UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, // SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, // ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF // THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE // PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF // CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, // UPDATES, ENHANCEMENTS, OR MODIFICATIONS. package org.argouml.util; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import javax.swing.KeyStroke; /** * Utility class for KeyEvents * * @author andrea.nironi@gmail.com */ public class KeyEventUtils { /** * The expression between modifier/modifier and between modifier/text */ public static final String MODIFIER_JOINER = " + "; /** * The text for the shift modifier */ public static final String SHIFT_MODIFIER = "SHIFT"; /** * The text for the ctrl modifier */ public static final String CTRL_MODIFIER = "CTRL"; /** * The text for the meta modifier */ public static final String META_MODIFIER = "META"; /** * The text for the alt modifier */ public static final String ALT_MODIFIER = "ALT"; /** * The text for the alt-gr modifier */ public static final String ALT_GRAPH_MODIFIER = "altGraph"; /** * Returns whether the key in this event is an "action" key. This is a * customization of KeyEvent#isActionKey() * * @param evt * the event to be verified * @return true if the event is an * @see java.awt.event.KeyEvent#isActionKey() */ public static final boolean isActionEvent(KeyEvent evt) { int keyCode = evt.getKeyCode(); switch (keyCode) { // Argo customization case KeyEvent.VK_BACK_SPACE: case KeyEvent.VK_DELETE: case KeyEvent.VK_CANCEL: // KeyEvent.isActionKey() method case KeyEvent.VK_HOME: case KeyEvent.VK_END: case KeyEvent.VK_PAGE_UP: case KeyEvent.VK_PAGE_DOWN: case KeyEvent.VK_UP: case KeyEvent.VK_DOWN: case KeyEvent.VK_LEFT: case KeyEvent.VK_RIGHT: case KeyEvent.VK_KP_LEFT: case KeyEvent.VK_KP_UP: case KeyEvent.VK_KP_RIGHT: case KeyEvent.VK_KP_DOWN: case KeyEvent.VK_F1: case KeyEvent.VK_F2: case KeyEvent.VK_F3: case KeyEvent.VK_F4: case KeyEvent.VK_F5: case KeyEvent.VK_F6: case KeyEvent.VK_F7: case KeyEvent.VK_F8: case KeyEvent.VK_F9: case KeyEvent.VK_F10: case KeyEvent.VK_F11: case KeyEvent.VK_F12: case KeyEvent.VK_F13: case KeyEvent.VK_F14: case KeyEvent.VK_F15: case KeyEvent.VK_F16: case KeyEvent.VK_F17: case KeyEvent.VK_F18: case KeyEvent.VK_F19: case KeyEvent.VK_F20: case KeyEvent.VK_F21: case KeyEvent.VK_F22: case KeyEvent.VK_F23: case KeyEvent.VK_F24: case KeyEvent.VK_PRINTSCREEN: case KeyEvent.VK_SCROLL_LOCK: case KeyEvent.VK_CAPS_LOCK: case KeyEvent.VK_NUM_LOCK: case KeyEvent.VK_PAUSE: case KeyEvent.VK_INSERT: case KeyEvent.VK_FINAL: case KeyEvent.VK_CONVERT: case KeyEvent.VK_NONCONVERT: case KeyEvent.VK_ACCEPT: case KeyEvent.VK_MODECHANGE: case KeyEvent.VK_KANA: case KeyEvent.VK_KANJI: case KeyEvent.VK_ALPHANUMERIC: case KeyEvent.VK_KATAKANA: case KeyEvent.VK_HIRAGANA: case KeyEvent.VK_FULL_WIDTH: case KeyEvent.VK_HALF_WIDTH: case KeyEvent.VK_ROMAN_CHARACTERS: case KeyEvent.VK_ALL_CANDIDATES: case KeyEvent.VK_PREVIOUS_CANDIDATE: case KeyEvent.VK_CODE_INPUT: case KeyEvent.VK_JAPANESE_KATAKANA: case KeyEvent.VK_JAPANESE_HIRAGANA: case KeyEvent.VK_JAPANESE_ROMAN: case KeyEvent.VK_KANA_LOCK: case KeyEvent.VK_INPUT_METHOD_ON_OFF: case KeyEvent.VK_AGAIN: case KeyEvent.VK_UNDO: case KeyEvent.VK_COPY: case KeyEvent.VK_PASTE: case KeyEvent.VK_CUT: case KeyEvent.VK_FIND: case KeyEvent.VK_PROPS: case KeyEvent.VK_STOP: case KeyEvent.VK_HELP: return true; } return false; } /** * Returns a unique text for a KeyEvent code * * @param keyCode the keyCode to be "translated" * @return the corrisponding text for the keyCode */ public static String getKeyText(int keyCode) { int expectedModifiers = (Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL); Field[] fields = KeyEvent.class.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { try { if (fields[i].getModifiers() == expectedModifiers && fields[i].getType() == Integer.TYPE && fields[i].getName().startsWith("VK_") && fields[i].getInt(KeyEvent.class) == keyCode) { return fields[i].getName().substring(3); } } catch (IllegalAccessException e) { } } return "UNKNOWN"; } /** * Returns a unique text for the given key modifiers * * @param modifiers the modifiers to be "translated" * @return the corrisponding text for the keyCode */ public static String getModifiersText(int modifiers) { StringBuffer buf = new StringBuffer(); if ((modifiers & InputEvent.SHIFT_MASK) != 0) { buf.append(SHIFT_MODIFIER).append(MODIFIER_JOINER); } if ((modifiers & InputEvent.CTRL_MASK) != 0) { buf.append(CTRL_MODIFIER).append(MODIFIER_JOINER); } if ((modifiers & InputEvent.META_MASK) != 0) { buf.append(META_MODIFIER).append(MODIFIER_JOINER); } if ((modifiers & InputEvent.ALT_MASK) != 0) { buf.append(ALT_MODIFIER).append(MODIFIER_JOINER); } if ((modifiers & InputEvent.ALT_GRAPH_MASK) != 0) { buf.append(ALT_GRAPH_MODIFIER).append(MODIFIER_JOINER); } return buf.toString(); } /** * Formats a given KeyStroke into a string * * @param keyStroke the KeyStroke to be formatted * @return the formatted String */ public static String formatKeyStroke(KeyStroke keyStroke) { if (keyStroke != null) { return getModifiersText(keyStroke.getModifiers()) + KeyEventUtils.getKeyText(keyStroke.getKeyCode()); } else { return ""; } } }