2015-11-09 16:13:57 +01:00
|
|
|
/*
|
|
|
|
* Copyright 2014 dorkbox, llc
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2016-02-12 01:51:15 +01:00
|
|
|
package dorkbox.systemTray.swing;
|
2015-11-09 16:13:57 +01:00
|
|
|
|
|
|
|
import java.awt.event.ActionEvent;
|
|
|
|
import java.awt.event.ActionListener;
|
2016-02-21 00:56:30 +01:00
|
|
|
import java.io.File;
|
2016-02-12 01:51:15 +01:00
|
|
|
import java.io.InputStream;
|
|
|
|
import java.net.URL;
|
2015-11-09 16:13:57 +01:00
|
|
|
|
2016-09-26 02:06:27 +02:00
|
|
|
import javax.swing.ImageIcon;
|
|
|
|
import javax.swing.JMenuItem;
|
|
|
|
|
|
|
|
import dorkbox.systemTray.MenuEntry;
|
|
|
|
import dorkbox.systemTray.SystemTray;
|
|
|
|
import dorkbox.systemTray.SystemTrayMenuAction;
|
|
|
|
import dorkbox.systemTray.util.ImageUtils;
|
|
|
|
import dorkbox.util.SwingUtil;
|
2016-02-21 00:56:30 +01:00
|
|
|
|
2016-09-26 02:06:27 +02:00
|
|
|
class SwingMenuEntry implements MenuEntry {
|
2016-02-13 15:06:19 +01:00
|
|
|
private final SwingSystemTrayMenuPopup parent;
|
2015-11-09 16:13:57 +01:00
|
|
|
private final SystemTray systemTray;
|
|
|
|
private final JMenuItem menuItem;
|
|
|
|
private final ActionListener swingCallback;
|
|
|
|
|
|
|
|
private volatile String text;
|
|
|
|
private volatile SystemTrayMenuAction callback;
|
|
|
|
|
2016-09-26 02:06:27 +02:00
|
|
|
// this is ALWAYS called on the EDT.
|
|
|
|
SwingMenuEntry(final SwingSystemTrayMenuPopup parentMenu, final String label, final File imagePath, final SystemTrayMenuAction callback,
|
2015-11-09 16:13:57 +01:00
|
|
|
final SystemTray systemTray) {
|
|
|
|
this.parent = parentMenu;
|
|
|
|
this.text = label;
|
|
|
|
this.callback = callback;
|
|
|
|
this.systemTray = systemTray;
|
|
|
|
|
|
|
|
swingCallback = new ActionListener() {
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
void actionPerformed(ActionEvent e) {
|
|
|
|
// we want it to run on the EDT
|
|
|
|
handle();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
menuItem = new JMenuItem(label);
|
|
|
|
menuItem.addActionListener(swingCallback);
|
|
|
|
|
2016-09-26 02:06:27 +02:00
|
|
|
if (imagePath != null) {
|
2016-02-21 00:56:30 +01:00
|
|
|
setImageIcon(imagePath);
|
2015-11-09 16:13:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
parentMenu.add(menuItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
private
|
|
|
|
void handle() {
|
|
|
|
SystemTrayMenuAction cb = this.callback;
|
|
|
|
if (cb != null) {
|
|
|
|
cb.onClick(systemTray, this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
String getText() {
|
|
|
|
return text;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
void setText(final String newText) {
|
|
|
|
this.text = newText;
|
|
|
|
|
|
|
|
SwingUtil.invokeLater(new Runnable() {
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
void run() {
|
|
|
|
menuItem.setText(newText);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-02-12 01:51:15 +01:00
|
|
|
private
|
2016-09-26 02:06:27 +02:00
|
|
|
void setImage_(final File imagePath) {
|
2015-11-09 16:13:57 +01:00
|
|
|
SwingUtil.invokeLater(new Runnable() {
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
void run() {
|
2016-02-21 00:56:30 +01:00
|
|
|
setImageIcon(imagePath);
|
2015-11-09 16:13:57 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-09-26 02:06:27 +02:00
|
|
|
// always called on the EDT
|
2016-02-21 00:56:30 +01:00
|
|
|
private
|
2016-09-26 02:06:27 +02:00
|
|
|
void setImageIcon(final File imagePath) {
|
|
|
|
if (imagePath != null) {
|
|
|
|
ImageIcon origIcon = new ImageIcon(imagePath.getAbsolutePath());
|
2016-02-21 00:56:30 +01:00
|
|
|
menuItem.setIcon(origIcon);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
menuItem.setIcon(null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-12 01:51:15 +01:00
|
|
|
@Override
|
|
|
|
public
|
2016-02-14 17:49:02 +01:00
|
|
|
void setImage(final String imagePath) {
|
2016-02-12 01:51:15 +01:00
|
|
|
if (imagePath == null) {
|
|
|
|
setImage_(null);
|
|
|
|
}
|
|
|
|
else {
|
2016-09-26 20:56:42 +02:00
|
|
|
setImage_(ImageUtils.resizeAndCache(ImageUtils.ENTRY_SIZE, imagePath));
|
2016-02-12 01:51:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public
|
2016-02-14 17:49:02 +01:00
|
|
|
void setImage(final URL imageUrl) {
|
2016-02-12 01:51:15 +01:00
|
|
|
if (imageUrl == null) {
|
|
|
|
setImage_(null);
|
|
|
|
}
|
|
|
|
else {
|
2016-09-26 20:56:42 +02:00
|
|
|
setImage_(ImageUtils.resizeAndCache(ImageUtils.ENTRY_SIZE, imageUrl));
|
2016-02-12 01:51:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public
|
2016-02-14 17:49:02 +01:00
|
|
|
void setImage(final String cacheName, final InputStream imageStream) {
|
2016-02-12 01:51:15 +01:00
|
|
|
if (imageStream == null) {
|
|
|
|
setImage_(null);
|
|
|
|
}
|
|
|
|
else {
|
2016-09-26 20:56:42 +02:00
|
|
|
setImage_(ImageUtils.resizeAndCache(ImageUtils.ENTRY_SIZE, cacheName, imageStream));
|
2016-02-12 01:51:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Deprecated
|
|
|
|
public
|
2016-02-14 17:49:02 +01:00
|
|
|
void setImage(final InputStream imageStream) {
|
2016-02-12 01:51:15 +01:00
|
|
|
if (imageStream == null) {
|
|
|
|
setImage_(null);
|
|
|
|
}
|
|
|
|
else {
|
2016-09-26 20:56:42 +02:00
|
|
|
setImage_(ImageUtils.resizeAndCache(ImageUtils.ENTRY_SIZE, imageStream));
|
2016-02-12 01:51:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 16:13:57 +01:00
|
|
|
@Override
|
|
|
|
public
|
|
|
|
void setCallback(final SystemTrayMenuAction callback) {
|
|
|
|
this.callback = callback;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
void remove() {
|
|
|
|
SwingUtil.invokeAndWait(new Runnable() {
|
|
|
|
@Override
|
|
|
|
public
|
|
|
|
void run() {
|
|
|
|
menuItem.removeActionListener(swingCallback);
|
|
|
|
parent.remove(menuItem);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|