using System.Drawing; using System.Windows.Forms; using Remiss.Core.Models; namespace Remiss.App; /// /// Steg [1]: sökbar lista över mottagningar. Byggd helt i kod – ingen designer. /// Avbryt (Esc / stäng / knapp) ger och /// = null, vilket anroparen tolkar som "städa och avsluta". /// public sealed class MottagningDialog : Form { private readonly IReadOnlyList _all; private readonly TextBox _search = new(); private readonly ListBox _list = new(); private readonly Button _ok = new(); private readonly Button _cancel = new(); public Mottagning? SelectedMottagning { get; private set; } public MottagningDialog(IReadOnlyList mottagningar) { _all = mottagningar; Text = "Välj mottagning"; StartPosition = FormStartPosition.CenterScreen; FormBorderStyle = FormBorderStyle.Sizable; MinimizeBox = false; MaximizeBox = false; ShowInTaskbar = true; MinimumSize = new Size(420, 360); ClientSize = new Size(460, 520); var layout = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 3, Padding = new Padding(12), }; layout.RowStyles.Add(new RowStyle(SizeType.Absolute, 30)); layout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); layout.RowStyles.Add(new RowStyle(SizeType.Absolute, 48)); _search.Dock = DockStyle.Fill; _search.PlaceholderText = "Sök mottagning eller HSA-id…"; _search.TextChanged += (_, _) => ApplyFilter(); _search.KeyDown += SearchKeyDown; _list.Dock = DockStyle.Fill; _list.IntegralHeight = false; _list.DoubleClick += (_, _) => TryAccept(); _list.SelectedIndexChanged += (_, _) => _ok.Enabled = _list.SelectedItem is Mottagning; _ok.Text = "OK"; _ok.Enabled = false; _ok.AutoSize = true; _ok.Padding = new Padding(12, 4, 12, 4); _ok.Click += (_, _) => TryAccept(); _cancel.Text = "Avbryt"; _cancel.AutoSize = true; _cancel.Padding = new Padding(12, 4, 12, 4); _cancel.DialogResult = DialogResult.Cancel; var buttons = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.RightToLeft, }; buttons.Controls.Add(_cancel); buttons.Controls.Add(_ok); layout.Controls.Add(_search, 0, 0); layout.Controls.Add(_list, 0, 1); layout.Controls.Add(buttons, 0, 2); Controls.Add(layout); AcceptButton = _ok; CancelButton = _cancel; ApplyFilter(); } private void ApplyFilter() { var query = _search.Text.Trim(); IEnumerable matches = string.IsNullOrEmpty(query) ? _all : _all.Where(m => m.Namn.Contains(query, StringComparison.CurrentCultureIgnoreCase) || m.HsaId.Contains(query, StringComparison.OrdinalIgnoreCase)); _list.BeginUpdate(); _list.Items.Clear(); foreach (var m in matches) _list.Items.Add(m); _list.EndUpdate(); if (_list.Items.Count > 0) _list.SelectedIndex = 0; _ok.Enabled = _list.SelectedItem is Mottagning; } private void SearchKeyDown(object? sender, KeyEventArgs e) { if (e.KeyCode == Keys.Down && _list.Items.Count > 0) { _list.Focus(); e.Handled = true; } } private void TryAccept() { if (_list.SelectedItem is not Mottagning m) return; SelectedMottagning = m; DialogResult = DialogResult.OK; Close(); } }