using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using HeuristicLab.Persistence.Default.Xml; using HeuristicLab.Persistence.Interfaces; using System.Text; namespace HeuristicLab.Persistence.GUI { public partial class PersistenceConfigurationForm : Form { public PersistenceConfigurationForm() { InitializeComponent(); decomposerList.Items.Clear(); foreach ( IDecomposer decomposer in ConfigurationService.Instance.AllDecomposers ) { var item = decomposerList.Items.Add(decomposer.GetType().Name); item.Checked = true; item.Tag = decomposer; } foreach ( var formats in ConfigurationService.Instance.AllFormatters ) { TabPage page = new TabPage(formats.Key.Name); formatterTabs.TabPages.Add(page); DataGridView gridView = new DataGridView { Dock = DockStyle.Fill, EditMode = DataGridViewEditMode.EditOnEnter, AllowUserToAddRows = false, AllowUserToDeleteRows = false, AllowUserToResizeRows = false, }; //gridView.CellValueChanged += gridView_CellValueChanged; //gridView.DataError += gridView_DataError; //gridView.CellFormatting += gridView_CellFormatting; page.Controls.Add(gridView); gridView.Columns.Add(new DataGridViewTextBoxColumn { Name = "Type", ReadOnly = true, AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill }); gridView.Columns.Add(new DataGridViewCheckBoxColumn { AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells }); gridView.Columns.Add(new DataGridViewComboBoxColumn { AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill }); var formatterMap = new Dictionary>(); foreach (var formatter in formats.Value) { if (!formatterMap.ContainsKey(formatter.Type)) formatterMap.Add(formatter.Type, new List()); formatterMap[formatter.Type].Add(formatter); } foreach ( var formatterMapping in formatterMap ) { var row = gridView.Rows[gridView.Rows.Add()]; row.Cells[0].Value = formatterMapping.Key.SimpleFullName(); row.Cells[0].ToolTipText = formatterMapping.Key.AssemblyQualifiedName; row.Cells[1].Value = true; var comboBoxCell = (DataGridViewComboBoxCell) row.Cells[2]; //comboBoxCell.ValueType = typeof(IFormatter); foreach ( var formatter in formatterMapping.Value ) { comboBoxCell.Items.Add(formatter.GetType().Name); } comboBoxCell.Value = comboBoxCell.Items[0]; comboBoxCell.ToolTipText = comboBoxCell.Items[0].ToString(); if (comboBoxCell.Items.Count == 1) { comboBoxCell.ReadOnly = true; comboBoxCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; } } } } void gridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { e.Value = e.Value.ToString(); e.FormattingApplied = true; } private void decomposerList_ItemDrag(object sender, ItemDragEventArgs e) { decomposerList.DoDragDrop(decomposerList.SelectedItems, DragDropEffects.Move); } private void decomposerList_DragEnter(object sender, DragEventArgs e) { if ( e.Data.GetDataPresent(typeof(ListView.SelectedListViewItemCollection).FullName)) { e.Effect = DragDropEffects.Move; } } private void decomposerList_DragDrop(object sender, DragEventArgs e) { if (decomposerList.SelectedItems.Count == 0) { return; } Point cp = decomposerList.PointToClient(new Point(e.X, e.Y)); ListViewItem targetItem = decomposerList.GetItemAt(cp.X, cp.Y); if (targetItem == null) return; int targetIndex = targetItem.Index; var selectedItems = new List(decomposerList.SelectedItems.Cast()); int i = 0; foreach ( ListViewItem dragItem in selectedItems ) { if (targetIndex == dragItem.Index) return; if (dragItem.Index < targetIndex) { decomposerList.Items.Insert(targetIndex + 1, (ListViewItem) dragItem.Clone()); } else { decomposerList.Items.Insert(targetIndex + i, (ListViewItem)dragItem.Clone()); } decomposerList.Items.Remove(dragItem); i++; } Update(); } private void decomposerList_Resize(object sender, EventArgs e) { DecomposersColumn.Width = decomposerList.Width - 4; } private IEnumerable GetDecomposers() { List decomposers = new List(); foreach ( ListViewItem item in decomposerList.Items ) { if (item != null && item.Checked) decomposers.Add((IDecomposer) item.Tag); } return decomposers; } private void Update() { checkbox.Items.Clear(); foreach (var decomposer in GetDecomposers()) checkbox.Items.Add(decomposer.GetType().Name); } private void decomposerList_ItemChecked(object sender, ItemCheckedEventArgs e) { Update(); } } public class FakeBoolean2XmlFormatter : IFormatter { public Type Type { get { return typeof (Boolean); } } public IFormat Format { get { return XmlFormat.Instance; } } public object DoFormat(object o) { return null; } public object Parse(object o) { return null; } } public class FormatterWrapper { public IFormatter Formatter; public FormatterWrapper(IFormatter f) { Formatter = f; } public override string ToString() { return Formatter.GetType().Name; } } public static class TypeFormatter { public static string SimpleFullName(this Type type) { StringBuilder sb = new StringBuilder(); SimpleFullName(type, sb); return sb.ToString(); } private static void SimpleFullName(Type type, StringBuilder sb) { if (type.IsGenericType) { sb.Append(type.Name, 0, type.Name.LastIndexOf('`')); sb.Append("<"); foreach (Type t in type.GetGenericArguments()) { SimpleFullName(t, sb); sb.Append(", "); } sb.Remove(sb.Length - 2, 2); sb.Append(">"); } else { sb.Append(type.Name); } } } }