BaseDynamicGrid.cs 6.5 KB

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