diff --git a/src/dorkbox/systemTray/swing/SwingEntry.java b/src/dorkbox/systemTray/swing/SwingEntry.java index 3031180..886b2e8 100644 --- a/src/dorkbox/systemTray/swing/SwingEntry.java +++ b/src/dorkbox/systemTray/swing/SwingEntry.java @@ -15,11 +15,13 @@ */ package dorkbox.systemTray.swing; +import java.awt.event.KeyEvent; import java.io.File; import java.io.InputStream; import java.net.URL; import javax.swing.JComponent; +import javax.swing.JMenuItem; import dorkbox.systemTray.Menu; import dorkbox.systemTray.MenuEntry; @@ -69,6 +71,23 @@ class SwingEntry implements MenuEntry { _native.setEnabled(enabled); } + @Override + public + void setShortcut(final char key) { + if (_native instanceof JMenuItem) { + // yikes... + final int vKey = getVkKey(key); + + parent.dispatch(new Runnable() { + @Override + public + void run() { + ((JMenuItem) _native).setMnemonic(vKey); + } + }); + } + } + @Override public String getText() { @@ -188,4 +207,114 @@ class SwingEntry implements MenuEntry { SwingEntry other = (SwingEntry) obj; return this.id == other.id; } + + + /** + * Converts a key character into it's corresponding VK entry + */ + static + int getVkKey(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; + } } diff --git a/src/dorkbox/systemTray/swing/SwingEntrySeparator.java b/src/dorkbox/systemTray/swing/SwingEntrySeparator.java index 39fc343..b995e1e 100644 --- a/src/dorkbox/systemTray/swing/SwingEntrySeparator.java +++ b/src/dorkbox/systemTray/swing/SwingEntrySeparator.java @@ -42,6 +42,11 @@ class SwingEntrySeparator extends SwingEntry implements MenuSpacer { void removePrivate() { } + @Override + public + void setShortcut(final char key) { + } + @Override public boolean hasImage() { diff --git a/src/dorkbox/systemTray/swing/SwingEntryStatus.java b/src/dorkbox/systemTray/swing/SwingEntryStatus.java index a39b307..3aa39d9 100644 --- a/src/dorkbox/systemTray/swing/SwingEntryStatus.java +++ b/src/dorkbox/systemTray/swing/SwingEntryStatus.java @@ -50,6 +50,11 @@ class SwingEntryStatus extends SwingEntry implements MenuStatus { void removePrivate() { } + @Override + public + void setShortcut(final char key) { + } + @Override public boolean hasImage() {