| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | using System;using System.Collections.Generic;using System.Linq;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Forms;using System.Windows.Media.Imaging;using Comal.Classes;using FastReport.Dialog;using InABox.Clients;using InABox.Core;using InABox.DynamicGrid;using InABox.DynamicGrid.Spreadsheet;using InABox.WPF;using InABox.Wpf;using PRSServer;using System.Threading;namespace PRSDesktop{    public abstract class SpreadsheetGrid<TSpreadsheet, TEntity, TEntityLink> : DynamicDataGrid<TSpreadsheet>, IMasterDetailControl<TEntity,TSpreadsheet>        where TEntity : Entity, IPersistent, IRemotable, new()        where TEntityLink : EntityLink<TEntity>, new()        where TSpreadsheet : EntitySpreadsheet<TEntity, TEntityLink>, new()    {        public TEntity? Master { get; set; }        public Filter<TSpreadsheet> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty            ? new Filter<TSpreadsheet>(x => x.Parent.ID).IsEqualTo(Master.ID)            : new Filter<TSpreadsheet>().None();        protected override void Init()        {            base.Init();            ActionColumns.Add(new DynamicImageColumn(EditImage, EditSpreadsheet) { Position = DynamicActionColumnPosition.Start });            HiddenColumns.Add(x => x.Superceded);            ActionColumns.Add(new DynamicImageColumn(SupercededImage, SupercedeDocument));        }        protected override void DoReconfigure(DynamicGridOptions options)        {            base.DoReconfigure(options);            options.Clear();            options.AddRows = true;            options.EditRows = true;            options.DeleteRows = true;            options.RecordCount = true;        }        protected override void Reload(        	Filters<TSpreadsheet> criteria, Columns<TSpreadsheet> columns, ref SortOrder<TSpreadsheet>? sort,        	CancellationToken token, Action<CoreTable?, Exception?> action)        {            criteria.Add(MasterDetailFilter);            base.Reload(criteria, columns, ref sort, token, action);        }        private BitmapImage SupercededImage(CoreRow? row)        {            if (row == null)                return PRSDesktop.Resources.tick.AsBitmapImage();            if (row.Get<TSpreadsheet, DateTime>(x => x.Superceded) != DateTime.MinValue)                return PRSDesktop.Resources.warning.AsBitmapImage();            return PRSDesktop.Resources.tick.AsBitmapImage();        }        private bool SupercedeDocument(CoreRow? row)        {            var id = row.Get<TSpreadsheet, Guid>(x => x.ID);            var superceded = row.Get<TSpreadsheet, DateTime>(x => x.Superceded);            var spreadsheet = new TSpreadsheet()            {                Superceded = superceded.IsEmpty() ? DateTime.Now : DateTime.MinValue            }.SetID(id);            new Client<TSpreadsheet>().Save(spreadsheet, "");            return true;        }        private BitmapImage EditImage(CoreRow? arg)        {            return PRSDesktop.Resources.pencil.AsBitmapImage();        }        private bool EditSpreadsheet(CoreRow? row)        {            var spreadsheet = LoadItem(row);            var window = new SpreadsheetWindow(spreadsheet);            window.OnSave += SaveSpreadsheet;            window.ShowDialog();            Refresh(false, true);            return false;        }        protected override void DoDoubleClick(object sender, DynamicGridCellClickEventArgs args)        {            if (SelectedRows.Any())                 EditSpreadsheet(SelectedRows.First());            else                base.DoDoubleClick(sender, args);        }        protected override bool CanCreateItems()        {            return base.CanCreateItems() && (Master?.ID ?? Guid.Empty) != Guid.Empty;        }        public override TSpreadsheet CreateItem()        {            var result = base.CreateItem();            result.Parent.ID = Master?.ID ?? Guid.Empty;            result.Parent.Synchronise(Master ?? new TEntity());            return result;        }        private void CreateMenu(ContextMenu parent, string header, Guid id)        {            var menu = new MenuItem();            menu.Header = header;            menu.Tag = id;            menu.IsCheckable = false;            menu.Click += (o, e) => { LoadSpreadsheet(id); };            parent.Items.Add(menu);        }        private void LoadSpreadsheet(Guid id)        {            TSpreadsheet spreadsheet = CreateItem();            if (id != Guid.Empty)            {                var template = new Client<SpreadsheetTemplate>().Query(new Filter<SpreadsheetTemplate>(x => x.ID).IsEqualTo(id)).Rows                    .FirstOrDefault()                    ?.ToObject<SpreadsheetTemplate>();                spreadsheet.Code = template.Code;                spreadsheet.Description = template.Description;                spreadsheet.Data = template.Data;            }            var window = new SpreadsheetWindow(spreadsheet);            window.OnSave += SaveSpreadsheet;            window.ShowDialog();            Refresh(false, true);        }        private void SaveSpreadsheet(object sender, SpreadsheetSaveArgs args)        {            TSpreadsheet? sheet = args.Spreadsheet as TSpreadsheet;            if (sheet == null)                return;                        if (args.SaveAs || Guid.Equals(sheet.ID,Guid.Empty))            {                sheet.ID = Guid.Empty;                sheet.CommitChanges();                sheet.Data = args.Data;                EditItems(new TSpreadsheet[] { sheet });            }            else            {                sheet.Data = args.Data;                new Client<TSpreadsheet>().Save(args.Spreadsheet as TSpreadsheet, "Saved by PRS Spreadsheet");                            }        }        private Dictionary<Guid, String> templates = null;                protected override void DoAdd(bool openEditorOnDirectEdit = false)        {            if ((Master?.ID ?? Guid.Empty) != Guid.Empty)            {                MessageBox.Show($"No {typeof(TEntity).EntityName().Split(".").Last()} selected!");                return;            }                        var menu = new ContextMenu();            if (templates == null)            {                templates = new Client<SpreadsheetTemplate>().Query(                    new Filter<SpreadsheetTemplate>(x => x.AppliesTo).IsEqualTo(typeof(TEntity).EntityName().Split(".").Last())                        .And(x=>x.Active).IsEqualTo(true)                ).ToDictionary<SpreadsheetTemplate, Guid, String>(                    x => x.ID,                    (r) => String.Format("{0}: {1}", r.Get<SpreadsheetTemplate, String>(c => c.Code),                        r.Get<SpreadsheetTemplate, String>(c => c.Description))                );            }            if (templates.Keys.Any())            {                CreateMenu(menu, "Blank Spreadsheet", Guid.Empty);                menu.Items.Add(new Separator());                foreach (var key in templates.Keys)                    CreateMenu(menu, templates[key], key);                menu.IsOpen = true;            }            else                LoadSpreadsheet(Guid.Empty);        }    }}
 |