|
|
|
|
using System;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using NzbDrone.Common.EnvironmentInfo;
|
|
|
|
|
using NzbDrone.Host;
|
|
|
|
|
|
|
|
|
|
namespace NzbDrone.SysTray
|
|
|
|
|
{
|
|
|
|
|
public interface ISystemTrayApp
|
|
|
|
|
{
|
|
|
|
|
void Start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class SystemTrayApp : Form, ISystemTrayApp
|
|
|
|
|
{
|
|
|
|
|
private readonly IBrowserService _browserService;
|
|
|
|
|
|
|
|
|
|
private readonly NotifyIcon _trayIcon = new NotifyIcon();
|
|
|
|
|
private readonly ContextMenu _trayMenu = new ContextMenu();
|
|
|
|
|
|
|
|
|
|
public SystemTrayApp(IBrowserService browserService)
|
|
|
|
|
{
|
|
|
|
|
_browserService = browserService;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Start()
|
|
|
|
|
{
|
|
|
|
|
Application.ThreadException += OnThreadException;
|
|
|
|
|
Application.ApplicationExit += OnApplicationExit;
|
|
|
|
|
|
|
|
|
|
_trayMenu.MenuItems.Add("Launch Browser", LaunchBrowser);
|
|
|
|
|
_trayMenu.MenuItems.Add("-");
|
|
|
|
|
_trayMenu.MenuItems.Add("Exit", OnExit);
|
|
|
|
|
|
|
|
|
|
_trayIcon.Text = String.Format("NzbDrone - {0}", BuildInfo.Version);
|
|
|
|
|
_trayIcon.Icon = Properties.Resources.NzbDroneIcon;
|
|
|
|
|
|
|
|
|
|
_trayIcon.ContextMenu = _trayMenu;
|
|
|
|
|
_trayIcon.Visible = true;
|
|
|
|
|
_trayIcon.DoubleClick += LaunchBrowser;
|
|
|
|
|
|
|
|
|
|
Application.Run(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnClosing(CancelEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DisposeTrayIcon();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnClosed(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("Closing");
|
|
|
|
|
base.OnClosed(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnLoad(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Visible = false;
|
|
|
|
|
ShowInTaskbar = false;
|
|
|
|
|
|
|
|
|
|
base.OnLoad(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void Dispose(bool isDisposing)
|
|
|
|
|
{
|
|
|
|
|
if (isDisposing)
|
|
|
|
|
{
|
|
|
|
|
_trayIcon.Dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (InvokeRequired)
|
|
|
|
|
{
|
|
|
|
|
base.Invoke(new MethodInvoker(() => Dispose(isDisposing)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
base.Dispose(isDisposing);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnExit(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Application.Exit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void LaunchBrowser(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_browserService.LaunchWebUI();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnApplicationExit(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DisposeTrayIcon();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnThreadException(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DisposeTrayIcon();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void DisposeTrayIcon()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_trayIcon.Visible = false;
|
|
|
|
|
_trayIcon.Icon = null;
|
|
|
|
|
_trayIcon.Visible = false;
|
|
|
|
|
_trayIcon.Dispose();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|