| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 | using System;using System.Collections.Generic;using System.Linq;using System.Windows;using System.Windows.Controls;using System.Windows.Input;using System.Windows.Media;using InABox.Clients;using InABox.Core;namespace InABox.DynamicGrid{    public class CodePopupEditorControl : DynamicEditorControl<Guid>, IPopupEditorControl    {        private Type _type;        private Guid _value = Guid.Empty;        private TextBox Description;        private TextBox Editor;        private string origvalue = "";        public CodePopupEditorControl()        {            OtherColumns = new Dictionary<string, string>();        }        public Dictionary<string, string> OtherColumns { get; }        public string CodeColumn { get; set; }        public event OnDefineFilter? OnDefineFilter;        public event OnUpdateOtherEditorHandler OnUpdateOtherEditor;        protected override FrameworkElement CreateEditor()        {            var Grid = new Grid            {                VerticalAlignment = VerticalAlignment.Stretch,                HorizontalAlignment = HorizontalAlignment.Stretch            };            Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(130, GridUnitType.Pixel) });            Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(20, GridUnitType.Pixel) });            Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });            Editor = new TextBox            {                CharacterCasing = CharacterCasing.Upper,                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Stretch            };            Editor.BorderThickness = new Thickness(0.75);            Editor.BorderBrush = new SolidColorBrush(Colors.Black);            Editor.SetValue(Grid.ColumnProperty, 0);            Editor.SetValue(Grid.RowProperty, 0);            Editor.PreviewKeyDown += Editor_PreviewKeyDown;            Editor.GotFocus += Editor_GotFocus;            Editor.AcceptsTab = true;            Editor.LostFocus += Editor_LostFocus;            Grid.Children.Add(Editor);            var Select = new Button            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Stretch,                Content = "..",                Focusable = false            };            Select.BorderThickness = new Thickness(0, 0.75, 0.75, 0.75);            Select.BorderBrush = new SolidColorBrush(Colors.Black);            Select.SetValue(Grid.ColumnProperty, 1);            Select.SetValue(Grid.RowProperty, 0);            Select.Click += Select_Click;            Grid.Children.Add(Select);            Description = new TextBox            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Stretch,                Margin = new Thickness(5, 0, 0, 0),                IsReadOnly = true,                Focusable = false,                Background = new SolidColorBrush(Colors.Gainsboro)            };            Description.SetValue(Grid.ColumnProperty, 2);            Description.SetValue(Grid.RowProperty, 0);            Grid.Children.Add(Description);            return Grid;        }        private void Editor_GotFocus(object sender, RoutedEventArgs e)        {            origvalue = Editor.Text;        }        private void Editor_LostFocus(object sender, RoutedEventArgs e)        {            if (Editor.Text.Equals(origvalue))                return;            var id = _value;            LookupValue(CodeColumn, Editor.Text);            if (id == Guid.Empty)                CheckChanged();        }        private void Editor_PreviewKeyDown(object sender, KeyEventArgs e)        {            if (e.Key.Equals(Key.Enter) || e.Key.Equals(Key.Tab))            {                if (string.IsNullOrEmpty(Editor.Text))                {                    if (!Editor.Text.Equals(origvalue))                    {                        LookupValue("ID", Guid.Empty);                        CheckChanged();                    }                    Editor.MoveFocus(new TraversalRequest(Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)                        ? FocusNavigationDirection.Previous                        : FocusNavigationDirection.Next));                }                else                {                    if (!Editor.Text.Equals(origvalue))                    {                        var code = Editor.Text;                        LookupValue(CodeColumn, code);                        if (_value != Guid.Empty)                        {                            CheckChanged();                            Editor.MoveFocus(new TraversalRequest(Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)                                ? FocusNavigationDirection.Previous                                : FocusNavigationDirection.Next));                        }                        else                        {                            if (DoSearch(code))                                Editor.MoveFocus(new TraversalRequest(Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)                                    ? FocusNavigationDirection.Previous                                    : FocusNavigationDirection.Next));                        }                    }                    else                    {                        Editor.MoveFocus(new TraversalRequest(Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)                            ? FocusNavigationDirection.Previous                            : FocusNavigationDirection.Next));                    }                }                e.Handled = true;            }        }        private void Editor_PreviewKeyUp(object sender, KeyEventArgs e)        {        }        private void Editor_KeyUp(object sender, KeyEventArgs e)        {        }        private void Select_Click(object sender, RoutedEventArgs e)        {            DoSearch(Editor.Text);        }        private bool DoSearch(string code)        {            var result = false;            if (_type != null)            {                var columns = LookupFactory.DefineColumns(_type);                var cols = OtherColumns.Keys.ToList();                foreach (var column in columns.ColumnNames())                    if (cols.Contains(column))                        cols.Add(column);                var list = new PopupList(_type, _value, cols.ToArray(), new Dictionary<string, string> { { CodeColumn, code } });                list.OnDefineFilter += (o, e) => { return OnDefineFilter?.Invoke(o, e); };                if (list.ShowDialog() == true)                {                    result = true;                    _value = list.ID;                    foreach (var key in OtherColumns.Keys)                        OtherValues[OtherColumns[key]] = list.OtherValues[key];                    CheckChanged();                    Editor.Text = string.Format("{0}", list.OtherValues[CodeColumn]);                    var display = new Dictionary<string, object>();                    foreach (var key in list.OtherValues.Keys.Where(x => !string.Equals(x, CodeColumn)))                        display[key] = list.OtherValues[key];                    Description.Text =                        LookupFactory.FormatLookup(_type, display,                            new[] { CodeColumn }); //String.Join(" / ", display.Where(x=>(x != null) && !String.IsNullOrWhiteSpace(x.ToString())));                }            }            return result;        }        //private void Clear_Click(object sender, RoutedEventArgs e)        //{        //    if (_type != null)        //    {        //        _value = Guid.Empty;        //        foreach (var otherfield in OtherColumns.Keys)        //            OtherValues[OtherColumns[otherfield]] = null;        //        CheckChanged();        //        Editor.Text = "";        //    }        //}        public override int DesiredHeight()        {            return 25;        }        public override int DesiredWidth()        {            return int.MaxValue;        }        protected override Guid RetrieveValue()        {            return _value;        }        protected override void UpdateValue(Guid value)        {            var oldvalue = _value;            _value = value;            if (oldvalue != value)            {                if (Equals(value, Guid.Empty))                    SetEmptyValue();                else                    LookupValue("ID", value);            }        }        private void SetEmptyValue()        {            Editor.Text = "";            Description.Text = "";        }        private void LookupValue(string column, object value)        {            var client = ClientFactory.CreateClient(_type);            var columns = LookupFactory.DefineColumns(_type);            var cols = columns.ColumnNames();            foreach (var key in OtherColumns.Where(x => !cols.Contains(x.Key)))                columns.Add(key.Key);            var sort = LookupFactory.DefineSort(_type);            var filter = Activator.CreateInstance(typeof(Filter<>).MakeGenericType(_type));            CoreUtils.SetPropertyValue(filter, "Expression", CoreUtils.GetMemberExpression(_type, column));            CoreUtils.SetPropertyValue(filter, "Operator", Operator.IsEqualTo);            CoreUtils.SetPropertyValue(filter, "Value", value);            var lookup = client.Query(filter, columns, sort);            var display = new List<object>();            var code = "";            var id = Guid.Empty;            var displaycols = LookupFactory.DefineColumns(_type).ColumnNames();            var row = lookup.Rows.FirstOrDefault();            if (row == null)                row = lookup.NewRow(true);            code = row[CodeColumn]?.ToString();            id = (Guid)row["ID"];            foreach (var col in displaycols.Where(x => !x.Equals("ID") && !x.Equals(CodeColumn)))                display.Add(row[col]);            foreach (var key in OtherColumns.Keys)                if (lookup.Columns.Any(x => x.ColumnName.Equals(key)))                    OtherValues[OtherColumns[key]] = row[key];            _value = id;            Editor.Text = code;            Description.Text = string.Join(" / ", display.Where(x => x != null && !string.IsNullOrWhiteSpace(x.ToString())));        }        public override void Configure()        {            base.Configure();            _type = (EditorDefinition as CodePopupEditor)!.Type;        }        public override void SetFocus()        {            Editor.Focus();        }        public override void SetColor(Color color)        {            Editor.Background = new SolidColorBrush(color);        }    }}
 |