| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 | using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Windows;using System.Windows.Controls;using System.Windows.Media;using InABox.Core;using Microsoft.Win32;namespace InABox.DynamicGrid{    public enum DocumentAction    {        Replace,        UseExisting,        MakeCopy    }    public class DocumentEditorControl : DynamicEditorControl<Guid>    {        public delegate Document? FindDocumentEvent(string FileName);        public delegate Document? GetDocumentEvent(Guid id);        public delegate void OnUpdateOtherEditorHandler(string columnname, object value);        public delegate void SaveDocumentEvent(Document document);        private Document _document = new();        private TextBox Editor;        public DocumentEditorControl()        {            OtherColumns = new Dictionary<string, string>();        }        public Dictionary<string, string> OtherColumns { get; }        public string Filter { get; set; }        public event GetDocumentEvent? OnGetDocument;        public event FindDocumentEvent? OnFindDocument;        public event SaveDocumentEvent? OnSaveDocument;        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(25, GridUnitType.Pixel) });            Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });            Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(50, GridUnitType.Pixel) });            Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(50, GridUnitType.Pixel) });            Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(50, GridUnitType.Pixel) });            Editor = new TextBox            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Stretch,                Margin = new Thickness(0, 0, 0, 0),                IsEnabled = false            };            //Editor.LostFocus += (o, e) => CheckChanged();            Editor.SetValue(Grid.ColumnProperty, 0);            Editor.SetValue(Grid.RowProperty, 0);            Grid.Children.Add(Editor);            var Select = new Button            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Stretch,                Margin = new Thickness(5, 1, 0, 1),                Content = "Select",                Focusable = false            };            Select.SetValue(Grid.ColumnProperty, 1);            Select.SetValue(Grid.RowProperty, 0);            Select.Click += Select_Click;            Grid.Children.Add(Select);            var Clear = new Button            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Stretch,                Margin = new Thickness(5, 1, 0, 1),                Content = "Clear",                Focusable = false            };            Clear.SetValue(Grid.ColumnProperty, 2);            Clear.SetValue(Grid.RowProperty, 0);            Clear.Click += Clear_Click;            Grid.Children.Add(Clear);            var View = new Button            {                VerticalAlignment = VerticalAlignment.Stretch,                VerticalContentAlignment = VerticalAlignment.Center,                HorizontalAlignment = HorizontalAlignment.Stretch,                Margin = new Thickness(5, 1, 0, 1),                Content = "View",                Focusable = false            };            View.SetValue(Grid.ColumnProperty, 3);            View.SetValue(Grid.RowProperty, 0);            View.Click += View_Click;            Grid.Children.Add(View);            return Grid;        }        private void Select_Click(object sender, RoutedEventArgs e)        {            var dlg = new OpenFileDialog();            dlg.Filter = Filter;            if (dlg.ShowDialog() == true)            {                var filename = Path.GetFileName(dlg.FileName).ToLower();                var timestamp = new FileInfo(dlg.FileName).LastWriteTime;                var data = File.ReadAllBytes(dlg.FileName);                var crc = CoreUtils.CalculateCRC(data);                //var existing = OnFindDocument?.Invoke(filename);                //if (existing != null)                //{                //    if ((existing.TimeStamp == DateTime.MinValue || existing.TimeStamp.ToString("yyyy-MM-ddThh:mm.ss.fff")                //            .Equals(timestamp.ToString("yyyy-MM-ddThh:mm.ss.fff"))) && existing.CRC.Equals(crc))                //    {                //        if (existing.TimeStamp == DateTime.MinValue)                //        {                //            existing.TimeStamp = timestamp;                //            OnSaveDocument?.Invoke(existing);                //        }                //        _document = existing;                //    }                //    else                //    {                //        var confirm = new DocumentConfirm                //        {                //            FileName = filename,                //            LocalSize = data.Length,                //            RemoteSize = existing.Data.Length,                //            LocalTimeStamp = timestamp,                //            RemoteTimeStamp = existing.TimeStamp                //        };                //        if (confirm.ShowDialog() == true)                //        {                //            if (confirm.Result == DocumentAction.Replace)                //            {                //                existing.Data = data;                //                existing.TimeStamp = timestamp;                //                existing.CRC = crc;                //                OnSaveDocument?.Invoke(existing);                //                _document = existing;                //            }                //            else if (confirm.Result == DocumentAction.UseExisting)                //            {                //                _document = existing;                //            }                //            else if (confirm.Result == DocumentAction.MakeCopy)                //            {                //                var basefilename = Path.GetFileNameWithoutExtension(filename);                //                var ext = Path.GetExtension(filename);                //                var i = 0;                //                while (existing is not null)                //                {                //                    i++;                //                    filename = Path.ChangeExtension(string.Format("{0} ({1})", basefilename, i), ext);                //                    existing = OnFindDocument?.Invoke(filename);                //                }                //                var document = new Document                //                {                //                    FileName = filename,                //                    Data = data,                //                    TimeStamp = timestamp,                //                    CRC = crc                //                };                //                OnSaveDocument?.Invoke(document);                //                _document = document;                //            }                //        }                //    }                //}                //else                //{                //    _document = new Document                //    {                //        FileName = filename,                //        Data = data,                //        TimeStamp = timestamp,                //        CRC = crc                //    };                //    OnSaveDocument?.Invoke(_document);                //}                var newDocument = DocumentConfirm.CheckDocument(new Document                {                    FileName = filename,                    TimeStamp = timestamp,                    Data = data,                    CRC = crc                }, OnFindDocument, out var shouldSave);                if(newDocument != null)                {                    _document = newDocument;                    if (shouldSave)                    {                        OnSaveDocument?.Invoke(newDocument);                    }                }                Editor.Text = _document.FileName;                if (OtherColumns.ContainsKey("FileName"))                    OtherValues[OtherColumns["FileName"]] = _document.FileName;                CheckChanged();            }        }        private void View_Click(object sender, RoutedEventArgs e)        {            if (_document.ID == Guid.Empty)            {                MessageBox.Show("Please select a document first!");                return;            }            var ext = Path.GetExtension(_document.FileName);            var filename = Path.ChangeExtension(Path.GetTempFileName(), ext);            File.WriteAllBytes(filename, _document.Data);            var gsProcessInfo = new ProcessStartInfo();            gsProcessInfo.Verb = "open";            gsProcessInfo.WindowStyle = ProcessWindowStyle.Normal;            gsProcessInfo.FileName = filename;            gsProcessInfo.UseShellExecute = true;            Process.Start(gsProcessInfo);        }        private void Clear_Click(object sender, RoutedEventArgs e)        {            _document = new Document();            Editor.Text = "";            CheckChanged();        }        public override int DesiredHeight()        {            return 25;        }        public override int DesiredWidth()        {            return int.MaxValue;        }        protected override Guid RetrieveValue()        {            return _document.ID;        }        protected override void UpdateValue(Guid value)        {            if (value != Guid.Empty)                _document = OnGetDocument?.Invoke(value) ?? new Document();            Editor.Text = _document.FileName;        }        public override void SetFocus()        {            Editor.Focus();        }        public override void SetColor(Color color)        {            Editor.Background = new SolidColorBrush(color);        }    }}
 |