package thaw.gui; import javax.swing.ImageIcon; import java.awt.Image; import java.awt.event.MouseListener; import java.awt.PopupMenu; import thaw.core.Logger; /** * Systray icon that must compile with java 1.4 AND 1.6 * Limitations: * <ul> * <li>Will only work with java 1.6 (will do nothing else)</li> * <li>Only one icon</li> * </ul> * <br/> */ public class SysTrayIcon { public final static int MSG_ERROR = 0; public final static int MSG_WARNING = 1; public final static int MSG_NONE = 2; public final static int MSG_INFO = 3; private Object systemTray; private Object trayIcon; public SysTrayIcon(ImageIcon icon) { try { systemTray = Class.forName("java.awt.SystemTray").getMethod("getSystemTray", (Class[])null).invoke(null, (Object[])null); trayIcon = Class.forName("java.awt.TrayIcon").getConstructor(new Class[] { Image.class }).newInstance(new Object[] { icon.getImage() }); Class.forName("java.awt.TrayIcon").getMethod("setImageAutoSize", new Class[] { Boolean.TYPE }).invoke(trayIcon, new Object[] { new Boolean(true) }); } catch(Exception e) { Logger.notice(this, "Can't use Tray icon because: "+e.toString()); if (e.getCause() != null) Logger.notice(this, "Cause: "+e.getCause().toString()); Logger.notice(this, "Probably due to a JVM without the support for the tray icons"); systemTray = null; trayIcon = null; } } public boolean canWork() { return (systemTray != null); } public void setVisible(boolean v) { if (!canWork()) return; String method = (v ? "add" : "remove"); try { Class.forName("java.awt.SystemTray").getMethod(method, new Class[] { Class.forName("java.awt.TrayIcon") }).invoke(systemTray, new Object[] { trayIcon }); } catch(Exception e) { Logger.warning(this, "Error while changing visibility of the icon : "+e.toString()); } } public void addMouseListener(MouseListener ml) { if (!canWork()) return; try { Class.forName("java.awt.TrayIcon").getMethod("addMouseListener", new Class[] { MouseListener.class }).invoke(trayIcon, new Object[] { ml }); } catch(Exception e) { Logger.warning(this, "Error while adding mouse listener : "+e.toString()); } } public void removeMouseListener(MouseListener ml) { if (!canWork()) return; try { Class.forName("java.awt.TrayIcon").getMethod("removeMouseListener", new Class[] { MouseListener.class }).invoke(trayIcon, new Object[] { ml }); } catch(Exception e) { Logger.warning(this, "Error while removing mouse listener : "+e.toString()); } } public void setToolTip(String tt) { if (!canWork()) return; try { Class.forName("java.awt.TrayIcon").getMethod("setToolTip", new Class[] { String.class }).invoke(trayIcon, new Object[] { tt }); } catch(Exception e) { Logger.warning(this, "Error while setting tooltip : "+e.toString()); } } public void popMessage(String title, String msg, int msgTypeInt) { if (!canWork()) return; try { Object type; String typeName; switch(msgTypeInt) { case(MSG_ERROR): typeName = "ERROR"; break; case(MSG_INFO): typeName = "INFO"; break; case(MSG_NONE): typeName = "NONE"; break; case(MSG_WARNING): typeName = "WARNING"; break; default: Logger.warning(this, "Unknown message type: "+Integer.toString(msgTypeInt)); return; } Class messageTypeClass = Class.forName("java.awt.TrayIcon").getClasses()[0]; type = messageTypeClass.getMethod("valueOf", new Class[] { String.class }).invoke(null, new Object[] { typeName }); Class.forName("java.awt.TrayIcon").getMethod("displayMessage", new Class[] { String.class, String.class, type.getClass() }).invoke(trayIcon, new Object[] { title, msg, type }); } catch(Exception e) { Logger.warning(this, "Error while poping up a message: "+e.toString()); } } public void setPopupMenu(PopupMenu m) { if (!canWork()) return; try { Class.forName("java.awt.TrayIcon").getMethod("setPopupMenu", new Class[] { PopupMenu.class }).invoke(trayIcon, new Object[] { m }); } catch(Exception e) { Logger.warning(this, "Error while setting popup menu : "+e.toString()); } } /** * Return the mouse position on the screen * put here just to keep all the code >= java 1.5 in the same class */ public java.awt.Point getMousePosition() { try { Object pointerInfo = Class.forName("java.awt.MouseInfo").getMethod("getPointerInfo", (Class[])null).invoke(null, (Object[]) null); java.awt.Point location = (java.awt.Point)Class.forName("java.awt.PointerInfo").getMethod("getLocation", (Class[])null).invoke(pointerInfo, (Object[])null); return location; } catch(Exception e) { Logger.warning(this, "Error while setting popup menu : "+e.toString()); return null; } } }