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:
parent
568fb95ee6
commit
fef02fba79
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue