using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace HeuristicLab.OKB.ParameterTable { public partial class ParameterTable : UserControl { public ParameterTable() { InitializeComponent(); } public void Initialize(IEnumerable parameters) { SuspendLayout(); panel.Controls.Clear(); panel.RowStyles.Clear(); toolTip.RemoveAll(); panel.RowCount = 0; foreach (var p in parameters) { try { Label l = new Label() { Text = p.Name, Dock = DockStyle.Fill, TextAlign = ContentAlignment.MiddleLeft, }; Control c = CreateParameterControl(p); toolTip.SetToolTip(l, p.Description); toolTip.SetToolTip(c, p.TypeName); panel.Controls.Add(l); panel.Controls.Add(c); panel.SetCellPosition(l, new TableLayoutPanelCellPosition(0, panel.RowCount)); panel.SetCellPosition(c, new TableLayoutPanelCellPosition(1, panel.RowCount)); panel.RowCount++; } catch (Exception x) { MessageBox.Show(string.Format("could not display parameter {0}:\n{1}", p.Name, x.ToString()), "Error while creating parameter editor", MessageBoxButtons.OK, MessageBoxIcon.Error); } } Label filler = new Label() { Dock = DockStyle.Fill }; panel.Controls.Add(filler); panel.SetCellPosition(filler, new TableLayoutPanelCellPosition(0, panel.RowCount)); panel.RowStyles.Add(new RowStyle(SizeType.AutoSize)); ResumeLayout(); } private Control CreateParameterControl(IParameterAccessor parameter) { if (parameter is IPrimitiveParameter) { TextBox box = new TextBox() { Dock = DockStyle.Fill, Text = parameter.Value, }; box.TextChanged += (s, a) => { UpdateParameter((IPrimitiveParameter)parameter, box); }; return box; } else if (parameter is IOperatorParameter) { IOperatorParameter op = (IOperatorParameter)parameter; OperatorParameterSetterControl control = new OperatorParameterSetterControl() { Dock = DockStyle.Fill, Label = op.Value, }; control.SetClicked += (s, a) => { op.Set(); control.Label = op.Value; }; control.ShowClicked += (s, a) => { op.Show(); }; return control; } else throw new ArgumentException("unsupported parameter type"); } private void UpdateParameter(IPrimitiveParameter parameter, TextBox box) { string value = box.Text; if (parameter.IsValid(value)) { parameter.Value = value; box.BackColor = Color.White; } else { box.BackColor = Color.LightPink; } } } }