| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | 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<object>, ILookupEditorControl    {        private ComboBox Editor;        private CoreTable LookupTable;        public LookupEditorControl()        {            OtherColumns = new Dictionary<string, string>();            Lookups = new Dictionary<object, string>();            Width = int.MaxValue;        }        public int Width { get; set; }        public Dictionary<object, string> Lookups { get; set; }        public Dictionary<string, string> OtherColumns { get; }        public override void Configure()        {            base.Configure();            Editor.HorizontalAlignment = Width.Equals(int.MaxValue) ? HorizontalAlignment.Stretch : HorizontalAlignment.Left;            if (!Width.Equals(int.MaxValue))                Editor.Width = Width;            Editor.IsEnabled = false;            OnDefineLookups?.Invoke(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)            {                Editor.Items.Add(row["Display"]);                Lookups[row[keycol]] = string.Format("{0}", row["Display"]);            }            var sel = values.Rows.FirstOrDefault(r => r[keycol].Equals(value));            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;            OnLookupsDefined?.Invoke(this);        }        public event OnDefineLookup OnDefineLookups;        public event OnLookupsDefined OnLookupsDefined;        public override int DesiredHeight()        {            return 25;        }        public override void SetFocus()        {            Editor.Focus();        }        private bool IsEnumEditor()        {            return EditorDefinition is EnumLookupEditor;        }        public List<Button> Buttons { get; private set; }        protected override FrameworkElement CreateEditor()        {            var dock = new DockPanel();            Buttons = CreateButtons(out var DisableEditor);            foreach (var button in Buttons)            {                button.SetValue(DockPanel.DockProperty, Dock.Right);                dock.Children.Add(button);                dock.Width += button.Width + 5;            }            Editor = new ComboBox            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = Width.Equals(int.MaxValue) ? HorizontalAlignment.Stretch : HorizontalAlignment.Left            };            if (!Width.Equals(int.MaxValue))                Width = Width;            Editor.SelectionChanged += Combobox_SelectionChanged;            Editor.IsEnabled = false;            if (DisableEditor)            {                Editor.Background = new SolidColorBrush(Colors.Silver);                Editor.IsEnabled = false;            }            dock.Children.Add(Editor);            return dock;        }        private void Combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            if (!Editor.IsEnabled)                return;            if (LookupTable != null)            {                var keycol = ColumnName.Split('.').Last();                var row = LookupTable.Rows.FirstOrDefault(r => object.Equals(r[keycol], RetrieveValue()));                foreach (var field in LookupTable.Columns.Where(x => OtherColumns.ContainsKey(x.ColumnName)))                {                    var othervalue = row?[field.ColumnName];                    OtherValues[OtherColumns[field.ColumnName]] = othervalue;                }            }            CheckChanged();        }        public event OnUpdateOtherEditorHandler OnUpdateOtherEditor;        public override int DesiredWidth()        {            return int.MaxValue;        }        protected override object RetrieveValue()        {            if (IsEnumEditor())            {                if (Editor.SelectedIndex >= 0 && Editor.SelectedIndex < Lookups.Keys.Count)                    return Lookups.Keys.ElementAt(Editor.SelectedIndex);            }            else            {                if (Editor.SelectedIndex > 0 && Editor.SelectedIndex <= Lookups.Keys.Count)                    return Lookups.Keys.ElementAt(Editor.SelectedIndex - 1);            }            return null;        }        protected override void UpdateValue(object value)        {            if (Editor == null)                return;            if (value == null)            {                Editor.SelectedItem = null;                return;            }            if (!Loaded && !Editor.IsEnabled)            {                Lookups.Clear();                Lookups[value] = "Loading";                Editor.Items.Clear();                Editor.Items.Add("");                Editor.Items.Add("Loading...");                Editor.SelectedIndex = IsEnumEditor() ? 0 : 1;                return;            }            if (Lookups.ContainsKey(value))            {                if (IsEnumEditor())                    Editor.SelectedIndex = Lookups.Keys.ToList().IndexOf(value);                else                    Editor.SelectedIndex = Lookups.Keys.ToList().IndexOf(value) + 1;            }            else            {                Editor.SelectedIndex = 0;            }        }        public override void SetColor(Color color)        {            //Editor.Background = new SolidColorBrush(color);        }        public override void SetEnabled(bool enabled)        {            base.SetEnabled(enabled);            Editor.IsEnabled = enabled;        }    }}
 |