forked from dorkbox/SystemTray
API CHANGE (setIcon -> setImage) for API consistency with how
menus/entries get their image set. Class heirarchy is now consistent with all menu types (system tray + sub-menus)
This commit is contained in:
parent
87222f8483
commit
1a35cb8726
@ -29,7 +29,7 @@ import dorkbox.systemTray.util.ImageUtils;
|
||||
*/
|
||||
@SuppressWarnings({"WeakerAccess", "unused"})
|
||||
public abstract
|
||||
class Menu {
|
||||
class Menu implements MenuEntry {
|
||||
public static final AtomicInteger MENU_ID_COUNTER = new AtomicInteger();
|
||||
private final int id = Menu.MENU_ID_COUNTER.getAndIncrement();
|
||||
|
||||
|
@ -746,72 +746,19 @@ class SystemTray extends Menu {
|
||||
}
|
||||
|
||||
protected
|
||||
void setIcon_(File iconPath) {
|
||||
void setImage_(File iconPath) {
|
||||
final Menu menu = systemTrayMenu;
|
||||
if (menu instanceof AppIndicatorTray) {
|
||||
((AppIndicatorTray) menu).setIcon_(iconPath);
|
||||
((AppIndicatorTray) menu).setImage_(iconPath);
|
||||
}
|
||||
else if (menu instanceof GtkSystemTray) {
|
||||
((GtkSystemTray) menu).setIcon_(iconPath);
|
||||
((GtkSystemTray) menu).setImage_(iconPath);
|
||||
} else {
|
||||
// swing
|
||||
((SwingSystemTray) menu).setIcon_(iconPath);
|
||||
// swing (windows/mac)
|
||||
((SwingSystemTray) menu).setImage_(iconPath);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray icon used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load icons for the system tray,
|
||||
* this will directly use the contents of the specified file.
|
||||
*
|
||||
* @param imagePath the path of the icon to use
|
||||
*/
|
||||
public
|
||||
void setIcon(String imagePath) {
|
||||
setIcon_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, imagePath));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray icon used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load icons for the system tray, this will copy the contents of
|
||||
* the URL to a temporary location on disk, based on the path specified by the URL.
|
||||
*
|
||||
* @param imageUrl the URL of the icon to use
|
||||
*/
|
||||
public
|
||||
void setIcon(URL imageUrl) {
|
||||
setIcon_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, imageUrl));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray icon used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load icons for the system tray, this will copy the contents of
|
||||
* the imageStream to a temporary location on disk, based on the `cacheName` specified.
|
||||
*
|
||||
* @param cacheName the name to use for lookup in the cache for the iconStream
|
||||
* @param imageStream the InputStream of the icon to use
|
||||
*/
|
||||
public
|
||||
void setIcon(String cacheName, InputStream imageStream) {
|
||||
setIcon_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, cacheName, imageStream));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray icon used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load icons for the system tray, this will copy the contents of
|
||||
* the imageStream to a temporary location on disk.
|
||||
*
|
||||
* @param imageStream the InputStream of the icon to use
|
||||
*/
|
||||
public
|
||||
void setIcon(InputStream imageStream) {
|
||||
setIcon_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, imageStream));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the parent menu (of this menu) or null if we are the root menu
|
||||
*/
|
||||
@ -866,6 +813,110 @@ class SystemTray extends Menu {
|
||||
void setEnabled(final boolean enabled) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public
|
||||
String getText() {
|
||||
return "";
|
||||
}
|
||||
|
||||
// NO OP.
|
||||
@Override
|
||||
public
|
||||
void setText(final String newText) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray image used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load images for the system tray,
|
||||
* this will directly use the contents of the specified file.
|
||||
*
|
||||
* @param imageFile the path of the image to use
|
||||
*/
|
||||
@Override
|
||||
public
|
||||
void setImage(final File imageFile) {
|
||||
setImage_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, imageFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray image used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load images for the system tray,
|
||||
* this will directly use the contents of the specified file.
|
||||
*
|
||||
* @param imagePath the path of the image to use
|
||||
*/
|
||||
@Override
|
||||
public
|
||||
void setImage(final String imagePath) {
|
||||
setImage_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, imagePath));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray image used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load images for the system tray, this will copy the contents of
|
||||
* the URL to a temporary location on disk, based on the path specified by the URL.
|
||||
*
|
||||
* @param imageUrl the URL of the image to use
|
||||
*/
|
||||
@Override
|
||||
public
|
||||
void setImage(URL imageUrl) {
|
||||
setImage_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, imageUrl));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray image used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load images for the system tray, this will copy the contents of
|
||||
* the imageStream to a temporary location on disk, based on the `cacheName` specified.
|
||||
*
|
||||
* @param cacheName the name to use for lookup in the cache for the imageStream
|
||||
* @param imageStream the InputStream of the image to use
|
||||
*/
|
||||
@Override
|
||||
public
|
||||
void setImage(String cacheName, InputStream imageStream) {
|
||||
setImage_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, cacheName, imageStream));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the tray image used.
|
||||
*
|
||||
* Because the cross-platform, underlying system uses a file path to load images for the system tray, this will copy the contents of
|
||||
* the imageStream to a temporary location on disk.
|
||||
*
|
||||
* @param imageStream the InputStream of the image to use
|
||||
*/
|
||||
@Override
|
||||
public
|
||||
void setImage(final InputStream imageStream) {
|
||||
setImage_(ImageUtils.resizeAndCache(ImageUtils.TRAY_SIZE, imageStream));
|
||||
}
|
||||
|
||||
/**
|
||||
* By default, we always have an image for the system tray
|
||||
*/
|
||||
@Override
|
||||
public
|
||||
boolean hasImage() {
|
||||
return true;
|
||||
}
|
||||
|
||||
// NO OP.
|
||||
@Override
|
||||
public
|
||||
void setCallback(final SystemTrayMenuAction callback) {
|
||||
}
|
||||
|
||||
// NO OP.
|
||||
@Override
|
||||
public
|
||||
void setShortcut(final char key) {
|
||||
}
|
||||
|
||||
// NO OP.
|
||||
@Override
|
||||
protected
|
||||
|
@ -105,7 +105,7 @@ class AppIndicatorTray extends GtkTypeSystemTray {
|
||||
}
|
||||
|
||||
public
|
||||
void setIcon_(final File iconFile) {
|
||||
void setImage_(final File iconFile) {
|
||||
dispatch(new Runnable() {
|
||||
@Override
|
||||
public
|
||||
|
@ -34,7 +34,8 @@ import dorkbox.systemTray.SystemTrayMenuAction;
|
||||
import dorkbox.systemTray.linux.jna.Gobject;
|
||||
import dorkbox.systemTray.linux.jna.Gtk;
|
||||
|
||||
class GtkMenu extends Menu implements MenuEntry {
|
||||
@SuppressWarnings("ForLoopReplaceableByForEach")
|
||||
class GtkMenu extends Menu {
|
||||
// menu entry that this menu is attached to. Will be NULL when it's the system tray
|
||||
private final GtkEntryItem menuEntry;
|
||||
|
||||
@ -233,9 +234,8 @@ class GtkMenu extends Menu implements MenuEntry {
|
||||
if (_native != null) {
|
||||
// have to remove all other menu entries
|
||||
synchronized (menuEntries) {
|
||||
for (int i = 0; i < menuEntries.size(); i++) {
|
||||
MenuEntry menuEntry__ = menuEntries.get(i);
|
||||
|
||||
for (int i = 0, menuEntriesSize = menuEntries.size(); i < menuEntriesSize; i++) {
|
||||
final MenuEntry menuEntry__ = menuEntries.get(i);
|
||||
if (menuEntry__ instanceof GtkEntry) {
|
||||
GtkEntry entry = (GtkEntry) menuEntry__;
|
||||
|
||||
@ -282,11 +282,13 @@ class GtkMenu extends Menu implements MenuEntry {
|
||||
|
||||
// now add back other menu entries
|
||||
synchronized (menuEntries) {
|
||||
for (MenuEntry menuEntry__ : menuEntries) {
|
||||
for (int i = 0, menuEntriesSize = menuEntries.size(); i < menuEntriesSize; i++) {
|
||||
final MenuEntry menuEntry__ = menuEntries.get(i);
|
||||
hasImages |= menuEntry__.hasImage();
|
||||
}
|
||||
|
||||
for (MenuEntry menuEntry__ : menuEntries) {
|
||||
for (int i = 0, menuEntriesSize = menuEntries.size(); i < menuEntriesSize; i++) {
|
||||
final MenuEntry menuEntry__ = menuEntries.get(i);
|
||||
// the menu entry looks FUNKY when there are a mis-match of entries WITH and WITHOUT images
|
||||
if (menuEntry__ instanceof GtkEntry) {
|
||||
GtkEntry entry = (GtkEntry) menuEntry__;
|
||||
@ -327,8 +329,8 @@ class GtkMenu extends Menu implements MenuEntry {
|
||||
|
||||
// have to remove all other menu entries
|
||||
synchronized (menuEntries) {
|
||||
for (int i = 0; i < menuEntries.size(); i++) {
|
||||
MenuEntry menuEntry__ = menuEntries.get(i);
|
||||
for (int i = 0, menuEntriesSize = menuEntries.size(); i < menuEntriesSize; i++) {
|
||||
final MenuEntry menuEntry__ = menuEntries.get(i);
|
||||
menuEntry__.remove();
|
||||
}
|
||||
menuEntries.clear();
|
||||
|
@ -141,7 +141,7 @@ class GtkSystemTray extends GtkTypeSystemTray {
|
||||
}
|
||||
|
||||
public
|
||||
void setIcon_(final File iconFile) {
|
||||
void setImage_(final File iconFile) {
|
||||
dispatch(new Runnable() {
|
||||
@Override
|
||||
public
|
||||
|
@ -70,7 +70,8 @@ class GtkTypeSystemTray extends GtkMenu {
|
||||
menuEntry = new GtkEntryStatus(GtkTypeSystemTray.this, statusText);
|
||||
// status is ALWAYS at 0 index...
|
||||
menuEntries.add(0, menuEntry);
|
||||
} else if (menuEntry instanceof GtkEntryStatus) {
|
||||
}
|
||||
else if (menuEntry instanceof GtkEntryStatus) {
|
||||
// change the text?
|
||||
if (statusText != null) {
|
||||
menuEntry = new GtkEntryStatus(GtkTypeSystemTray.this, statusText);
|
||||
|
@ -35,7 +35,7 @@ import dorkbox.systemTray.util.ImageUtils;
|
||||
import dorkbox.util.SwingUtil;
|
||||
|
||||
// this is a weird composite class, because it must be a Menu, but ALSO a MenuEntry -- so it has both
|
||||
class SwingMenu extends Menu implements MenuEntry {
|
||||
class SwingMenu extends Menu {
|
||||
|
||||
volatile JComponent _native;
|
||||
|
||||
|
@ -134,7 +134,7 @@ class SwingSystemTray extends SwingMenu {
|
||||
}
|
||||
|
||||
public
|
||||
void setIcon_(final File iconFile) {
|
||||
void setImage_(final File iconFile) {
|
||||
dispatch(new Runnable() {
|
||||
@Override
|
||||
public
|
||||
|
@ -50,7 +50,7 @@ class TestTray {
|
||||
throw new RuntimeException("Unable to load SystemTray!");
|
||||
}
|
||||
|
||||
systemTray.setIcon(LT_GRAY_MAIL);
|
||||
systemTray.setImage(LT_GRAY_MAIL);
|
||||
systemTray.setStatus("No Mail");
|
||||
|
||||
callbackGreen = new SystemTrayMenuAction() {
|
||||
@ -58,7 +58,7 @@ class TestTray {
|
||||
public
|
||||
void onClick(final SystemTray systemTray, final Menu parent, final MenuEntry menuEntry) {
|
||||
systemTray.setStatus("Some Mail!");
|
||||
systemTray.setIcon(GREEN_MAIL);
|
||||
systemTray.setImage(GREEN_MAIL);
|
||||
|
||||
menuEntry.setCallback(callbackGray);
|
||||
menuEntry.setImage(BLACK_MAIL);
|
||||
@ -72,7 +72,7 @@ class TestTray {
|
||||
public
|
||||
void onClick(final SystemTray systemTray, final Menu parent, final MenuEntry menuEntry) {
|
||||
systemTray.setStatus(null);
|
||||
systemTray.setIcon(BLACK_MAIL);
|
||||
systemTray.setImage(BLACK_MAIL);
|
||||
|
||||
menuEntry.setCallback(null);
|
||||
// systemTray.setStatus("Mail Empty");
|
||||
@ -81,7 +81,10 @@ class TestTray {
|
||||
}
|
||||
};
|
||||
|
||||
this.systemTray.addEntry("Green Mail", GREEN_MAIL, callbackGreen);
|
||||
MenuEntry menuEntry = this.systemTray.addEntry("Green Mail", GREEN_MAIL, callbackGreen);
|
||||
// case does not matter
|
||||
menuEntry.setShortcut('G');
|
||||
|
||||
this.systemTray.addSeparator();
|
||||
|
||||
final Menu submenu = this.systemTray.addMenu("Options", BLACK_MAIL);
|
||||
@ -108,6 +111,6 @@ class TestTray {
|
||||
systemTray.shutdown();
|
||||
//System.exit(0); not necessary if all non-daemon threads have stopped.
|
||||
}
|
||||
});
|
||||
}).setShortcut('q'); // case does not matter
|
||||
}
|
||||
}
|
||||
|
@ -83,7 +83,7 @@ class TestTrayJavaFX extends Application {
|
||||
throw new RuntimeException("Unable to load SystemTray!");
|
||||
}
|
||||
|
||||
this.systemTray.setIcon(LT_GRAY_MAIL);
|
||||
this.systemTray.setImage(LT_GRAY_MAIL);
|
||||
|
||||
systemTray.setStatus("No Mail");
|
||||
|
||||
@ -91,7 +91,7 @@ class TestTrayJavaFX extends Application {
|
||||
@Override
|
||||
public
|
||||
void onClick(final SystemTray systemTray, final Menu parent, final MenuEntry menuEntry) {
|
||||
systemTray.setIcon(GREEN_MAIL);
|
||||
systemTray.setImage(GREEN_MAIL);
|
||||
systemTray.setStatus("Some Mail!");
|
||||
|
||||
menuEntry.setCallback(callbackGray);
|
||||
@ -106,7 +106,7 @@ class TestTrayJavaFX extends Application {
|
||||
public
|
||||
void onClick(final SystemTray systemTray, final Menu parent, final MenuEntry menuEntry) {
|
||||
systemTray.setStatus(null);
|
||||
systemTray.setIcon(BLACK_MAIL);
|
||||
systemTray.setImage(BLACK_MAIL);
|
||||
|
||||
menuEntry.setCallback(null);
|
||||
// systemTray.setStatus("Mail Empty");
|
||||
@ -115,7 +115,10 @@ class TestTrayJavaFX extends Application {
|
||||
}
|
||||
};
|
||||
|
||||
this.systemTray.addEntry("Green Mail", GREEN_MAIL, callbackGreen);
|
||||
MenuEntry menuEntry = this.systemTray.addEntry("Green Mail", GREEN_MAIL, callbackGreen);
|
||||
// case does not matter
|
||||
menuEntry.setShortcut('G');
|
||||
|
||||
this.systemTray.addSeparator();
|
||||
|
||||
final Menu submenu = this.systemTray.addMenu("Options", BLACK_MAIL);
|
||||
@ -142,6 +145,6 @@ class TestTrayJavaFX extends Application {
|
||||
Platform.exit(); // necessary to close javaFx
|
||||
//System.exit(0); not necessary if all non-daemon threads have stopped.
|
||||
}
|
||||
});
|
||||
}).setShortcut('q'); // case does not matter
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ class TestTraySwt {
|
||||
throw new RuntimeException("Unable to load SystemTray!");
|
||||
}
|
||||
|
||||
this.systemTray.setIcon(LT_GRAY_MAIL);
|
||||
this.systemTray.setImage(LT_GRAY_MAIL);
|
||||
|
||||
systemTray.setStatus("No Mail");
|
||||
|
||||
@ -76,7 +76,7 @@ class TestTraySwt {
|
||||
public
|
||||
void onClick(final SystemTray systemTray, final Menu parent, final MenuEntry menuEntry) {
|
||||
systemTray.setStatus("Some Mail!");
|
||||
systemTray.setIcon(GREEN_MAIL);
|
||||
systemTray.setImage(GREEN_MAIL);
|
||||
|
||||
menuEntry.setCallback(callbackGray);
|
||||
menuEntry.setImage(BLACK_MAIL);
|
||||
@ -90,7 +90,7 @@ class TestTraySwt {
|
||||
public
|
||||
void onClick(final SystemTray systemTray, final Menu parent, final MenuEntry menuEntry) {
|
||||
systemTray.setStatus(null);
|
||||
systemTray.setIcon(BLACK_MAIL);
|
||||
systemTray.setImage(BLACK_MAIL);
|
||||
|
||||
menuEntry.setCallback(null);
|
||||
// systemTray.setStatus("Mail Empty");
|
||||
@ -99,7 +99,10 @@ class TestTraySwt {
|
||||
}
|
||||
};
|
||||
|
||||
this.systemTray.addEntry("Green Mail", GREEN_MAIL, callbackGreen);
|
||||
MenuEntry menuEntry = this.systemTray.addEntry("Green Mail", GREEN_MAIL, callbackGreen);
|
||||
// case does not matter
|
||||
menuEntry.setShortcut('G');
|
||||
|
||||
this.systemTray.addSeparator();
|
||||
|
||||
final Menu submenu = this.systemTray.addMenu("Options", BLACK_MAIL);
|
||||
@ -132,7 +135,7 @@ class TestTraySwt {
|
||||
|
||||
//System.exit(0); not necessary if all non-daemon threads have stopped.
|
||||
}
|
||||
});
|
||||
}).setShortcut('q'); // case does not matter
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user