| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 | using InABox.Core;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Controls;using System.Windows.Media;using System.Windows;using Syncfusion.Windows.Tools.Controls;using Syncfusion.Data.Extensions;namespace InABox.DynamicGrid{    public class MultiLookupEditorControl : DynamicEditorControl<object>, ILookupEditorControl    {        private ComboBoxAdv Editor;        private CoreTable LookupTable;        public MultiLookupEditorControl()        {            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; }        private List<Tuple<object?, string>> Items;        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;            Lookups.Clear();            Items = new List<Tuple<object?, string>>();            //if (!IsEnumEditor())            //    Editor.Items.Add("");            var selected = Editor.SelectedItems is not null ? Editor.SelectedItems.Cast<Tuple<object?, string>>().Select(x => x.Item1) : Enumerable.Empty<object?>();            foreach (var row in values.Rows)            {                Items.Add(new(row[keycol], $"{row["Display"]}"));                Lookups[row[keycol]] = string.Format("{0}", row["Display"]);            }            Editor.ItemsSource = Items;            Editor.DisplayMemberPath = "Item2";            Editor.SelectedItems = Items.Where(x => selected.Contains(x.Item1)).ToObservableCollection();            //var sel = values.Rows.FirstOrDefault(r => r[keycol].Equals(value));            //if(sel is 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;            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 ComboBoxAdv            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = Width.Equals(int.MaxValue) ? HorizontalAlignment.Stretch : HorizontalAlignment.Left,                IsEditable = false,                AllowMultiSelect = true            };            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 (Editor.SelectedIndex >= 0 && Editor.SelectedIndex < Lookups.Keys.Count)                return string.Join(',', Editor.SelectedItems.Cast<Tuple<object?, string>>().Select(x => x.Item1));            return "";        }        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(value is not string str)            {                return;            }            IEnumerable<Tuple<object?, string>> selected;            if (!string.IsNullOrWhiteSpace(str))            {                var values = str.Split(',');                selected = values.Select(x => Items.FirstOrDefault(y => y.Item1?.ToString() == x)).Where(x => x is not null)!;            }            else            {                selected = Enumerable.Empty<Tuple<object?, string>>();            }            Editor.SelectedItems = selected.ToObservableCollection();            /*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;        }    }}
 |