SpreadsheetGrid.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Controls;
  5. using System.Windows.Documents;
  6. using System.Windows.Forms;
  7. using System.Windows.Media.Imaging;
  8. using Comal.Classes;
  9. using FastReport.Dialog;
  10. using InABox.Clients;
  11. using InABox.Core;
  12. using InABox.DynamicGrid;
  13. using InABox.DynamicGrid.Spreadsheet;
  14. using InABox.WPF;
  15. using InABox.Wpf;
  16. using PRSServer;
  17. using System.Threading;
  18. namespace PRSDesktop
  19. {
  20. public abstract class SpreadsheetGrid<TSpreadsheet, TEntity, TEntityLink> : DynamicDataGrid<TSpreadsheet>, IMasterDetailControl<TEntity,TSpreadsheet>
  21. where TEntity : Entity, IPersistent, IRemotable, new()
  22. where TEntityLink : EntityLink<TEntity>, new()
  23. where TSpreadsheet : EntitySpreadsheet<TEntity, TEntityLink>, new()
  24. {
  25. public TEntity? Master { get; set; }
  26. public Filter<TSpreadsheet> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
  27. ? new Filter<TSpreadsheet>(x => x.Parent.ID).IsEqualTo(Master.ID)
  28. : new Filter<TSpreadsheet>().None();
  29. protected override void Init()
  30. {
  31. base.Init();
  32. ActionColumns.Add(new DynamicImageColumn(EditImage, EditSpreadsheet) { Position = DynamicActionColumnPosition.Start });
  33. HiddenColumns.Add(x => x.Superceded);
  34. ActionColumns.Add(new DynamicImageColumn(SupercededImage, SupercedeDocument));
  35. }
  36. protected override void DoReconfigure(DynamicGridOptions options)
  37. {
  38. base.DoReconfigure(options);
  39. options.Clear();
  40. options.AddRows = true;
  41. options.EditRows = true;
  42. options.DeleteRows = true;
  43. options.RecordCount = true;
  44. }
  45. protected override void Reload(
  46. Filters<TSpreadsheet> criteria, Columns<TSpreadsheet> columns, ref SortOrder<TSpreadsheet>? sort,
  47. CancellationToken token, Action<CoreTable?, Exception?> action)
  48. {
  49. criteria.Add(MasterDetailFilter);
  50. base.Reload(criteria, columns, ref sort, token, action);
  51. }
  52. private BitmapImage SupercededImage(CoreRow? row)
  53. {
  54. if (row == null)
  55. return PRSDesktop.Resources.tick.AsBitmapImage();
  56. if (row.Get<TSpreadsheet, DateTime>(x => x.Superceded) != DateTime.MinValue)
  57. return PRSDesktop.Resources.warning.AsBitmapImage();
  58. return PRSDesktop.Resources.tick.AsBitmapImage();
  59. }
  60. private bool SupercedeDocument(CoreRow? row)
  61. {
  62. var id = row.Get<TSpreadsheet, Guid>(x => x.ID);
  63. var superceded = row.Get<TSpreadsheet, DateTime>(x => x.Superceded);
  64. var spreadsheet = new TSpreadsheet()
  65. {
  66. Superceded = superceded.IsEmpty() ? DateTime.Now : DateTime.MinValue
  67. }.SetID(id);
  68. new Client<TSpreadsheet>().Save(spreadsheet, "");
  69. return true;
  70. }
  71. private BitmapImage EditImage(CoreRow? arg)
  72. {
  73. return PRSDesktop.Resources.pencil.AsBitmapImage();
  74. }
  75. private bool EditSpreadsheet(CoreRow? row)
  76. {
  77. var spreadsheet = LoadItem(row);
  78. var window = new SpreadsheetWindow(spreadsheet);
  79. window.OnSave += SaveSpreadsheet;
  80. window.ShowDialog();
  81. Refresh(false, true);
  82. return false;
  83. }
  84. protected override void DoDoubleClick(object sender, DynamicGridCellClickEventArgs args)
  85. {
  86. if (SelectedRows.Any())
  87. EditSpreadsheet(SelectedRows.First());
  88. else
  89. base.DoDoubleClick(sender, args);
  90. }
  91. protected override bool CanCreateItems()
  92. {
  93. return base.CanCreateItems() && (Master?.ID ?? Guid.Empty) != Guid.Empty;
  94. }
  95. public override TSpreadsheet CreateItem()
  96. {
  97. var result = base.CreateItem();
  98. result.Parent.ID = Master?.ID ?? Guid.Empty;
  99. result.Parent.Synchronise(Master ?? new TEntity());
  100. return result;
  101. }
  102. private void CreateMenu(ContextMenu parent, string header, Guid id)
  103. {
  104. var menu = new MenuItem();
  105. menu.Header = header;
  106. menu.Tag = id;
  107. menu.IsCheckable = false;
  108. menu.Click += (o, e) => { LoadSpreadsheet(id); };
  109. parent.Items.Add(menu);
  110. }
  111. private void LoadSpreadsheet(Guid id)
  112. {
  113. TSpreadsheet spreadsheet = CreateItem();
  114. if (id != Guid.Empty)
  115. {
  116. var template = new Client<SpreadsheetTemplate>().Query(new Filter<SpreadsheetTemplate>(x => x.ID).IsEqualTo(id)).Rows
  117. .FirstOrDefault()
  118. ?.ToObject<SpreadsheetTemplate>();
  119. spreadsheet.Code = template.Code;
  120. spreadsheet.Description = template.Description;
  121. spreadsheet.Data = template.Data;
  122. }
  123. var window = new SpreadsheetWindow(spreadsheet);
  124. window.OnSave += SaveSpreadsheet;
  125. window.ShowDialog();
  126. Refresh(false, true);
  127. }
  128. private void SaveSpreadsheet(object sender, SpreadsheetSaveArgs args)
  129. {
  130. TSpreadsheet? sheet = args.Spreadsheet as TSpreadsheet;
  131. if (sheet == null)
  132. return;
  133. if (args.SaveAs || Guid.Equals(sheet.ID,Guid.Empty))
  134. {
  135. sheet.ID = Guid.Empty;
  136. sheet.CommitChanges();
  137. sheet.Data = args.Data;
  138. EditItems(new TSpreadsheet[] { sheet });
  139. }
  140. else
  141. {
  142. sheet.Data = args.Data;
  143. new Client<TSpreadsheet>().Save(args.Spreadsheet as TSpreadsheet, "Saved by PRS Spreadsheet");
  144. }
  145. }
  146. private Dictionary<Guid, String> templates = null;
  147. protected override void DoAdd(bool openEditorOnDirectEdit = false)
  148. {
  149. if ((Master?.ID ?? Guid.Empty) != Guid.Empty)
  150. {
  151. MessageBox.Show($"No {typeof(TEntity).EntityName().Split(".").Last()} selected!");
  152. return;
  153. }
  154. var menu = new ContextMenu();
  155. if (templates == null)
  156. {
  157. templates = new Client<SpreadsheetTemplate>().Query(
  158. new Filter<SpreadsheetTemplate>(x => x.AppliesTo).IsEqualTo(typeof(TEntity).EntityName().Split(".").Last())
  159. .And(x=>x.Active).IsEqualTo(true)
  160. ).ToDictionary<SpreadsheetTemplate, Guid, String>(
  161. x => x.ID,
  162. (r) => String.Format("{0}: {1}", r.Get<SpreadsheetTemplate, String>(c => c.Code),
  163. r.Get<SpreadsheetTemplate, String>(c => c.Description))
  164. );
  165. }
  166. if (templates.Keys.Any())
  167. {
  168. CreateMenu(menu, "Blank Spreadsheet", Guid.Empty);
  169. menu.Items.Add(new Separator());
  170. foreach (var key in templates.Keys)
  171. CreateMenu(menu, templates[key], key);
  172. menu.IsOpen = true;
  173. }
  174. else
  175. LoadSpreadsheet(Guid.Empty);
  176. }
  177. }
  178. }