BaseDynamicGrid.cs 6.9 KB

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