using System.Diagnostics; using PrintServiceTray.Services; using PrintServiceTray.Models; namespace PrintServiceTray; public class TrayApplicationContext : ApplicationContext { private readonly NotifyIcon _trayIcon; private readonly ServiceClient _serviceClient; private readonly System.Windows.Forms.Timer _refreshTimer; private readonly ToolStripMenuItem _queueStatusItem; private readonly ToolStripMenuItem _serviceStatusItem; public TrayApplicationContext() { try { _serviceClient = new ServiceClient(); // Create context menu var contextMenu = new ContextMenuStrip(); // Service status (at top) _serviceStatusItem = new ToolStripMenuItem("● Service Running") { Enabled = false, Font = new Font(contextMenu.Font, FontStyle.Bold) }; contextMenu.Items.Add(_serviceStatusItem); contextMenu.Items.Add(new ToolStripSeparator()); // Queue status section _queueStatusItem = new ToolStripMenuItem("Queue Status") { Enabled = false }; contextMenu.Items.Add(_queueStatusItem); var viewQueueItem = new ToolStripMenuItem("View Full Queue..."); viewQueueItem.Click += ViewQueue_Click; contextMenu.Items.Add(viewQueueItem); contextMenu.Items.Add(new ToolStripSeparator()); // Configuration var configureItem = new ToolStripMenuItem("Configure Printers..."); configureItem.Click += Configure_Click; contextMenu.Items.Add(configureItem); contextMenu.Items.Add(new ToolStripSeparator()); // Exit var exitItem = new ToolStripMenuItem("Exit"); exitItem.Click += Exit_Click; contextMenu.Items.Add(exitItem); // Create tray icon _trayIcon = new NotifyIcon { Icon = SystemIcons.Information, ContextMenuStrip = contextMenu, Visible = true, Text = "LAAPC Print Service" }; _trayIcon.DoubleClick += TrayIcon_DoubleClick; // Show startup notification _trayIcon.ShowBalloonTip(2000, "LAAPC Print Service", "Tray app started", ToolTipIcon.Info); // Set up refresh timer (every 2 seconds) _refreshTimer = new System.Windows.Forms.Timer { Interval = 2000 }; _refreshTimer.Tick += RefreshTimer_Tick; _refreshTimer.Start(); // Initial refresh _ = RefreshStatusAsync(); } catch (Exception ex) { MessageBox.Show($"Failed to initialize tray app: {ex.Message}\n\n{ex.StackTrace}", "Initialization Error", MessageBoxButtons.OK, MessageBoxIcon.Error); throw; } } private async void RefreshTimer_Tick(object? sender, EventArgs e) { await RefreshStatusAsync(); } private async Task RefreshStatusAsync() { try { var status = await _serviceClient.GetQueueStatusAsync(); if (status.Success) { _serviceStatusItem.Text = "● Service Running"; _serviceStatusItem.ForeColor = Color.Green; // Update queue status if (status.Jobs.Count == 0) { _queueStatusItem.Text = "Queue Status: Empty"; _queueStatusItem.DropDownItems.Clear(); } else { _queueStatusItem.Text = $"Queue Status ({status.Jobs.Count} {(status.Jobs.Count == 1 ? "job" : "jobs")})"; _queueStatusItem.Enabled = true; // Update dropdown items with job list _queueStatusItem.DropDownItems.Clear(); foreach (var job in status.Jobs.Take(10)) // Show max 10 in menu { var statusIcon = job.Status == "Processing" ? "●" : "○"; var jobText = $"{statusIcon} {job.Status}: {job.FileName}"; if (job.PrinterName != null) { jobText += $" ({job.PrinterName})"; } if (job.CurrentPage.HasValue && job.TotalPages.HasValue) { jobText += $" - Page {job.CurrentPage}/{job.TotalPages}"; } var jobItem = new ToolStripMenuItem(jobText) { Enabled = false }; _queueStatusItem.DropDownItems.Add(jobItem); } if (status.Jobs.Count > 10) { _queueStatusItem.DropDownItems.Add(new ToolStripSeparator()); var moreItem = new ToolStripMenuItem($"... and {status.Jobs.Count - 10} more") { Enabled = false }; _queueStatusItem.DropDownItems.Add(moreItem); } } // Update tooltip _trayIcon.Text = status.Jobs.Count == 0 ? "LAAPC Print Service - Queue empty" : $"LAAPC Print Service - {status.Jobs.Count} job(s) in queue"; } else { _serviceStatusItem.Text = "○ Service Not Running"; _serviceStatusItem.ForeColor = Color.Red; _queueStatusItem.Text = "Queue Status: Unavailable"; _queueStatusItem.DropDownItems.Clear(); _trayIcon.Text = "LAAPC Print Service - Not running"; } } catch (Exception ex) { Debug.WriteLine($"Error refreshing status: {ex.Message}"); } } private void TrayIcon_DoubleClick(object? sender, EventArgs e) { // Double-click opens full queue view ViewQueue_Click(sender, e); } private void ViewQueue_Click(object? sender, EventArgs e) { // TODO: Open queue view window MessageBox.Show("Queue view window coming soon!", "LAAPC Print Service", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void Configure_Click(object? sender, EventArgs e) { var configForm = new Forms.ConfigurationForm(); configForm.ShowDialog(); } private void Exit_Click(object? sender, EventArgs e) { _refreshTimer.Stop(); _trayIcon.Visible = false; Application.Exit(); } protected override void Dispose(bool disposing) { if (disposing) { _refreshTimer?.Stop(); _refreshTimer?.Dispose(); _trayIcon?.Dispose(); } base.Dispose(disposing); } }