SpreadsheetGrid.cs 7.2 KB

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