123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Controls.Primitives;
- using System.Windows.Input;
- using System.Windows.Media;
- using InABox.Clients;
- using InABox.Core;
- namespace InABox.DynamicGrid
- {
- public class CodePopupEditorControl : DynamicEditorControl<Guid, CodePopupEditor>, IPopupEditorControl
- {
-
- static CodePopupEditorControl()
- {
- //DynamicEditorControlFactory.Register<CodePopupEditorControl, CodePopupEditor>();
- }
-
- 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; }
- 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 += t => { return Host.DefineFilter(t); };
- 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 });
- }
- }
- 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 Dictionary<string,object?>();
- var code = "";
- var id = Guid.Empty;
- var displaycols = LookupFactory.DefineColumns(_type).ColumnNames();
- var row = lookup.Rows.FirstOrDefault();
- 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[col] = 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 =
- LookupFactory.FormatLookup(_type, display, new[] { CodeColumn });
- }
- private string GetCodeColumn()
- {
- var comps = ColumnName.Split('.').ToList();
- comps.RemoveAt(comps.Count - 1);
- var prefix = string.Format("{0}.", string.Join(".", comps));
- var cols = Host.Columns.Where(x => !x.ColumnName.Equals(ColumnName) && x.ColumnName.StartsWith(prefix));
- foreach (var col in cols)
- {
- var editor = Host.GetEditor(col);
- if (editor is CodeEditor || editor is UniqueCodeEditor)
- return col.ColumnName.Split('.').Last();
- }
- return "";
- }
- public override void Configure()
- {
- if(EditorDefinition is not CodePopupEditor codePopupEditor)
- {
- throw new Exception("Configuring CodePopupEditor without CodePopupEditor");
- }
- _type = (EditorDefinition as CodePopupEditor)!.Type;
- Host.LoadColumns(ColumnName, OtherColumns);
- Host.LoadColumns(ColumnName, codePopupEditor.OtherColumns);
- CodeColumn = !string.IsNullOrEmpty(codePopupEditor.CodeColumn) ? codePopupEditor.CodeColumn : GetCodeColumn();
- }
- public override void SetFocus()
- {
- Editor.Focus();
- }
- public override void SetColor(Color color)
- {
- Editor.Background = new SolidColorBrush(color);
- }
- }
- }
|