DynamicGridCustomColumnsComponent.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using InABox.Configuration;
  2. using InABox.Core;
  3. using InABox.WPF;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. namespace InABox.DynamicGrid;
  12. /// <summary>
  13. /// A component which loads a custom set of columns from the database.
  14. /// </summary>
  15. public class DynamicGridCustomColumnsComponent<T>
  16. where T : BaseObject, new()
  17. {
  18. private readonly DynamicGrid<T> Grid;
  19. public Func<DynamicGridColumns> DefaultColumns { get; set; }
  20. public string? Tag { get; set; }
  21. public DynamicGridCustomColumnsComponent(DynamicGrid<T> grid, string? tag, Func<DynamicGridColumns> defaultColumns)
  22. {
  23. Grid = grid;
  24. Tag = tag;
  25. DefaultColumns = defaultColumns;
  26. }
  27. public DynamicGridColumns LoadColumns()
  28. {
  29. DynamicGridColumns uvc = null;
  30. DynamicGridColumns udc = null;
  31. DynamicGridColumns gvc = null;
  32. DynamicGridColumns gdc = null;
  33. var tasks = new Task[]
  34. {
  35. Task.Run(() => uvc = new UserConfiguration<DynamicGridColumns>(GetTag(false)).Load()),
  36. Task.Run(() => udc = new UserConfiguration<DynamicGridColumns>(GetTag(true)).Load()),
  37. Task.Run(() => gvc = new GlobalConfiguration<DynamicGridColumns>(GetTag(false)).Load()),
  38. Task.Run(() => gdc = new GlobalConfiguration<DynamicGridColumns>(GetTag(true)).Load())
  39. };
  40. Task.WaitAll(tasks);
  41. var columns = Grid.IsDirectEditMode()
  42. ? udc?.Any() == true
  43. ? udc
  44. : gdc?.Any() == true
  45. ? gdc
  46. : uvc?.Any() == true
  47. ? uvc
  48. : gvc ?? new DynamicGridColumns()
  49. : uvc?.Any() == true
  50. ? uvc
  51. : gvc ?? new DynamicGridColumns();
  52. // var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
  53. // user.Wait();
  54. // var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
  55. // global.Wait();
  56. // //Task.WaitAll(user, global);
  57. // var columns = user.Result.Any() ? user.Result : global.Result;
  58. // if (!columns.Any())
  59. // GenerateColumns(columns); //override this to provide specific columns on startup
  60. var removes = columns.Where(x => x is null || string.IsNullOrWhiteSpace(x.ColumnName) || DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor)
  61. .ToArray();
  62. foreach (var remove in removes)
  63. columns.Remove(remove);
  64. if (columns.Count == 0)
  65. columns.AddRange(DefaultColumns());
  66. foreach (var column in columns)
  67. try
  68. {
  69. var prop = DatabaseSchema.Property(typeof(T), column.ColumnName);
  70. if (prop != null)
  71. {
  72. column.Editor = prop.Editor;
  73. }
  74. else
  75. {
  76. var type = CoreUtils.GetProperty(typeof(T), column.ColumnName);
  77. column.Editor = type.GetEditor() ?? new NullEditor();
  78. }
  79. }
  80. catch (Exception e)
  81. {
  82. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  83. }
  84. columns.RemoveAll(x => DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor);
  85. return columns;
  86. }
  87. public void SaveColumns(DynamicGridColumns columns)
  88. {
  89. var tag = GetTag(Grid.IsDirectEditMode());
  90. new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
  91. }
  92. public void LoadColumnsMenu(ContextMenu menu)
  93. {
  94. menu.AddSeparatorIfNeeded();
  95. var ResetColumns = new MenuItem { Header = "Reset Columns to Default" };
  96. ResetColumns.Click += ResetColumnsClick;
  97. menu.Items.Add(ResetColumns);
  98. if (Security.IsAllowed<CanSetDefaultColumns>())
  99. {
  100. menu.Items.Add(new Separator());
  101. var UpdateDefaultColumns = new MenuItem { Header = "Mark Columns as Default" };
  102. UpdateDefaultColumns.Click += UpdateDefaultColumnsClick;
  103. menu.Items.Add(UpdateDefaultColumns);
  104. }
  105. }
  106. private string GetTag(bool directedit)
  107. {
  108. var tag = Tag ?? typeof(T).Name;
  109. if (directedit)
  110. tag += ":DirectEdit";
  111. return tag;
  112. }
  113. private static BaseEditor GetColumnEditor(DynamicGridColumn column)
  114. {
  115. try
  116. {
  117. var prop = DatabaseSchema.Property(typeof(T), column.ColumnName);
  118. if (prop != null) return prop.Editor;
  119. var type = CoreUtils.GetProperty(typeof(T), column.ColumnName);
  120. return type.GetEditor() ?? new NullEditor();
  121. }
  122. catch (Exception e)
  123. {
  124. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  125. }
  126. return new NullEditor();
  127. }
  128. private void ResetColumnsClick(object sender, RoutedEventArgs e)
  129. {
  130. Grid.VisibleColumns.Clear();
  131. SaveColumns(Grid.VisibleColumns);
  132. Grid.Refresh(true, true);
  133. }
  134. private void UpdateDefaultColumnsClick(object sender, RoutedEventArgs e)
  135. {
  136. var tag = GetTag(Grid.IsDirectEditMode());
  137. new GlobalConfiguration<DynamicGridColumns>(tag).Save(Grid.VisibleColumns);
  138. new UserConfiguration<DynamicGridColumns>(tag).Delete();
  139. Grid.Refresh(true, true);
  140. }
  141. }