/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.osdependent;
import java.awt.*;
import java.lang.reflect.*;
import javax.swing.*;
import net.java.sip.communicator.impl.osdependent.TrayIcon.AWTTrayIconPeer;
import net.java.sip.communicator.impl.osdependent.TrayIcon.JdicTrayIconPeer;
import net.java.sip.communicator.impl.osdependent.TrayIcon.TrayIconPeer;
import net.java.sip.communicator.util.*;
/**
* @author Lubomir Marinov
*/
public class SystemTray
{
/**
* The Logger used by the SystemTray class and its
* instances for logging output.
*/
private static final Logger logger = Logger.getLogger(SystemTray.class);
private static SystemTray defaultSystemTray;
public static SystemTray getDefaultSystemTray()
throws UnsupportedOperationException,
HeadlessException,
SecurityException
{
if (defaultSystemTray != null)
return defaultSystemTray;
Class> awtSystemTrayClass = null;
try
{
awtSystemTrayClass = Class.forName("java.awt.SystemTray");
}
catch (ClassNotFoundException ex)
{
// We'll try org.jdesktop.jdic.tray then.
}
SystemTrayPeer peer = null;
if (awtSystemTrayClass != null)
try
{
peer = new AWTSystemTrayPeer(awtSystemTrayClass);
}
catch (Exception ex)
{
if(!GraphicsEnvironment.isHeadless())
logger.error("Failed to initialize java.awt.SystemTray",
ex);
// We'll try org.jdesktop.jdic.tray then.
}
if (peer == null)
try
{
peer = new JdicSystemTrayPeer();
}
catch (Exception ex)
{
logger.error(
"Failed to initialize the org.jdesktop.jdic.tray implementation.",
ex);
}
return (defaultSystemTray = new SystemTray(peer));
}
private final SystemTrayPeer peer;
private SystemTray(SystemTrayPeer peer)
{
this.peer = peer;
}
public void addTrayIcon(TrayIcon trayIcon)
throws NullPointerException,
IllegalArgumentException
{
if (peer != null)
peer.addTrayIcon(trayIcon.getPeer());
}
SystemTrayPeer getPeer()
{
return peer;
}
public boolean isSwing()
{
if (peer != null)
return getPeer().isSwing();
return false;
}
static interface SystemTrayPeer
{
void addTrayIcon(TrayIconPeer trayIconPeer)
throws NullPointerException,
IllegalArgumentException;
TrayIconPeer createTrayIcon(ImageIcon icon,
String tooltip,
Object popup)
throws IllegalArgumentException,
UnsupportedOperationException,
HeadlessException,
SecurityException;
boolean isSwing();
}
private static class AWTSystemTrayPeer
implements SystemTrayPeer
{
private final Method addTrayIcon;
private final Object impl;
private final Class> trayIconClass;
public AWTSystemTrayPeer(Class> clazz)
throws UnsupportedOperationException,
HeadlessException,
SecurityException
{
Method getDefaultSystemTray;
try
{
getDefaultSystemTray =
clazz.getMethod("getSystemTray", (Class>[]) null);
trayIconClass = Class.forName("java.awt.TrayIcon");
addTrayIcon = clazz.getMethod("add", new Class>[]
{ trayIconClass });
}
catch (ClassNotFoundException ex)
{
throw new UnsupportedOperationException(ex);
}
catch (NoSuchMethodException ex)
{
throw new UnsupportedOperationException(ex);
}
try
{
impl = getDefaultSystemTray.invoke(null, (Object[]) null);
}
catch (IllegalAccessException ex)
{
throw new UnsupportedOperationException(ex);
}
catch (InvocationTargetException ex)
{
throw new UnsupportedOperationException(ex);
}
}
public void addTrayIcon(TrayIconPeer trayIconPeer)
throws NullPointerException,
IllegalArgumentException
{
try
{
addTrayIcon.invoke(impl, new Object[]
{ ((AWTTrayIconPeer) trayIconPeer).getImpl() });
}
catch (IllegalAccessException ex)
{
throw new UndeclaredThrowableException(ex);
}
catch (InvocationTargetException ex)
{
Throwable cause = ex.getCause();
if (cause == null)
throw new UndeclaredThrowableException(ex);
if (cause instanceof NullPointerException)
throw (NullPointerException) cause;
if (cause instanceof IllegalArgumentException)
throw (IllegalArgumentException) cause;
throw new UndeclaredThrowableException(cause);
}
}
public TrayIconPeer createTrayIcon(ImageIcon icon, String tooltip,
Object popup)
throws IllegalArgumentException,
UnsupportedOperationException,
HeadlessException,
SecurityException
{
return new AWTTrayIconPeer(trayIconClass, (icon == null) ? null
: icon.getImage(), tooltip, popup);
}
public boolean isSwing()
{
return false;
}
}
private static class JdicSystemTrayPeer
implements SystemTrayPeer
{
private final org.jdesktop.jdic.tray.SystemTray impl;
public JdicSystemTrayPeer()
{
impl = org.jdesktop.jdic.tray.SystemTray.getDefaultSystemTray();
}
public void addTrayIcon(TrayIconPeer trayIconPeer)
{
impl.addTrayIcon(((JdicTrayIconPeer) trayIconPeer).getImpl());
}
public TrayIconPeer createTrayIcon(ImageIcon icon, String tooltip,
Object popup)
{
return new JdicTrayIconPeer(icon, tooltip, (JPopupMenu) popup);
}
public boolean isSwing()
{
return true;
}
}
}