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);
- }
- }
- }
|