using System.Windows.Forms; namespace HeuristicLab.BenchmarkSuite.Views { using System.Collections.Generic; using HeuristicLab.Core.Views; using HeuristicLab.MainForm; [View("Push Expression Selection Editor")] [Content(typeof(ProblemData), true)] public partial class DataEditorView : NamedItemView { private const string ValueSeparator = ", "; public DataEditorView() { InitializeComponent(); dataGridView.CellEndEdit += DataGridViewCellEndEdit; } private void DataGridViewCellEndEdit(object sender, DataGridViewCellEventArgs e) { if (Content == null) return; var row = dataGridView.Rows[e.RowIndex]; var inputArgs = new string[Content.InputArgumentTypes.Length]; for (var i = 0; i < Content.InputArgumentTypes.Length; i++) { inputArgs[i] = row.Cells[i].Value.ToString(); } var outputArgs = new string[Content.OutputArgumentTypes.Length]; for (var i = 0; i < Content.OutputArgumentTypes.Length; i++) { outputArgs[i] = row.Cells[Content.InputArgumentTypes.Length + i].Value.ToString(); } var example = Content.Examples[e.RowIndex]; try { Content.Examples[e.RowIndex] = ParseExample(inputArgs, Content.InputArgumentTypes, outputArgs, Content.OutputArgumentTypes); } catch { MessageBox.Show("Unable to parse example!"); // reset entry row.Cells[e.ColumnIndex].Value = e.ColumnIndex < Content.InputArgumentTypes.Length ? example.InputArgs[e.ColumnIndex] : example.OutputArgs[e.ColumnIndex - Content.InputArgumentTypes.Length]; } } private Example ParseExample(string[] inputArgs, ExampleArgumentType[] inputArgTypes, string[] outputArgs, ExampleArgumentType[] outputArgTypes) { var example = new Example(); var booleanValues = new List(); var integerValues = new List(); var floatValues = new List(); var charValues = new List(); var stringValues = new List(); example.InputArgs = inputArgs; for (var i = 0; i < inputArgs.Length; i++) { var arg = inputArgs[i]; var type = inputArgTypes[i]; switch (type) { case ExampleArgumentType.Boolean: booleanValues.Add(ExampleArgumentConverter.ConvertBoolean(arg)); break; case ExampleArgumentType.Integer: integerValues.Add(ExampleArgumentConverter.ConvertInteger(arg)); break; case ExampleArgumentType.Float: floatValues.Add(ExampleArgumentConverter.ConvertDouble(arg)); break; case ExampleArgumentType.Char: charValues.Add(arg.Length == 1 ? arg[0] : default(char)); break; case ExampleArgumentType.String: stringValues.Add(arg); break; } } example.InputBoolean = booleanValues.ToArray(); example.InputInteger = integerValues.ToArray(); example.InputFloat = floatValues.ToArray(); example.InputChar = charValues.ToArray(); example.InputString = stringValues.ToArray(); booleanValues.Clear(); integerValues.Clear(); floatValues.Clear(); charValues.Clear(); stringValues.Clear(); example.OutputArgs = outputArgs; for (var i = 0; i < outputArgs.Length; i++) { var arg = outputArgs[i]; var type = outputArgTypes[i]; switch (type) { case ExampleArgumentType.Boolean: booleanValues.Add(ExampleArgumentConverter.ConvertBoolean(arg)); break; case ExampleArgumentType.Integer: integerValues.Add(ExampleArgumentConverter.ConvertInteger(arg)); break; case ExampleArgumentType.Float: floatValues.Add(ExampleArgumentConverter.ConvertDouble(arg)); break; case ExampleArgumentType.Char: charValues.Add(arg.Length == 1 ? arg[0] : default(char)); break; case ExampleArgumentType.String: stringValues.Add(arg); break; } } example.OutputBoolean = booleanValues.ToArray(); example.OutputInteger = integerValues.ToArray(); example.OutputFloat = floatValues.ToArray(); example.OutputChar = charValues.ToArray(); example.OutputString = stringValues.ToArray(); return example; } public new ProblemData Content { get { return (ProblemData)base.Content; } set { base.Content = value; } } protected override void OnReadOnlyChanged() { base.OnReadOnlyChanged(); dataGridView.Enabled = !ReadOnly; } protected override void OnContentChanged() { dataGridView.Columns.Clear(); dataGridView.Rows.Clear(); if (Content == null) { return; } nameTextBox.Text = Content.Name; var cellTemplate = new DataGridViewTextBoxCell { Style = { WrapMode = DataGridViewTriState.True } }; for (var i = 0; i < Content.InputArgumentTypes.Length; i++) { var headerTypeName = ViewHelper.GetHeaderTypeName(Content.InputArgumentTypes[i]); var column = new DataGridViewColumn { HeaderText = string.Format("Input {0} : {1}", i + 1, headerTypeName), AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, CellTemplate = cellTemplate }; dataGridView.Columns.Add(column); } for (var i = 0; i < Content.OutputArgumentTypes.Length; i++) { var headerTypeName = ViewHelper.GetHeaderTypeName(Content.OutputArgumentTypes[i]); var column = new DataGridViewColumn { HeaderText = string.Format("Output {0} : {1}", i + 1, headerTypeName), AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, CellTemplate = cellTemplate }; dataGridView.Columns.Add(column); } for (var rowIdx = 0; rowIdx < Content.Examples.Length; rowIdx++) { var example = Content.Examples[rowIdx]; var row = new DataGridViewRow { HeaderCell = { Value = (rowIdx + 1).ToString(), } }; row.CreateCells(dataGridView); var inputArgumentCountDict = ViewHelper.CreateArgumentCountDict(); for (var i = 0; i < Content.InputArgumentTypes.Length; i++) { var type = Content.InputArgumentTypes[i]; var offset = inputArgumentCountDict[type]; row.Cells[i].Value = ViewHelper.StringifyInput(type, offset, "R", example, ValueSeparator); inputArgumentCountDict[type]++; } var outputArgumentCountDict = ViewHelper.CreateArgumentCountDict(); for (var i = 0; i < Content.OutputArgumentTypes.Length; i++) { var type = Content.OutputArgumentTypes[i]; var offset = outputArgumentCountDict[type]; row.Cells[Content.InputArgumentTypes.Length + i].Value = ViewHelper.StringifyOutput(type, offset, "R", example, ValueSeparator); outputArgumentCountDict[type]++; } dataGridView.Rows.Add(row); } } } }