Code cleanup/polish. Can now add JMenu, JCheckboxMenuItem,

JSeparator, and JMenuItem as components that will get converted and
added to our menu.
This commit is contained in:
nathan 2016-10-31 11:32:49 +01:00
parent 568fb95ee6
commit fef02fba79
17 changed files with 269 additions and 162 deletions

View File

@ -18,6 +18,7 @@ package dorkbox.systemTray;
import java.awt.event.ActionListener;
import dorkbox.systemTray.peer.CheckboxPeer;
import dorkbox.util.SwingUtil;
/**
* This represents a common menu-checkbox entry, that is cross platform in nature
@ -73,13 +74,13 @@ class Checkbox extends Entry {
}
/**
* Sets the checked status for this entry
* Sets the checked on/off status for this entry
*
* @param checked true to show the checkbox, false to hide it
* @param isChecked true to show the checkbox, false to hide it
*/
public synchronized
void setChecked(boolean checked) {
this.isChecked = checked;
void setState(boolean isChecked) {
this.isChecked = isChecked;
if (peer != null) {
((CheckboxPeer) peer).setChecked(this);
@ -177,4 +178,21 @@ class Checkbox extends Entry {
((CheckboxPeer) peer).setShortcut(this);
}
}
/**
* Sets a menu entry shortcut key (Mnemonic) so that menu entry can be "selected" via the keyboard while the menu is displayed.
*
* Mnemonics are case-insensitive, and if the character defined by the mnemonic is found within the text, the first occurrence
* of it will be underlined.
*
* @param key this is the VK key to set as the mnemonic
*/
public synchronized
void setShortcut(final int key) {
this.mnemonicKey = SwingUtil.getFromVirtualKey(key);
if (peer != null) {
((CheckboxPeer) peer).setShortcut(this);
}
}
}

View File

@ -15,8 +15,11 @@
*/
package dorkbox.systemTray;
import java.awt.Component;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
@ -24,6 +27,12 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import dorkbox.systemTray.peer.MenuPeer;
/**
@ -113,11 +122,11 @@ class Menu extends MenuItem {
}
}
/**
* Adds a swing widget as a menu entry.
*
* @param widget the JComponent that is to be added as an entry
*/
// /**
// * Adds a swing widget as a menu entry.
// *
// * @param widget the JComponent that is to be added as an entry
// */
// TODO: buggy. The menu will **sometimes** stop responding to the "enter" key after this. Mnemonics still work however.
// Entry add(JComponent widget);
@ -129,6 +138,130 @@ class Menu extends MenuItem {
return add(entry, -1);
}
/**
* Adds a JMenu sub-menu to this menu. Because this is a conversion, the JMenu is no longer valid after this action.
*/
@SuppressWarnings("Duplicates")
public final
Menu add(final JMenu entry) {
Menu menu = new Menu();
menu.setEnabled(entry.isEnabled());
Icon icon = entry.getIcon();
BufferedImage bimage = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
menu.setImage(bimage);
menu.setText(entry.getText());
menu.setShortcut(entry.getMnemonic());
Component[] menuComponents = entry.getMenuComponents();
for (int i = 0, menuComponentsLength = menuComponents.length; i < menuComponentsLength; i++) {
final Component c = menuComponents[i];
if (c instanceof JMenu) {
menu.add((JMenu) c);
}
else if (c instanceof JCheckBoxMenuItem) {
menu.add((JCheckBoxMenuItem) c);
}
else if (c instanceof JMenuItem) {
menu.add((JMenuItem) c);
}
else if (c instanceof JSeparator) {
menu.add((JSeparator) c);
}
}
add(menu);
return this;
}
/**
* Adds a JCheckBoxMenuItem entry to this menu. Because this is a conversion, the JCheckBoxMenuItem is no longer valid after this action.
*/
public final
Menu add(final JCheckBoxMenuItem entry) {
Checkbox checkbox = new Checkbox();
final ActionListener[] actionListeners = entry.getActionListeners();
//noinspection Duplicates
if (actionListeners != null) {
if (actionListeners.length == 1) {
checkbox.setCallback(actionListeners[0]);
} else {
ActionListener actionListener = new ActionListener() {
@Override
public
void actionPerformed(final ActionEvent e) {
for (ActionListener actionListener : actionListeners) {
actionListener.actionPerformed(e);
}
}
};
checkbox.setCallback(actionListener);
}
}
checkbox.setEnabled(entry.isEnabled());
checkbox.setState(entry.getState());
checkbox.setShortcut(entry.getMnemonic());
checkbox.setText(entry.getText());
add(checkbox);
return this;
}
/**
* Adds a JMenuItem entry to this menu. Because this is a conversion, the JMenuItem is no longer valid after this action.
*/
public final
Menu add(final JMenuItem entry) {
MenuItem item = new MenuItem();
final ActionListener[] actionListeners = entry.getActionListeners();
//noinspection Duplicates
if (actionListeners != null) {
if (actionListeners.length == 1) {
item.setCallback(actionListeners[0]);
} else {
ActionListener actionListener = new ActionListener() {
@Override
public
void actionPerformed(final ActionEvent e) {
for (ActionListener actionListener : actionListeners) {
actionListener.actionPerformed(e);
}
}
};
item.setCallback(actionListener);
}
}
item.setEnabled(entry.isEnabled());
Icon icon = entry.getIcon();
BufferedImage bimage = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
item.setImage(bimage);
item.setShortcut(entry.getMnemonic());
item.setText(entry.getText());
add(item);
return this;
}
/**
* Adds a JSeparator entry to this menu. Because this is a conversion, the JSeparator is no longer valid after this action.
*/
public final
Menu add(final JSeparator entry) {
Separator separator = new Separator();
add(separator);
return this;
}
/**
* Adds a menu entry, separator, or sub-menu to this menu.
*/
@ -247,7 +380,7 @@ class Menu extends MenuItem {
* This removes all menu entries from this menu
*/
public synchronized
void removeAll() {
void clear() {
// have to make copy because we are deleting all of them, and sub-menus remove themselves from parents
ArrayList<Entry> menuEntriesCopy = new ArrayList<Entry>(this.menuEntries);
for (Entry entry : menuEntriesCopy) {
@ -263,7 +396,7 @@ class Menu extends MenuItem {
@Override
public synchronized
void remove() {
removeAll();
clear();
super.remove();
}

View File

@ -25,6 +25,7 @@ import javax.imageio.stream.ImageInputStream;
import dorkbox.systemTray.peer.MenuItemPeer;
import dorkbox.systemTray.util.ImageUtils;
import dorkbox.util.SwingUtil;
/**
* This represents a common menu-entry, that is cross platform in nature
@ -325,6 +326,23 @@ class MenuItem extends Entry {
}
}
/**
* Sets a menu entry shortcut key (Mnemonic) so that menu entry can be "selected" via the keyboard while the menu is displayed.
*
* Mnemonics are case-insensitive, and if the character defined by the mnemonic is found within the text, the first occurrence
* of it will be underlined.
*
* @param key this is the VK key to set as the mnemonic
*/
public synchronized
void setShortcut(final int key) {
this.mnemonicKey = SwingUtil.getFromVirtualKey(key);
if (peer != null) {
((MenuItemPeer) peer).setShortcut(this);
}
}
@Override
public synchronized
void remove() {

View File

@ -15,9 +15,11 @@
*/
package dorkbox.systemTray;
import java.awt.Component;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
@ -28,6 +30,11 @@ import java.net.URL;
import java.util.concurrent.atomic.AtomicReference;
import javax.imageio.stream.ImageInputStream;
import javax.swing.Icon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;
import org.slf4j.Logger;
@ -729,6 +736,43 @@ class SystemTray {
return systemTrayMenu;
}
/**
* Converts the specified JMenu into a compatible SystemTray menu, using the JMenu icon as the image for the SystemTray. The currently
* supported menu items are `JMenu`, `JCheckBoxMenuItem`, `JMenuItem`, and `JSeparator`. Because this is a conversion, the JMenu
* is no longer valid after this action.
*
* @return the attached menu to this system tray based on the specified JMenu
*/
public
Menu setMenu(final JMenu jMenu) {
Icon icon = jMenu.getIcon();
BufferedImage bimage = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
setImage(bimage);
Menu menu = getMenu();
Component[] menuComponents = jMenu.getMenuComponents();
for (int i = 0, menuComponentsLength = menuComponents.length; i < menuComponentsLength; i++) {
final Component c = menuComponents[i];
if (c instanceof JMenu) {
menu.add((JMenu) c);
}
else if (c instanceof JCheckBoxMenuItem) {
menu.add((JCheckBoxMenuItem) c);
}
else if (c instanceof JMenuItem) {
menu.add((JMenuItem) c);
}
else if (c instanceof JSeparator) {
menu.add((JSeparator) c);
}
}
return menu;
}
/**
* Shows (if hidden), or hides (if showing) the system tray.
*/

View File

@ -26,7 +26,6 @@ import dorkbox.systemTray.MenuItem;
import dorkbox.systemTray.Separator;
import dorkbox.systemTray.Status;
import dorkbox.systemTray.peer.MenuPeer;
import dorkbox.systemTray.util.SystemTrayFixes;
import dorkbox.util.SwingUtil;
// this is a weird composite class, because it must be a Menu, but ALSO a Entry -- so it has both
@ -126,7 +125,7 @@ class AwtMenu implements MenuPeer {
public
void setShortcut(final MenuItem menuItem) {
// yikes...
final int vKey = SystemTrayFixes.getVirtualKey(menuItem.getShortcut());
final int vKey = SwingUtil.getVirtualKey(menuItem.getShortcut());
SwingUtil.invokeLater(new Runnable() {
@Override

View File

@ -22,7 +22,6 @@ import java.awt.event.ActionListener;
import dorkbox.systemTray.SystemTray;
import dorkbox.systemTray.peer.MenuItemPeer;
import dorkbox.systemTray.util.SystemTrayFixes;
import dorkbox.util.SwingUtil;
class AwtMenuItem implements MenuItemPeer {
@ -105,7 +104,7 @@ class AwtMenuItem implements MenuItemPeer {
void setShortcut(final dorkbox.systemTray.MenuItem menuItem) {
char shortcut = menuItem.getShortcut();
// yikes...
final int vKey = SystemTrayFixes.getVirtualKey(shortcut);
final int vKey = SwingUtil.getVirtualKey(shortcut);
SwingUtil.invokeLater(new Runnable() {
@Override

View File

@ -22,7 +22,6 @@ import java.awt.event.ActionListener;
import dorkbox.systemTray.Checkbox;
import dorkbox.systemTray.SystemTray;
import dorkbox.systemTray.peer.CheckboxPeer;
import dorkbox.systemTray.util.SystemTrayFixes;
import dorkbox.util.SwingUtil;
class AwtMenuItemCheckbox implements CheckboxPeer {
@ -98,7 +97,7 @@ class AwtMenuItemCheckbox implements CheckboxPeer {
void setShortcut(final Checkbox menuItem) {
char shortcut = menuItem.getShortcut();
// yikes...
final int vKey = SystemTrayFixes.getVirtualKey(shortcut);
final int vKey = SwingUtil.getVirtualKey(shortcut);
SwingUtil.invokeLater(new Runnable() {
@Override

View File

@ -85,7 +85,7 @@ class _AppIndicatorNativeTray extends Tray implements NativeUI {
// is the system tray visible or not.
private volatile boolean visible = true;
private volatile File image;
private volatile File imageFile;
// appindicators DO NOT support anything other than PLAIN gtk-menus (which we hack to support swing menus)
@ -134,8 +134,8 @@ class _AppIndicatorNativeTray extends Tray implements NativeUI {
@Override
public
void setImage(final MenuItem menuItem) {
image = menuItem.getImage();
if (image == null) {
imageFile = menuItem.getImage();
if (imageFile == null) {
return;
}
@ -143,7 +143,7 @@ class _AppIndicatorNativeTray extends Tray implements NativeUI {
@Override
public
void run() {
AppIndicator.app_indicator_set_icon(appIndicator, image.getAbsolutePath());
AppIndicator.app_indicator_set_icon(appIndicator, imageFile.getAbsolutePath());
if (!isActive) {
isActive = true;
@ -213,6 +213,6 @@ class _AppIndicatorNativeTray extends Tray implements NativeUI {
@Override
public final
boolean hasImage() {
return image != null;
return imageFile != null;
}
}

View File

@ -48,6 +48,7 @@ class _AwtTray extends Tray implements NativeUI {
// is the system tray visible or not.
private volatile boolean visible = true;
private volatile File imageFile;
private final Object keepAliveLock = new Object[0];
private Thread keepAliveThread;
@ -123,8 +124,8 @@ class _AwtTray extends Tray implements NativeUI {
@Override
public
void setImage(final MenuItem menuItem) {
final File image = menuItem.getImage();
if (image == null) {
imageFile = menuItem.getImage();
if (imageFile == null) {
return;
}
@ -133,7 +134,7 @@ class _AwtTray extends Tray implements NativeUI {
public
void run() {
// stupid java won't scale it right away, so we have to do this twice to get the correct size
final Image trayImage = new ImageIcon(image.getAbsolutePath()).getImage();
final Image trayImage = new ImageIcon(imageFile.getAbsolutePath()).getImage();
trayImage.flush();
if (trayIcon == null) {
@ -189,4 +190,10 @@ class _AwtTray extends Tray implements NativeUI {
bind(awtMenu, null, systemTray);
}
@Override
public
boolean hasImage() {
return imageFile != null;
}
}

View File

@ -54,7 +54,7 @@ class _GtkStatusIconNativeTray extends Tray implements NativeUI {
// is the system tray visible or not.
private volatile boolean visible = true;
private volatile File image;
private volatile File imageFile;
// called on the EDT
public
@ -89,8 +89,8 @@ class _GtkStatusIconNativeTray extends Tray implements NativeUI {
@Override
public
void setImage(final MenuItem menuItem) {
image = menuItem.getImage();
if (image == null) {
imageFile = menuItem.getImage();
if (imageFile == null) {
return;
}
@ -98,7 +98,7 @@ class _GtkStatusIconNativeTray extends Tray implements NativeUI {
@Override
public
void run() {
Gtk.gtk_status_icon_set_from_file(trayIcon, image.getAbsolutePath());
Gtk.gtk_status_icon_set_from_file(trayIcon, imageFile.getAbsolutePath());
if (!isActive) {
isActive = true;
@ -208,6 +208,6 @@ class _GtkStatusIconNativeTray extends Tray implements NativeUI {
@Override
public final
boolean hasImage() {
return image != null;
return imageFile != null;
}
}

View File

@ -27,7 +27,6 @@ import dorkbox.systemTray.MenuItem;
import dorkbox.systemTray.Separator;
import dorkbox.systemTray.Status;
import dorkbox.systemTray.peer.MenuPeer;
import dorkbox.systemTray.util.SystemTrayFixes;
import dorkbox.util.SwingUtil;
// this is a weird composite class, because it must be a Menu, but ALSO a Entry -- so it has both (and duplicate code)
@ -142,7 +141,7 @@ class SwingMenu implements MenuPeer {
void setShortcut(final MenuItem menuItem) {
char shortcut = menuItem.getShortcut();
// yikes...
final int vKey = SystemTrayFixes.getVirtualKey(shortcut);
final int vKey = SwingUtil.getVirtualKey(shortcut);
SwingUtil.invokeLater(new Runnable() {
@Override

View File

@ -25,7 +25,6 @@ import javax.swing.JMenuItem;
import dorkbox.systemTray.MenuItem;
import dorkbox.systemTray.SystemTray;
import dorkbox.systemTray.peer.MenuItemPeer;
import dorkbox.systemTray.util.SystemTrayFixes;
import dorkbox.util.SwingUtil;
class SwingMenuItem implements MenuItemPeer {
@ -121,7 +120,7 @@ class SwingMenuItem implements MenuItemPeer {
void setShortcut(final MenuItem menuItem) {
char shortcut = menuItem.getShortcut();
// yikes...
final int vKey = SystemTrayFixes.getVirtualKey(shortcut);
final int vKey = SwingUtil.getVirtualKey(shortcut);
SwingUtil.invokeLater(new Runnable() {
@Override

View File

@ -26,7 +26,6 @@ import dorkbox.systemTray.Checkbox;
import dorkbox.systemTray.SystemTray;
import dorkbox.systemTray.peer.CheckboxPeer;
import dorkbox.systemTray.util.ImageUtils;
import dorkbox.systemTray.util.SystemTrayFixes;
import dorkbox.util.SwingUtil;
class SwingMenuItemCheckbox implements CheckboxPeer {
@ -92,7 +91,7 @@ class SwingMenuItemCheckbox implements CheckboxPeer {
public
void actionPerformed(ActionEvent e) {
// this will run on the EDT, since we are calling it from the EDT
menuItem.setChecked(!isChecked);
menuItem.setState(!isChecked);
// we want it to run on the EDT, but with our own action event info (so it is consistent across all platforms)
ActionListener cb = menuItem.getCallback();
@ -114,7 +113,7 @@ class SwingMenuItemCheckbox implements CheckboxPeer {
void setShortcut(final Checkbox menuItem) {
char shortcut = menuItem.getShortcut();
// yikes...
final int vKey = SystemTrayFixes.getVirtualKey(shortcut);
final int vKey = SwingUtil.getVirtualKey(shortcut);
SwingUtil.invokeLater(new Runnable() {
@Override

View File

@ -103,7 +103,7 @@ class _AppIndicatorTray extends Tray implements SwingUI {
// is the system tray visible or not.
private volatile boolean visible = true;
private volatile File image;
private volatile File imageFile;
// appindicators DO NOT support anything other than PLAIN gtk-menus (which we hack to support swing menus)
// they ALSO do not support tooltips, so we cater to the lowest common denominator
@ -161,8 +161,8 @@ class _AppIndicatorTray extends Tray implements SwingUI {
@Override
public
void setImage(final MenuItem menuItem) {
image = menuItem.getImage();
if (image == null) {
imageFile = menuItem.getImage();
if (imageFile == null) {
return;
}
@ -170,7 +170,7 @@ class _AppIndicatorTray extends Tray implements SwingUI {
@Override
public
void run() {
AppIndicator.app_indicator_set_icon(appIndicator, image.getAbsolutePath());
AppIndicator.app_indicator_set_icon(appIndicator, imageFile.getAbsolutePath());
if (!isActive) {
isActive = true;
@ -189,7 +189,7 @@ class _AppIndicatorTray extends Tray implements SwingUI {
@Override
public
void run() {
((TrayPopup) _native).setTitleBarImage(image);
((TrayPopup) _native).setTitleBarImage(imageFile);
}
});
}
@ -308,6 +308,6 @@ class _AppIndicatorTray extends Tray implements SwingUI {
@Override
public final
boolean hasImage() {
return image != null;
return imageFile != null;
}
}

View File

@ -59,7 +59,7 @@ class _GtkStatusIconTray extends Tray implements SwingUI {
// is the system tray visible or not.
private volatile boolean visible = true;
private volatile File image;
private volatile File imageFile;
private volatile Runnable popupRunnable;
// called on the EDT
@ -154,8 +154,8 @@ class _GtkStatusIconTray extends Tray implements SwingUI {
@Override
public
void setImage(final MenuItem menuItem) {
image = menuItem.getImage();
if (image == null) {
imageFile = menuItem.getImage();
if (imageFile == null) {
return;
}
@ -163,7 +163,7 @@ class _GtkStatusIconTray extends Tray implements SwingUI {
@Override
public
void run() {
Gtk.gtk_status_icon_set_from_file(trayIcon, image.getAbsolutePath());
Gtk.gtk_status_icon_set_from_file(trayIcon, imageFile.getAbsolutePath());
if (!isActive) {
isActive = true;
@ -177,7 +177,7 @@ class _GtkStatusIconTray extends Tray implements SwingUI {
@Override
public
void run() {
((TrayPopup) _native).setTitleBarImage(image);
((TrayPopup) _native).setTitleBarImage(imageFile);
}
});
}
@ -247,6 +247,6 @@ class _GtkStatusIconTray extends Tray implements SwingUI {
@Override
public
boolean hasImage() {
return image != null;
return imageFile != null;
}
}

View File

@ -46,6 +46,7 @@ class _SwingTray extends Tray implements SwingUI {
// is the system tray visible or not.
private volatile boolean visible = true;
private volatile File imageFile;
// Called in the EDT
public
@ -89,8 +90,8 @@ class _SwingTray extends Tray implements SwingUI {
@Override
public
void setImage(final MenuItem menuItem) {
final File image = menuItem.getImage();
if (image == null) {
imageFile = menuItem.getImage();
if (imageFile == null) {
return;
}
@ -99,7 +100,7 @@ class _SwingTray extends Tray implements SwingUI {
public
void run() {
// stupid java won't scale it right away, so we have to do this twice to get the correct size
final Image trayImage = new ImageIcon(image.getAbsolutePath()).getImage();
final Image trayImage = new ImageIcon(imageFile.getAbsolutePath()).getImage();
trayImage.flush();
if (trayIcon == null) {
@ -132,7 +133,7 @@ class _SwingTray extends Tray implements SwingUI {
trayIcon.setImage(trayImage);
}
((TrayPopup) _native).setTitleBarImage(image);
((TrayPopup) _native).setTitleBarImage(imageFile);
}
});
}
@ -175,6 +176,6 @@ class _SwingTray extends Tray implements SwingUI {
@Override
public
boolean hasImage() {
return tray.getTrayIcons().length > 0;
return imageFile != null;
}
}

View File

@ -18,7 +18,6 @@ package dorkbox.systemTray.util;
import static dorkbox.systemTray.SystemTray.logger;
import java.awt.AWTException;
import java.awt.event.KeyEvent;
import java.util.Locale;
import dorkbox.systemTray.SystemTray;
@ -367,112 +366,5 @@ class SystemTrayFixes {
}
}
/**
* Converts a key character into it's corresponding VK entry
*/
public static
int getVirtualKey(final char key) {
switch (key) {
case 0x08: return KeyEvent.VK_BACK_SPACE;
case 0x09: return KeyEvent.VK_TAB;
case 0x0a: return KeyEvent.VK_ENTER;
case 0x1B: return KeyEvent.VK_ESCAPE;
case 0x20AC: return KeyEvent.VK_EURO_SIGN;
case 0x20: return KeyEvent.VK_SPACE;
case 0x21: return KeyEvent.VK_EXCLAMATION_MARK;
case 0x22: return KeyEvent.VK_QUOTEDBL;
case 0x23: return KeyEvent.VK_NUMBER_SIGN;
case 0x24: return KeyEvent.VK_DOLLAR;
case 0x26: return KeyEvent.VK_AMPERSAND;
case 0x27: return KeyEvent.VK_QUOTE;
case 0x28: return KeyEvent.VK_LEFT_PARENTHESIS;
case 0x29: return KeyEvent.VK_RIGHT_PARENTHESIS;
case 0x2A: return KeyEvent.VK_ASTERISK;
case 0x2B: return KeyEvent.VK_PLUS;
case 0x2C: return KeyEvent.VK_COMMA;
case 0x2D: return KeyEvent.VK_MINUS;
case 0x2E: return KeyEvent.VK_PERIOD;
case 0x2F: return KeyEvent.VK_SLASH;
case 0x30: return KeyEvent.VK_0;
case 0x31: return KeyEvent.VK_1;
case 0x32: return KeyEvent.VK_2;
case 0x33: return KeyEvent.VK_3;
case 0x34: return KeyEvent.VK_4;
case 0x35: return KeyEvent.VK_5;
case 0x36: return KeyEvent.VK_6;
case 0x37: return KeyEvent.VK_7;
case 0x38: return KeyEvent.VK_8;
case 0x39: return KeyEvent.VK_9;
case 0x3A: return KeyEvent.VK_COLON;
case 0x3B: return KeyEvent.VK_SEMICOLON;
case 0x3C: return KeyEvent.VK_LESS;
case 0x3D: return KeyEvent.VK_EQUALS;
case 0x3E: return KeyEvent.VK_GREATER;
case 0x40: return KeyEvent.VK_AT;
case 0x41: return KeyEvent.VK_A;
case 0x42: return KeyEvent.VK_B;
case 0x43: return KeyEvent.VK_C;
case 0x44: return KeyEvent.VK_D;
case 0x45: return KeyEvent.VK_E;
case 0x46: return KeyEvent.VK_F;
case 0x47: return KeyEvent.VK_G;
case 0x48: return KeyEvent.VK_H;
case 0x49: return KeyEvent.VK_I;
case 0x4A: return KeyEvent.VK_J;
case 0x4B: return KeyEvent.VK_K;
case 0x4C: return KeyEvent.VK_L;
case 0x4D: return KeyEvent.VK_M;
case 0x4E: return KeyEvent.VK_N;
case 0x4F: return KeyEvent.VK_O;
case 0x50: return KeyEvent.VK_P;
case 0x51: return KeyEvent.VK_Q;
case 0x52: return KeyEvent.VK_R;
case 0x53: return KeyEvent.VK_S;
case 0x54: return KeyEvent.VK_T;
case 0x55: return KeyEvent.VK_U;
case 0x56: return KeyEvent.VK_V;
case 0x57: return KeyEvent.VK_W;
case 0x58: return KeyEvent.VK_X;
case 0x59: return KeyEvent.VK_Y;
case 0x5A: return KeyEvent.VK_Z;
case 0x5B: return KeyEvent.VK_OPEN_BRACKET;
case 0x5C: return KeyEvent.VK_BACK_SLASH;
case 0x5D: return KeyEvent.VK_CLOSE_BRACKET;
case 0x5E: return KeyEvent.VK_CIRCUMFLEX;
case 0x5F: return KeyEvent.VK_UNDERSCORE;
case 0x60: return KeyEvent.VK_BACK_QUOTE;
case 0x61: return KeyEvent.VK_A;
case 0x62: return KeyEvent.VK_B;
case 0x63: return KeyEvent.VK_C;
case 0x64: return KeyEvent.VK_D;
case 0x65: return KeyEvent.VK_E;
case 0x66: return KeyEvent.VK_F;
case 0x67: return KeyEvent.VK_G;
case 0x68: return KeyEvent.VK_H;
case 0x69: return KeyEvent.VK_I;
case 0x6A: return KeyEvent.VK_J;
case 0x6B: return KeyEvent.VK_K;
case 0x6C: return KeyEvent.VK_L;
case 0x6D: return KeyEvent.VK_M;
case 0x6E: return KeyEvent.VK_N;
case 0x6F: return KeyEvent.VK_O;
case 0x70: return KeyEvent.VK_P;
case 0x71: return KeyEvent.VK_Q;
case 0x72: return KeyEvent.VK_R;
case 0x73: return KeyEvent.VK_S;
case 0x74: return KeyEvent.VK_T;
case 0x75: return KeyEvent.VK_U;
case 0x76: return KeyEvent.VK_V;
case 0x77: return KeyEvent.VK_W;
case 0x78: return KeyEvent.VK_X;
case 0x79: return KeyEvent.VK_Y;
case 0x7A: return KeyEvent.VK_Z;
case 0x7B: return KeyEvent.VK_BRACELEFT;
case 0x7D: return KeyEvent.VK_BRACERIGHT;
case 0x7F: return KeyEvent.VK_DELETE;
case 0xA1: return KeyEvent.VK_INVERTED_EXCLAMATION_MARK;
}
return 0;
}
}