| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | using System;using System.Linq;using System.Windows;using System.Windows.Controls;using System.Windows.Input;using System.Windows.Media;using InABox.Core;namespace InABox.DynamicGrid{    public class CodeEditorControl : DynamicEditorControl<string>    {        private TextBox Editor;        protected override FrameworkElement CreateEditor()        {            var dock = new DockPanel            {                HorizontalAlignment = HorizontalAlignment.Stretch,                VerticalAlignment = VerticalAlignment.Stretch            };            var 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 TextBox            {                CharacterCasing = CharacterCasing.Upper,                VerticalContentAlignment = VerticalAlignment.Center            };            Editor.SetValue(DockPanel.DockProperty, Dock.Left);            if (DisableEditor)            {                Editor.Background = new SolidColorBrush(Colors.Silver);                Editor.IsEnabled = false;            }            Editor.TextChanged += (o, e) => { CheckChanged(); };            Editor.PreviewTextInput += Editor_PreviewTextInput;            DataObject.AddPastingHandler(Editor, Editor_TextPaste);            dock.Children.Add(Editor);            return dock;        }        private void Editor_TextPaste(object sender, DataObjectPastingEventArgs e)        {            if (e.DataObject.GetDataPresent(typeof(string)))            {                var allowable = (EditorDefinition as BaseCodeEditor)?.ValidChars;                var text = (string)e.DataObject.GetData(typeof(string));                if (!IsTextAllowed(text, allowable))                    e.CancelCommand();            }            else            {                e.CancelCommand();            }        }        private bool IsTextAllowed(string text, string allowable)        {            if (string.IsNullOrWhiteSpace(allowable))                return true;            return Array.TrueForAll(text.ToCharArray(), delegate(char c) { return allowable.Contains(c); });        }        private void Editor_PreviewTextInput(object sender, TextCompositionEventArgs e)        {            var allowable = (EditorDefinition as BaseCodeEditor)?.ValidChars;            e.Handled = !IsTextAllowed(e.Text, allowable);        }        public override int DesiredHeight()        {            return 25;        }        public override int DesiredWidth()        {            var result = 150;            var btnEditor = EditorDefinition as IButtonEditor;            if (btnEditor?.Buttons != null)                foreach (var button in ((IButtonEditor)EditorDefinition).Buttons)                    result += button.Width + 5;            return result;        }        protected override string RetrieveValue()        {            return Editor.Text;        }        protected override void UpdateValue(string value)        {            Editor.Text = value;        }        public override void SetFocus()        {            Editor.Focus();        }        public override void SetColor(Color color)        {            Editor.Background = new SolidColorBrush(color);        }    }}
 |