BaseDynamicGrid.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Media;
  8. using InABox.Core;
  9. namespace InABox.DynamicGrid
  10. {
  11. public abstract class BaseDynamicGrid : ContentControl
  12. {
  13. public static readonly DependencyProperty UseWaitCursorProperty =
  14. DependencyProperty.Register(nameof(UseWaitCursor), typeof(bool), typeof(BaseDynamicGrid));
  15. protected enum ClipAction
  16. {
  17. Cut,
  18. Copy
  19. }
  20. public BaseDynamicGrid()
  21. {
  22. UseWaitCursor = true;
  23. }
  24. public bool UseWaitCursor
  25. {
  26. get => (bool)GetValue(UseWaitCursorProperty);
  27. set => SetValue(UseWaitCursorProperty, value);
  28. }
  29. public static Brush SelectionBackground { get; set; }
  30. public static Brush SelectionForeground { get; set; }
  31. public static Brush FilterBackground { get; set; }
  32. static BaseDynamicGrid()
  33. {
  34. SelectionForeground = new SolidColorBrush(Colors.Black);
  35. SelectionBackground = new SolidColorBrush(Colors.Silver);
  36. FilterBackground = new SolidColorBrush(Color.FromArgb(0xFF, 0xE9, 0xF7, 0xC9));
  37. }
  38. }
  39. public abstract class BaseDynamicGrid<T> : BaseDynamicGrid, IDynamicGrid where T : BaseObject, new()
  40. {
  41. public delegate void EntitySaveEvent(DynamicEditorForm editor, T[] items);
  42. public delegate void ValidateEvent(object sender, T[] items, List<string> errors);
  43. public EntitySaveEvent? OnAfterSave;
  44. public EntitySaveEvent? OnBeforeSave;
  45. public ValidateEvent OnValidate;
  46. protected DynamicGridStyleSelector<T> StyleSelector;
  47. public BaseDynamicGrid()
  48. {
  49. Options = new FluentList<DynamicGridOption>();
  50. Options.OnChanged += OptionsChanged;
  51. StyleSelector = GetStyleSelector();
  52. StyleSelector.GetStyle += (row, style) => GetStyle(row, style);
  53. HiddenColumns = new List<Expression<Func<T, object>>>();
  54. }
  55. public OnGetDynamicGridStyle OnGetStyle { get; set; }
  56. public List<Expression<Func<T, object>>> HiddenColumns { get; }
  57. public event OnPrintData OnPrintData;
  58. public event OnAfterReloadEventHandler OnAfterReload;
  59. public virtual bool EditItems(object[] items, Func<Type, CoreTable> PageDataHandler = null, bool PreloadPages = false)
  60. {
  61. var values = items.Select(x => (T)x).ToArray();
  62. return EditItems(values, PageDataHandler, PreloadPages);
  63. }
  64. public abstract bool DirectEdit(CoreTable data);
  65. public FluentList<DynamicGridOption> Options { get; }
  66. public DynamicGridColumns MasterColumns { get; protected set; }
  67. public DynamicGridColumns VisibleColumns { get; protected set; }
  68. public CoreTable Data { get; set; }
  69. public virtual void ConfigureColumns(DynamicGridColumns columns)
  70. {
  71. }
  72. public abstract CoreRow[] SelectedRows { get; set; }
  73. public abstract event OnFilterRecord OnFilterRecord;
  74. public abstract void AddVisualFilter(string column, string value);
  75. public event OnDefineFilter OnDefineFilter;
  76. //public event DefineFilter OnDefineFilter;
  77. public event OnCreateItem OnCreateItem;
  78. public virtual double RowHeight { get; set; }
  79. public virtual double HeaderHeight { get; set; }
  80. public new virtual double FontSize { get; set; }
  81. public void AddHiddenColumn(string column)
  82. {
  83. var expression = CoreUtils.CreateLambdaExpression<T>(column);
  84. HiddenColumns.Add(expression);
  85. }
  86. public abstract int DesiredWidth();
  87. public abstract void Refresh(bool reloadcolumns, bool reloaddata);
  88. public abstract void UpdateRow<TType>(CoreRow row, string column, TType value, bool refresh = true);
  89. public abstract void UpdateRow<T, TType>(CoreRow row, Expression<Func<T, TType>> column, TType value, bool refresh = true);
  90. protected abstract DynamicGridStyleSelector<T> GetStyleSelector();
  91. protected virtual DynamicGridStyle GetStyle(CoreRow row, DynamicGridStyle style)
  92. {
  93. return OnGetStyle != null ? OnGetStyle(row, style) : style;
  94. }
  95. public abstract bool EditItems(T[] items, Func<Type, CoreTable> PageDataHandler = null, bool PreloadPages = false);
  96. public abstract event OnCustomiseEditor<T> OnCustomiseEditor;
  97. public abstract event OnCustomiseColumns OnCustomiseColumns;
  98. public Filter<T> DefineFilter()
  99. {
  100. if (OnDefineFilter == null)
  101. return null;
  102. var result = OnDefineFilter?.Invoke(this, typeof(T)) as Filter<T>;
  103. return result;
  104. }
  105. protected virtual T CreateItem()
  106. {
  107. var result = new T();
  108. OnCreateItem?.Invoke(this, result);
  109. return result;
  110. }
  111. protected virtual void DoPrint(object sender)
  112. {
  113. OnPrintData?.Invoke(sender);
  114. }
  115. protected abstract void OptionsChanged(object sender, EventArgs args);
  116. protected virtual void AfterReload()
  117. {
  118. }
  119. protected void DoAfterReload()
  120. {
  121. AfterReload();
  122. OnAfterReload?.Invoke(this);
  123. }
  124. public IEnumerable<TType> ExtractValues<TType>(Expression<Func<T, TType>> column, Selection selection)
  125. {
  126. var result = selection == Selection.None
  127. ? new TType[] { }
  128. : selection == Selection.Selected
  129. ? SelectedRows.Select(r => r.Get(column)).ToArray()
  130. : Data.ExtractValues(column);
  131. return result;
  132. }
  133. }
  134. }