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 : DynamicDataGrid, IMasterDetailControl where TEntity : Entity, IPersistent, IRemotable, new() where TEntityLink : EntityLink, new() where TSpreadsheet : EntitySpreadsheet, new() { public TEntity? Master { get; set; } public Filter MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty ? new Filter(x => x.Parent.ID).IsEqualTo(Master.ID) : new Filter().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 criteria, Columns columns, ref SortOrder? sort, CancellationToken token, Action 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(x => x.Superceded) != DateTime.MinValue) return PRSDesktop.Resources.warning.AsBitmapImage(); return PRSDesktop.Resources.tick.AsBitmapImage(); } private bool SupercedeDocument(CoreRow? row) { var id = row.Get(x => x.ID); var superceded = row.Get(x => x.Superceded); var spreadsheet = new TSpreadsheet() { Superceded = superceded.IsEmpty() ? DateTime.Now : DateTime.MinValue }.SetID(id); new Client().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().Query(new Filter(x => x.ID).IsEqualTo(id)).Rows .FirstOrDefault() ?.ToObject(); 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().Save(args.Spreadsheet as TSpreadsheet, "Saved by PRS Spreadsheet"); } } private Dictionary 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().Query( new Filter(x => x.AppliesTo).IsEqualTo(typeof(TEntity).EntityName().Split(".").Last()) .And(x=>x.Active).IsEqualTo(true) ).ToDictionary( x => x.ID, (r) => String.Format("{0}: {1}", r.Get(c => c.Code), r.Get(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); } } }