using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using InABox.Core; namespace InABox.DynamicGrid { public class LookupEditorControl : DynamicEditorControl, ILookupEditorControl { static LookupEditorControl() { //DynamicEditorControlFactory.Register(); //DynamicEditorControlFactory.Register(); //DynamicEditorControlFactory.Register(); } private ComboBox Editor; private CoreTable LookupTable; public LookupEditorControl() { OtherColumns = new Dictionary(); Lookups = new Dictionary(); Width = int.MaxValue; } public int Width { get; set; } public Dictionary Lookups { get; set; } public Dictionary OtherColumns { get; } public override void Configure() { if (Loaded) return; if ((EditorDefinition is ILookupEditor dle) && (dle.LookupWidth != int.MaxValue)) Width = dle.LookupWidth; Host.LoadColumns(ColumnName, OtherColumns); if (EditorDefinition is DataLookupEditor dataLookup) { Host.LoadColumns(ColumnName, dataLookup.OtherColumns); } Editor.HorizontalAlignment = Width.Equals(int.MaxValue) ? HorizontalAlignment.Stretch : HorizontalAlignment.Left; if (!Width.Equals(int.MaxValue)) Editor.Width = Width; Editor.IsEnabled = false; Host.LoadLookups(this); } public void LoadLookups(CoreTable values) { var keycol = ColumnName.Split('.').Last(); var prefix = string.Join(".", ColumnName.Split('.').Reverse().Skip(1).Reverse()); foreach (var col in values.Columns) if (!string.Equals(col.ColumnName, keycol) && !string.Equals(col.ColumnName, "Display")) if (!OtherColumns.ContainsKey(col.ColumnName)) OtherColumns[col.ColumnName] = string.IsNullOrWhiteSpace(prefix) ? col.ColumnName : string.Join(".", prefix, col.ColumnName); var value = RetrieveValue(); //Lookups = lookups; LookupTable = values; Editor.Items.Clear(); Lookups.Clear(); if (!IsEnumEditor()) Editor.Items.Add(""); foreach (var row in values.Rows) { var display = row["Display"]; Editor.Items.Add(display); var val = row[keycol]; if (val is not null) { Lookups[val] = display?.ToString() ?? ""; } } var sel = value != null ? values.Rows.FirstOrDefault(r => r[keycol].Equals(value)) : null; if (IsEnumEditor()) Editor.SelectedIndex = sel != null ? sel.Index : 0; else Editor.SelectedIndex = sel != null ? sel.Index + 1 : 0; //foreach (var key in lookups.Keys) // Editor.Items.Add(lookups[key]); //if ((value != null) && Lookups.ContainsKey(value)) // Editor.SelectedIndex = Lookups.Keys.ToList().IndexOf(value); Editor.IsEnabled = EditorDefinition.Editable == Editable.Enabled; } public override int DesiredHeight() { return 25; } public override void SetFocus() { Editor.Focus(); } private bool IsEnumEditor() { return EditorDefinition is EnumLookupEditor; } public List