blob: 28d3f6c17cbb925bcfb9570bb4a03c1548a59024 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.ui.keys;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.internal.keys.NativeKeyFormatter;
/**
* A utility class for converting SWT events into key strokes.
*
* @deprecated Please use org.eclipse.jface.bindings.keys.SWTKeySupport
* @since 3.0
*/
public final class SWTKeySupport {
/**
* Given an SWT accelerator value, provide the corresponding key stroke.
*
* @param accelerator
* The accelerator to convert; should be a valid SWT accelerator
* value.
* @return The equivalent key stroke; never <code>null</code>.
*/
public static KeyStroke convertAcceleratorToKeyStroke(int accelerator) {
final SortedSet modifierKeys = new TreeSet();
NaturalKey naturalKey = null;
if ((accelerator & SWT.ALT) != 0) {
modifierKeys.add(ModifierKey.ALT);
}
if ((accelerator & SWT.COMMAND) != 0) {
modifierKeys.add(ModifierKey.COMMAND);
}
if ((accelerator & SWT.CTRL) != 0) {
modifierKeys.add(ModifierKey.CTRL);
}
if ((accelerator & SWT.SHIFT) != 0) {
modifierKeys.add(ModifierKey.SHIFT);
}
if (((accelerator & SWT.KEY_MASK) == 0) && (accelerator != 0)) {
// There were only accelerators
naturalKey = null;
} else {
// There were other keys.
accelerator &= SWT.KEY_MASK;
switch (accelerator) {
case SWT.ARROW_DOWN:
naturalKey = SpecialKey.ARROW_DOWN;
break;
case SWT.ARROW_LEFT:
naturalKey = SpecialKey.ARROW_LEFT;
break;
case SWT.ARROW_RIGHT:
naturalKey = SpecialKey.ARROW_RIGHT;
break;
case SWT.ARROW_UP:
naturalKey = SpecialKey.ARROW_UP;
break;
case SWT.BREAK:
naturalKey = SpecialKey.BREAK;
break;
case SWT.CAPS_LOCK:
naturalKey = SpecialKey.CAPS_LOCK;
break;
case SWT.END:
naturalKey = SpecialKey.END;
break;
case SWT.F1:
naturalKey = SpecialKey.F1;
break;
case SWT.F10:
naturalKey = SpecialKey.F10;
break;
case SWT.F11:
naturalKey = SpecialKey.F11;
break;
case SWT.F12:
naturalKey = SpecialKey.F12;
break;
case SWT.F2:
naturalKey = SpecialKey.F2;
break;
case SWT.F3:
naturalKey = SpecialKey.F3;
break;
case SWT.F4:
naturalKey = SpecialKey.F4;
break;
case SWT.F5:
naturalKey = SpecialKey.F5;
break;
case SWT.F6:
naturalKey = SpecialKey.F6;
break;
case SWT.F7:
naturalKey = SpecialKey.F7;
break;
case SWT.F8:
naturalKey = SpecialKey.F8;
break;
case SWT.F9:
naturalKey = SpecialKey.F9;
break;
case SWT.HOME:
naturalKey = SpecialKey.HOME;
break;
case SWT.INSERT:
naturalKey = SpecialKey.INSERT;
break;
case SWT.KEYPAD_0:
naturalKey = SpecialKey.NUMPAD_0;
break;
case SWT.KEYPAD_1:
naturalKey = SpecialKey.NUMPAD_1;
break;
case SWT.KEYPAD_2:
naturalKey = SpecialKey.NUMPAD_2;
break;
case SWT.KEYPAD_3:
naturalKey = SpecialKey.NUMPAD_3;
break;
case SWT.KEYPAD_4:
naturalKey = SpecialKey.NUMPAD_4;
break;
case SWT.KEYPAD_5:
naturalKey = SpecialKey.NUMPAD_5;
break;
case SWT.KEYPAD_6:
naturalKey = SpecialKey.NUMPAD_6;
break;
case SWT.KEYPAD_7:
naturalKey = SpecialKey.NUMPAD_7;
break;
case SWT.KEYPAD_8:
naturalKey = SpecialKey.NUMPAD_8;
break;
case SWT.KEYPAD_9:
naturalKey = SpecialKey.NUMPAD_9;
break;
case SWT.KEYPAD_ADD:
naturalKey = SpecialKey.NUMPAD_ADD;
break;
case SWT.KEYPAD_CR:
naturalKey = SpecialKey.NUMPAD_ENTER;
break;
case SWT.KEYPAD_DECIMAL:
naturalKey = SpecialKey.NUMPAD_DECIMAL;
break;
case SWT.KEYPAD_DIVIDE:
naturalKey = SpecialKey.NUMPAD_DIVIDE;
break;
case SWT.KEYPAD_EQUAL:
naturalKey = SpecialKey.NUMPAD_EQUAL;
break;
case SWT.KEYPAD_MULTIPLY:
naturalKey = SpecialKey.NUMPAD_MULTIPLY;
break;
case SWT.KEYPAD_SUBTRACT:
naturalKey = SpecialKey.NUMPAD_SUBTRACT;
break;
case SWT.NUM_LOCK:
naturalKey = SpecialKey.NUM_LOCK;
break;
case SWT.PAGE_DOWN:
naturalKey = SpecialKey.PAGE_DOWN;
break;
case SWT.PAGE_UP:
naturalKey = SpecialKey.PAGE_UP;
break;
case SWT.PAUSE:
naturalKey = SpecialKey.PAUSE;
break;
case SWT.PRINT_SCREEN:
naturalKey = SpecialKey.PRINT_SCREEN;
break;
case SWT.SCROLL_LOCK:
naturalKey = SpecialKey.SCROLL_LOCK;
break;
default:
naturalKey = CharacterKey
.getInstance((char) (accelerator & 0xFFFF));
}
}
return KeyStroke.getInstance(modifierKeys, naturalKey);
}
/**
* <p>
* Converts the given event into an SWT accelerator value -- considering the
* modified character with the shift modifier. This is the third accelerator
* value that should be checked.
* </p>
* <p>
* For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
* "Ctrl+Shift+%".
* </p>
*
* @param event
* The event to be converted; must not be <code>null</code>.
* @return The combination of the state mask and the unmodified character.
*/
public static int convertEventToModifiedAccelerator(Event event) {
int modifiers = event.stateMask & SWT.MODIFIER_MASK;
char character = topKey(event);
return modifiers + toUpperCase(character);
}
/**
* <p>
* Converts the given event into an SWT accelerator value -- considering the
* unmodified character with all modifier keys. This is the first
* accelerator value that should be checked. However, all alphabetic
* characters are considered as their uppercase equivalents.
* </p>
* <p>
* For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
* "Ctrl+Shift+5".
* </p>
*
* @param event
* The event to be converted; must not be <code>null</code>.
* @return The combination of the state mask and the unmodified character.
*/
public static int convertEventToUnmodifiedAccelerator(Event event) {
return convertEventToUnmodifiedAccelerator(event.stateMask,
event.keyCode);
}
/**
* <p>
* Converts the given state mask and key code into an SWT accelerator value --
* considering the unmodified character with all modifier keys. All
* alphabetic characters are considered as their uppercase equivalents.
* </p>
* <p>
* For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
* "Ctrl+Shift+5".
* </p>
*
* @param stateMask
* The integer mask of modifiers keys depressed when this was
* pressed.
* @param keyCode
* The key that was pressed, before being modified.
* @return The combination of the state mask and the unmodified character.
*/
private static int convertEventToUnmodifiedAccelerator(int stateMask,
int keyCode) {
int modifiers = stateMask & SWT.MODIFIER_MASK;
int character = keyCode;
return modifiers + toUpperCase(character);
}
/**
* <p>
* Converts the given event into an SWT accelerator value -- considering the
* unmodified character with all modifier keys. This is the first
* accelerator value that should be checked. However, all alphabetic
* characters are considered as their uppercase equivalents.
* </p>
* <p>
* For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
* "Ctrl+%".
* </p>
*
* @param event
* The event to be converted; must not be <code>null</code>.
* @return The combination of the state mask and the unmodified character.
*/
public static int convertEventToUnmodifiedAccelerator(KeyEvent event) {
return convertEventToUnmodifiedAccelerator(event.stateMask,
event.keyCode);
}
/**
* Converts the given event into an SWT accelerator value -- considering
* the modified character without the shift modifier. This is the second
* accelerator value that should be checked. Key strokes with alphabetic
* natural keys are run through <code>convertEventToUnmodifiedAccelerator</code>
*
* @param event
* The event to be converted; must not be <code>null</code>.
* @return The combination of the state mask without shift, and the
* modified character.
*/
public static int convertEventToUnshiftedModifiedAccelerator(Event event) {
// Disregard alphabetic key strokes.
if (Character.isLetter((char) event.keyCode)) {
return convertEventToUnmodifiedAccelerator(event);
}
int modifiers = event.stateMask & (SWT.MODIFIER_MASK ^ SWT.SHIFT);
char character = topKey(event);
return modifiers + toUpperCase(character);
}
/**
* Given a key stroke, this method provides the equivalent SWT accelerator
* value. The functional inverse of <code>convertAcceleratorToKeyStroke</code>.
*
* @param keyStroke
* The key stroke to convert; must not be <code>null</code>.
* @return The SWT accelerator value
*/
public static final int convertKeyStrokeToAccelerator(
final KeyStroke keyStroke) {
int accelerator = 0;
final Iterator iterator = keyStroke.getModifierKeys().iterator();
while (iterator.hasNext()) {
final ModifierKey modifierKey = (ModifierKey) iterator.next();
if (modifierKey == ModifierKey.ALT) {
accelerator |= SWT.ALT;
} else if (modifierKey == ModifierKey.COMMAND) {
accelerator |= SWT.COMMAND;
} else if (modifierKey == ModifierKey.CTRL) {
accelerator |= SWT.CTRL;
} else if (modifierKey == ModifierKey.SHIFT) {
accelerator |= SWT.SHIFT;
}
}
final NaturalKey naturalKey = keyStroke.getNaturalKey();
if (naturalKey instanceof CharacterKey) {
accelerator |= ((CharacterKey) naturalKey).getCharacter();
} else if (naturalKey instanceof SpecialKey) {
final SpecialKey specialKey = (SpecialKey) naturalKey;
if (specialKey == SpecialKey.ARROW_DOWN) {
accelerator |= SWT.ARROW_DOWN;
} else if (specialKey == SpecialKey.ARROW_LEFT) {
accelerator |= SWT.ARROW_LEFT;
} else if (specialKey == SpecialKey.ARROW_RIGHT) {
accelerator |= SWT.ARROW_RIGHT;
} else if (specialKey == SpecialKey.ARROW_UP) {
accelerator |= SWT.ARROW_UP;
} else if (specialKey == SpecialKey.END) {
accelerator |= SWT.END;
} else if (specialKey == SpecialKey.F1) {
accelerator |= SWT.F1;
} else if (specialKey == SpecialKey.F10) {
accelerator |= SWT.F10;
} else if (specialKey == SpecialKey.F11) {
accelerator |= SWT.F11;
} else if (specialKey == SpecialKey.F12) {
accelerator |= SWT.F12;
} else if (specialKey == SpecialKey.F2) {
accelerator |= SWT.F2;
} else if (specialKey == SpecialKey.F3) {
accelerator |= SWT.F3;
} else if (specialKey == SpecialKey.F4) {
accelerator |= SWT.F4;
} else if (specialKey == SpecialKey.F5) {
accelerator |= SWT.F5;
} else if (specialKey == SpecialKey.F6) {
accelerator |= SWT.F6;
} else if (specialKey == SpecialKey.F7) {
accelerator |= SWT.F7;
} else if (specialKey == SpecialKey.F8) {
accelerator |= SWT.F8;
} else if (specialKey == SpecialKey.F9) {
accelerator |= SWT.F9;
} else if (specialKey == SpecialKey.HOME) {
accelerator |= SWT.HOME;
} else if (specialKey == SpecialKey.INSERT) {
accelerator |= SWT.INSERT;
} else if (specialKey == SpecialKey.PAGE_DOWN) {
accelerator |= SWT.PAGE_DOWN;
} else if (specialKey == SpecialKey.PAGE_UP) {
accelerator |= SWT.PAGE_UP;
}
}
return accelerator;
}
private static final IKeyFormatter NATIVE_FORMATTER = new NativeKeyFormatter();
/**
* Provides an instance of <code>IKeyFormatter</code> appropriate for the
* current instance.
*
* @return an instance of <code>IKeyFormatter</code> appropriate for the
* current instance; never <code>null</code>.
*/
public static IKeyFormatter getKeyFormatterForPlatform() {
return NATIVE_FORMATTER;
}
/**
* Makes sure that a fully-modified character is converted to the normal
* form. This means that "Ctrl+" key strokes must reverse the modification
* caused by control-escaping. Also, all lower case letters are converted
* to uppercase.
*
* @param event
* The event from which the fully-modified character should be
* pulled.
* @return The modified character, uppercase and without control-escaping.
*/
private static char topKey(Event event) {
char character = event.character;
boolean ctrlDown = (event.stateMask & SWT.CTRL) != 0;
if (ctrlDown && event.character != event.keyCode
&& event.character < 0x20) {
character += 0x40;
}
return character;
}
/**
* Makes the given character uppercase if it is a letter.
*
* @param keyCode
* The character to convert.
* @return The uppercase equivalent, if any; otherwise, the character
* itself.
*/
private static int toUpperCase(int keyCode) {
// Will this key code be truncated?
if (keyCode > 0xFFFF) {
return keyCode;
}
// Downcast in safety. Only make characters uppercase.
char character = (char) keyCode;
return Character.isLetter(character) ? Character.toUpperCase(character)
: keyCode;
}
/**
* This class should never be instantiated.
*/
private SWTKeySupport() {
// This class should never be instantiated.
}
}