SpreadsheetGrid.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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. ID = id,
  67. Superceded = superceded.IsEmpty() ? DateTime.Now : DateTime.MinValue
  68. };
  69. new Client<TSpreadsheet>().Save(spreadsheet, "");
  70. return true;
  71. }
  72. private BitmapImage EditImage(CoreRow? arg)
  73. {
  74. return PRSDesktop.Resources.pencil.AsBitmapImage();
  75. }
  76. private bool EditSpreadsheet(CoreRow? row)
  77. {
  78. var spreadsheet = LoadItem(row);
  79. var window = new SpreadsheetWindow(spreadsheet);
  80. window.OnSave += SaveSpreadsheet;
  81. window.ShowDialog();
  82. Refresh(false, true);
  83. return false;
  84. }
  85. protected override void DoDoubleClick(object sender, DynamicGridCellClickEventArgs args)
  86. {
  87. if (SelectedRows.Any())
  88. EditSpreadsheet(SelectedRows.First());
  89. else
  90. base.DoDoubleClick(sender, args);
  91. }
  92. protected override bool CanCreateItems()
  93. {
  94. return base.CanCreateItems() && (Master?.ID ?? Guid.Empty) != Guid.Empty;
  95. }
  96. public override TSpreadsheet CreateItem()
  97. {
  98. var result = base.CreateItem();
  99. result.Parent.ID = Master?.ID ?? Guid.Empty;
  100. result.Parent.Synchronise(Master ?? new TEntity());
  101. return result;
  102. }
  103. private void CreateMenu(ContextMenu parent, string header, Guid id)
  104. {
  105. var menu = new MenuItem();
  106. menu.Header = header;
  107. menu.Tag = id;
  108. menu.IsCheckable = false;
  109. menu.Click += (o, e) => { LoadSpreadsheet(id); };
  110. parent.Items.Add(menu);
  111. }
  112. private void LoadSpreadsheet(Guid id)
  113. {
  114. TSpreadsheet spreadsheet = CreateItem();
  115. if (id != Guid.Empty)
  116. {
  117. var template = new Client<SpreadsheetTemplate>().Query(new Filter<SpreadsheetTemplate>(x => x.ID).IsEqualTo(id)).Rows
  118. .FirstOrDefault()
  119. ?.ToObject<SpreadsheetTemplate>();
  120. spreadsheet.Code = template.Code;
  121. spreadsheet.Description = template.Description;
  122. spreadsheet.Data = template.Data;
  123. }
  124. var window = new SpreadsheetWindow(spreadsheet);
  125. window.OnSave += SaveSpreadsheet;
  126. window.ShowDialog();
  127. Refresh(false, true);
  128. }
  129. private void SaveSpreadsheet(object sender, SpreadsheetSaveArgs args)
  130. {
  131. TSpreadsheet? sheet = args.Spreadsheet as TSpreadsheet;
  132. if (sheet == null)
  133. return;
  134. if (args.SaveAs || Guid.Equals(sheet.ID,Guid.Empty))
  135. {
  136. sheet.ID = Guid.Empty;
  137. sheet.CommitChanges();
  138. sheet.Data = args.Data;
  139. EditItems(new TSpreadsheet[] { sheet });
  140. }
  141. else
  142. {
  143. sheet.Data = args.Data;
  144. new Client<TSpreadsheet>().Save(args.Spreadsheet as TSpreadsheet, "Saved by PRS Spreadsheet");
  145. }
  146. }
  147. private Dictionary<Guid, String> templates = null;
  148. protected override void DoAdd(bool OpenEditorOnDirectEdit = false)
  149. {
  150. if ((Master?.ID ?? Guid.Empty) != Guid.Empty)
  151. {
  152. MessageBox.Show($"No {typeof(TEntity).EntityName().Split(".").Last()} selected!");
  153. return;
  154. }
  155. var menu = new ContextMenu();
  156. if (templates == null)
  157. {
  158. templates = new Client<SpreadsheetTemplate>().Query(
  159. new Filter<SpreadsheetTemplate>(x => x.AppliesTo).IsEqualTo(typeof(TEntity).EntityName().Split(".").Last())
  160. .And(x=>x.Active).IsEqualTo(true)
  161. ).ToDictionary<SpreadsheetTemplate, Guid, String>(
  162. x => x.ID,
  163. (r) => String.Format("{0}: {1}", r.Get<SpreadsheetTemplate, String>(c => c.Code),
  164. r.Get<SpreadsheetTemplate, String>(c => c.Description))
  165. );
  166. }
  167. if (templates.Keys.Any())
  168. {
  169. CreateMenu(menu, "Blank Spreadsheet", Guid.Empty);
  170. menu.Items.Add(new Separator());
  171. foreach (var key in templates.Keys)
  172. CreateMenu(menu, templates[key], key);
  173. menu.IsOpen = true;
  174. }
  175. else
  176. LoadSpreadsheet(Guid.Empty);
  177. }
  178. }
  179. }