/******************************************************************************* * Copyright (c) 2000, 2010 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.gef; import org.eclipse.swt.events.KeyEvent; /** * Encapsulates a Keyboard gesture (press or release) from the User. A KeyStroke * is matched to a KeyEvent based the {@link KeyEvent#stateMask}, * {@link KeyEvent#keyCode} or {@link KeyEvent#character}, and whether that * KeyEvent was dispatched as a result of a release or press by the User. */ public class KeyStroke { /** * Constructs a KeyStroke that will match the given * {@link KeyEvent#character} and {@link KeyEvent#stateMask} during a press * event. * * @param character * the character to match * @param stateMask * the stateMask to match * @return a new KeyStroke */ public static KeyStroke getPressed(char character, int stateMask) { return new KeyStroke(character, stateMask, true); } /** * Constructs a KeyStroke that will match the given {@link KeyEvent#keyCode} * and {@link KeyEvent#stateMask} during a press event. * * @param keyCode * the keyCode to match * @param stateMask * the stateMask to match * @return a new KeyStroke */ public static KeyStroke getPressed(int keyCode, int stateMask) { return new KeyStroke(keyCode, stateMask, true); } /** * Constructs a KeyStroke that will match the given * {@link KeyEvent#character}, {@link KeyEvent#keyCode}, and * {@link KeyEvent#stateMask} during a press event. * * @param character * the character to match * @param keyCode * the keyCode to match * @param stateMask * the stateMask to match * @return a new KeyStroke */ public static KeyStroke getPressed(char character, int keyCode, int stateMask) { return new KeyStroke(character, keyCode, stateMask, true); } /** * Constructs a KeyStroke that will match the given * {@link KeyEvent#character} and {@link KeyEvent#stateMask} during a * release event. * * @param character * the character to match * @param stateMask * the stateMask to match * @return a new KeyStroke */ public static KeyStroke getReleased(char character, int stateMask) { return new KeyStroke(character, stateMask, false); } /** * Constructs a KeyStroke that will match the given {@link KeyEvent#keyCode} * and {@link KeyEvent#stateMask} during a release event. * * @param keyCode * the keyCode to match * @param stateMask * the stateMask to match * @return a new KeyStroke */ public static KeyStroke getReleased(int keyCode, int stateMask) { return new KeyStroke(keyCode, stateMask, false); } /** * Constructs a KeyStroke that will match the given * {@link KeyEvent#character}, {@link KeyEvent#keyCode}, and * {@link KeyEvent#stateMask} during a release event. * * @param character * the character to match * @param keyCode * the keyCode to match * @param stateMask * the stateMask to match * @return a new KeyStroke */ public static KeyStroke getReleased(char character, int keyCode, int stateMask) { return new KeyStroke(character, keyCode, stateMask, false); } private int stateMask; private char character; private boolean onPressed; private int keyCode; /** * Creates a KeyStroke for the specified KeyEvent and pressed value. * * @param event * The KeyEvent * @param pressed * true if the KeyStroke is for a press event */ KeyStroke(KeyEvent event, boolean pressed) { onPressed = pressed; stateMask = event.stateMask; character = event.character; keyCode = event.keyCode; } KeyStroke(int keyCode, int stateMask, boolean onPressed) { this.keyCode = keyCode; this.stateMask = stateMask; this.onPressed = onPressed; } KeyStroke(char character, int stateMask, boolean onPressed) { this.character = character; this.stateMask = stateMask; this.onPressed = onPressed; } KeyStroke(char character, int keyCode, int stateMask, boolean onPressed) { this.character = character; this.keyCode = keyCode; this.stateMask = stateMask; this.onPressed = onPressed; } /** * @return true iff the Object is an equivalent KeyStroke * @param obj * the Object being compared */ public boolean equals(Object obj) { if (obj instanceof KeyStroke) { KeyStroke stroke = (KeyStroke) obj; return stroke.character == character && stroke.keyCode == keyCode && stroke.onPressed == onPressed && stroke.stateMask == stateMask; } return false; } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return (stateMask + 1) * ((character ^ keyCode) + 1) // One of these is // always Zero. + (onPressed ? 0 : 32); } }