using ModVersionChecker.data.model; using ModVersionChecker.managers.interfaces; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace ModVersionChecker.forms { public class SourcesConfigForm : Form { private List _sourceDefs; private ListView _listView; private Button _addButton, _editButton, _deleteButton, _closeButton; private TableLayoutPanel _mainLayout; private readonly ISourcesDefManager _sourcesManager; private readonly IFormFactory _formFactory; public event EventHandler? OnSourcesChanged; public List SourceDefs => _sourceDefs; public SourcesConfigForm(IFormFactory formFactory, ISourcesDefManager sourcesManager) { _sourcesManager = sourcesManager ?? throw new ArgumentNullException(nameof(sourcesManager)); _formFactory = formFactory ?? throw new ArgumentNullException(nameof(formFactory)); _sourceDefs = _sourcesManager.List() ?? new List(); Padding = new Padding(20); InitializeComponent(); } private void InitializeComponent() { Text = "Source Definitions"; Size = new Size(800, 400); StartPosition = FormStartPosition.CenterParent; _mainLayout = new TableLayoutPanel { Dock = DockStyle.Fill, RowCount = 2, ColumnCount = 1, Padding = new Padding(10) }; _mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 80)); _mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 20)); _listView = new ListView { Dock = DockStyle.Fill, View = View.Details, FullRowSelect = true, MultiSelect = false, GridLines = true }; _listView.Columns.Add("Id", 100); _listView.Columns.Add("Name", 150); _listView.Columns.Add("Type", 100); _listView.Columns.Add("Defaults", -2); UpdateListView(); _mainLayout.Controls.Add(_listView, 0, 0); var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.LeftToRight }; _addButton = new Button { Text = "Add" }; _editButton = new Button { Text = "Edit", Enabled = false }; _deleteButton = new Button { Text = "Delete", Enabled = false }; _closeButton = new Button { Text = "Close", DialogResult = DialogResult.OK }; _addButton.Click += (s, e) => AddSourceDef(); _editButton.Click += (s, e) => EditSourceDef(); _deleteButton.Click += (s, e) => DeleteSourceDef(); _closeButton.Click += (s, e) => Close(); _listView.SelectedIndexChanged += (s, e) => { bool hasSelection = _listView.SelectedItems.Count > 0; _editButton.Enabled = hasSelection; _deleteButton.Enabled = hasSelection; }; buttonPanel.Controls.AddRange(new Control[] { _addButton, _editButton, _deleteButton, _closeButton }); _mainLayout.Controls.Add(buttonPanel, 0, 1); Controls.Add(_mainLayout); } private void UpdateListView() { _listView.Items.Clear(); foreach (var src in _sourceDefs) { var item = new ListViewItem(src.Id); item.SubItems.Add(src.Name); item.SubItems.Add(src.Type); item.SubItems.Add(string.Join(", ", src.Defaults.Select(d => $"{d.Key}={d.Value}"))); item.Tag = src; _listView.Items.Add(item); } } private void AddSourceDef() { EventHandler? handler = (s, e) => MessageBox.Show("Source Changed"); var editor = _formFactory.CreateSourceDetailForm(null, handler); if (editor.ShowDialog() == DialogResult.OK) { _sourceDefs.Add(editor.SourceDef); UpdateListView(); } } private void EditSourceDef() { if (_listView.SelectedItems.Count == 0) return; var src = _listView.SelectedItems[0].Tag as SourceDef; EventHandler? handler = (s, e) => MessageBox.Show("Source Changed"); var editor = _formFactory.CreateSourceDetailForm(src, handler); if (editor.ShowDialog() == DialogResult.OK) { //int idx = _sourceDefs.IndexOf(src); //_sourceDefs[idx] = editor.SourceDef; //UpdateListView(); } } private void DeleteSourceDef() { if (_listView.SelectedItems.Count == 0) return; var src = _listView.SelectedItems[0].Tag as SourceDef; _sourceDefs.Remove(src); UpdateListView(); } } }