diff --git a/src/SpamGuard/Tray/ActivityLogForm.cs b/src/SpamGuard/Tray/ActivityLogForm.cs new file mode 100644 index 0000000..2ae2536 --- /dev/null +++ b/src/SpamGuard/Tray/ActivityLogForm.cs @@ -0,0 +1,95 @@ +namespace SpamGuard.Tray; + +using SpamGuard.Models; +using SpamGuard.Services; + +public sealed class ActivityLogForm : Form +{ + private readonly ActivityLog _activityLog; + private readonly DataGridView _grid; + + public ActivityLogForm(ActivityLog activityLog) + { + _activityLog = activityLog; + + Text = "SpamGuard - Activity Log"; + Size = new System.Drawing.Size(800, 500); + StartPosition = FormStartPosition.CenterScreen; + Icon = IconGenerator.Green; + + _grid = new DataGridView + { + Dock = DockStyle.Fill, + ReadOnly = true, + AllowUserToAddRows = false, + AllowUserToDeleteRows = false, + AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, + SelectionMode = DataGridViewSelectionMode.FullRowSelect, + BackgroundColor = System.Drawing.SystemColors.Window, + BorderStyle = BorderStyle.None + }; + + _grid.Columns.Add("Time", "Time"); + _grid.Columns.Add("From", "From"); + _grid.Columns.Add("Subject", "Subject"); + _grid.Columns.Add("Verdict", "Verdict"); + _grid.Columns.Add("Confidence", "Confidence"); + _grid.Columns.Add("Reason", "Reason"); + + _grid.Columns["Time"]!.Width = 70; + _grid.Columns["From"]!.Width = 150; + _grid.Columns["Verdict"]!.Width = 80; + _grid.Columns["Confidence"]!.Width = 80; + + Controls.Add(_grid); + + RefreshData(); + } + + public void RefreshData() + { + if (InvokeRequired) + { + Invoke(RefreshData); + return; + } + + var entries = _activityLog.GetRecent(200); + _grid.Rows.Clear(); + + foreach (var entry in entries) + { + var rowIndex = _grid.Rows.Add( + entry.Timestamp.ToLocalTime().ToString("HH:mm:ss"), + entry.Sender, + entry.Subject, + entry.Verdict.ToString(), + entry.Confidence?.ToString("P0") ?? "--", + entry.Reason ?? "" + ); + + var row = _grid.Rows[rowIndex]; + row.DefaultCellStyle.ForeColor = entry.Verdict switch + { + Verdict.Spam => System.Drawing.Color.Red, + Verdict.Trusted => System.Drawing.Color.Green, + Verdict.Uncertain => System.Drawing.Color.Orange, + Verdict.Error => System.Drawing.Color.Gray, + _ => System.Drawing.SystemColors.ControlText + }; + } + } + + protected override void OnFormClosing(FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing) + { + e.Cancel = true; + Hide(); + } + else + { + base.OnFormClosing(e); + } + } +}