DynamicGridCustomColumnsComponent.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. var tag = GetTag();
  30. var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
  31. user.Wait();
  32. var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
  33. global.Wait();
  34. //Task.WaitAll(user, global);
  35. var columns = user.Result.Any() ? user.Result : global.Result;
  36. //if (!columns.Any())
  37. // GenerateColumns(columns); //override this to provide specific columns on startup
  38. var removes = columns.Where(x => x is null || string.IsNullOrWhiteSpace(x.ColumnName) || DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor)
  39. .ToArray();
  40. foreach (var remove in removes)
  41. columns.Remove(remove);
  42. if (columns.Count == 0)
  43. columns.AddRange(DefaultColumns());
  44. foreach (var column in columns)
  45. try
  46. {
  47. var prop = DatabaseSchema.Property(typeof(T), column.ColumnName);
  48. if (prop != null)
  49. {
  50. column.Editor = prop.Editor;
  51. }
  52. else
  53. {
  54. var type = CoreUtils.GetProperty(typeof(T), column.ColumnName);
  55. column.Editor = type.GetEditor() ?? new NullEditor();
  56. }
  57. }
  58. catch (Exception e)
  59. {
  60. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  61. }
  62. columns.RemoveAll(x => DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor);
  63. return columns;
  64. }
  65. public void SaveColumns(DynamicGridColumns columns)
  66. {
  67. var tag = GetTag();
  68. new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
  69. }
  70. public void LoadColumnsMenu(ContextMenu menu)
  71. {
  72. menu.AddSeparatorIfNeeded();
  73. var ResetColumns = new MenuItem { Header = "Reset Columns to Default" };
  74. ResetColumns.Click += ResetColumnsClick;
  75. menu.Items.Add(ResetColumns);
  76. if (Security.IsAllowed<CanSetDefaultColumns>())
  77. {
  78. menu.Items.Add(new Separator());
  79. var UpdateDefaultColumns = new MenuItem { Header = "Mark Columns as Default" };
  80. UpdateDefaultColumns.Click += UpdateDefaultColumnsClick;
  81. menu.Items.Add(UpdateDefaultColumns);
  82. }
  83. }
  84. private string GetTag()
  85. {
  86. var tag = Tag ?? typeof(T).Name;
  87. if (Grid.IsDirectEditMode())
  88. {
  89. tag += ":DirectEdit";
  90. }
  91. return tag;
  92. }
  93. private static BaseEditor GetColumnEditor(DynamicGridColumn column)
  94. {
  95. try
  96. {
  97. var prop = DatabaseSchema.Property(typeof(T), column.ColumnName);
  98. if (prop != null) return prop.Editor;
  99. var type = CoreUtils.GetProperty(typeof(T), column.ColumnName);
  100. return type.GetEditor() ?? new NullEditor();
  101. }
  102. catch (Exception e)
  103. {
  104. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  105. }
  106. return new NullEditor();
  107. }
  108. private void ResetColumnsClick(object sender, RoutedEventArgs e)
  109. {
  110. Grid.VisibleColumns.Clear();
  111. SaveColumns(Grid.VisibleColumns);
  112. Grid.Refresh(true, true);
  113. }
  114. private void UpdateDefaultColumnsClick(object sender, RoutedEventArgs e)
  115. {
  116. var tag = GetTag();
  117. new GlobalConfiguration<DynamicGridColumns>(tag).Save(Grid.VisibleColumns);
  118. new UserConfiguration<DynamicGridColumns>(tag).Delete();
  119. Grid.Refresh(true, true);
  120. }
  121. }