blob: 3e21118b5b3e2e14676443fa2ac67d397bff6248 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}