package server;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Graphics2D;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URI;
public class ServerTrayIcon {
private SystemTray tray;
private TrayIcon icon;
public ServerTrayIcon(MetaNetServer server) throws NotSupportedException {
if ( SystemTray.isSupported() ) {
BufferedImage img = new BufferedImage( 16, 16, BufferedImage.TYPE_3BYTE_BGR );
Graphics2D g = img.createGraphics();
g.setPaint ( Color.GRAY );
g.fillRect ( 0, 0, 15, 15 );
g.setPaint ( Color.BLACK );
g.fillRect ( 1, 1, 13, 13 );
g.setPaint ( Color.CYAN );
g.fillRect ( 2, 2, 12, 12 );
PopupMenu menu = new PopupMenu();
Desktop dt = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
if ( dt != null && dt.isSupported( Desktop.Action.BROWSE )) {
MenuItem brws = new MenuItem( "Open in browser" );
brws.addActionListener( new LsnBrowse( server ));
menu.add( brws );
}
MenuItem stop = new MenuItem( "Stop server" );
stop.addActionListener( new LsnStop( server ));
menu.add( stop );
TrayIcon icon = new TrayIcon( img );
icon.setPopupMenu( menu );
icon.setToolTip( "MetaNet" );
//icon.addMouseListener( new LsnMouse( server ));
tray = SystemTray.getSystemTray();
try { tray.add( icon ); }
catch ( AWTException e ) { throw new NotSupportedException(); }
} else throw new NotSupportedException();
}
public void remove() { tray.remove(icon); }
static class LsnBrowse implements ActionListener {
URI uri;
public LsnBrowse( MetaNetServer server ) {
this.uri = URI.create( "http://127.0.0.1:"+ server.cnfg.port );
}
@Override
public void actionPerformed( ActionEvent evt ) {
try { Desktop.getDesktop().browse( uri ); }
catch ( IOException e ) { e.printStackTrace(); }
}
}
static class LsnStop implements ActionListener {
MetaNetServer server;
public LsnStop( MetaNetServer server ) { this.server = server; }
@Override
public void actionPerformed( ActionEvent evt ) {
try { server.stop(); }
catch ( Exception e ) { e.printStackTrace(); }
}
}
@SuppressWarnings("serial")
private class NotSupportedException extends Exception{}
}