DynamicGridCommon.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Windows.Controls;
  5. using InABox.Core;
  6. using InABox.Wpf;
  7. using Syncfusion.Data;
  8. namespace InABox.DynamicGrid;
  9. public abstract class DynamicColumnBase : BaseObject, IDynamicColumnBase
  10. {
  11. public void DoEntityChanged(string columnname, Dictionary<string,object?> changes)
  12. {
  13. EntityChanged?.Invoke(this, new DynamicColumnEntityChangedEventArgs(columnname, changes));
  14. }
  15. public event DynamicColumnEntityChangedEvent? EntityChanged;
  16. public object? Tag { get; set; }
  17. }
  18. public enum DynamicGridOption
  19. {
  20. AddRows,
  21. EditRows,
  22. DeleteRows,
  23. FilterRows,
  24. SelectColumns,
  25. ExportData,
  26. ImportData,
  27. MultiSelect,
  28. DragSource,
  29. DragTarget,
  30. DirectEdit,
  31. ShowHelp,
  32. Print,
  33. RecordCount,
  34. HideDatabaseFilters,
  35. HideDirectEditButton
  36. }
  37. public class DynamicGridOptions
  38. {
  39. public event Action? OnChanged;
  40. private int _enabled = 0;
  41. private bool _changed = false;
  42. public bool Enabled
  43. {
  44. get => _enabled == 0;
  45. set
  46. {
  47. if (value)
  48. EndUpdate();
  49. else
  50. BeginUpdate();
  51. }
  52. }
  53. public DynamicGridOptions Clear()
  54. {
  55. BeginUpdate();
  56. AddRows = false;
  57. EditRows = false;
  58. DeleteRows = false;
  59. FilterRows = false;
  60. SelectColumns = false;
  61. ExportData = false;
  62. ImportData = false;
  63. MultiSelect = false;
  64. DragSource = false;
  65. DragTarget = false;
  66. DirectEdit = false;
  67. ShowHelp = false;
  68. Print = false;
  69. RecordCount = false;
  70. HideDatabaseFilters = false;
  71. HideDirectEditButton = false;
  72. PageSize = 0;
  73. NonModalEditorHost = null;
  74. return EndUpdate();
  75. }
  76. public DynamicGridOptions BeginUpdate()
  77. {
  78. ++_enabled;
  79. return this;
  80. }
  81. private DynamicGridOptions Changed()
  82. {
  83. if (_enabled == 0)
  84. {
  85. _changed = false;
  86. OnChanged?.Invoke();
  87. }
  88. else
  89. {
  90. _changed = true;
  91. }
  92. return this;
  93. }
  94. public DynamicGridOptions EndUpdate()
  95. {
  96. --_enabled;
  97. if(_changed)
  98. {
  99. Changed();
  100. }
  101. return this;
  102. }
  103. private bool _addRows;
  104. public bool AddRows
  105. {
  106. get => _addRows;
  107. set
  108. {
  109. if(_addRows != value)
  110. {
  111. _addRows = value;
  112. Changed();
  113. }
  114. }
  115. }
  116. private bool _editRows;
  117. public bool EditRows
  118. {
  119. get => _editRows;
  120. set
  121. {
  122. if(_editRows != value)
  123. {
  124. _editRows = value;
  125. Changed();
  126. }
  127. }
  128. }
  129. private bool _deleteRows;
  130. public bool DeleteRows
  131. {
  132. get => _deleteRows;
  133. set
  134. {
  135. if(_deleteRows != value)
  136. {
  137. _deleteRows = value;
  138. Changed();
  139. }
  140. }
  141. }
  142. private bool _filterRows;
  143. public bool FilterRows
  144. {
  145. get => _filterRows;
  146. set
  147. {
  148. if(_filterRows != value)
  149. {
  150. _filterRows = value;
  151. Changed();
  152. }
  153. }
  154. }
  155. private bool _selectColumns;
  156. public bool SelectColumns
  157. {
  158. get => _selectColumns;
  159. set
  160. {
  161. if(_selectColumns != value)
  162. {
  163. _selectColumns = value;
  164. Changed();
  165. }
  166. }
  167. }
  168. private bool _exportData;
  169. public bool ExportData
  170. {
  171. get => _exportData;
  172. set
  173. {
  174. if(_exportData != value)
  175. {
  176. _exportData = value;
  177. Changed();
  178. }
  179. }
  180. }
  181. private bool _importData;
  182. public bool ImportData
  183. {
  184. get => _importData;
  185. set
  186. {
  187. if(_importData != value)
  188. {
  189. _importData = value;
  190. Changed();
  191. }
  192. }
  193. }
  194. private bool _multiSelect;
  195. public bool MultiSelect
  196. {
  197. get => _multiSelect;
  198. set
  199. {
  200. if(_multiSelect != value)
  201. {
  202. _multiSelect = value;
  203. Changed();
  204. }
  205. }
  206. }
  207. private bool _dragSource;
  208. public bool DragSource
  209. {
  210. get => _dragSource;
  211. set
  212. {
  213. if(_dragSource != value)
  214. {
  215. _dragSource = value;
  216. Changed();
  217. }
  218. }
  219. }
  220. private bool _dragTarget;
  221. public bool DragTarget
  222. {
  223. get => _dragTarget;
  224. set
  225. {
  226. if(_dragTarget != value)
  227. {
  228. _dragTarget = value;
  229. Changed();
  230. }
  231. }
  232. }
  233. private bool _directEdit;
  234. public bool DirectEdit
  235. {
  236. get => _directEdit;
  237. set
  238. {
  239. if(_directEdit != value)
  240. {
  241. _directEdit = value;
  242. Changed();
  243. }
  244. }
  245. }
  246. private bool _showHelp;
  247. public bool ShowHelp
  248. {
  249. get => _showHelp;
  250. set
  251. {
  252. if(_showHelp != value)
  253. {
  254. _showHelp = value;
  255. Changed();
  256. }
  257. }
  258. }
  259. private bool _print;
  260. public bool Print
  261. {
  262. get => _print;
  263. set
  264. {
  265. if(_print != value)
  266. {
  267. _print = value;
  268. Changed();
  269. }
  270. }
  271. }
  272. private bool _recordCount;
  273. public bool RecordCount
  274. {
  275. get => _recordCount;
  276. set
  277. {
  278. if(_recordCount != value)
  279. {
  280. _recordCount = value;
  281. Changed();
  282. }
  283. }
  284. }
  285. private bool _hideDatabaseFilters;
  286. public bool HideDatabaseFilters
  287. {
  288. get => _hideDatabaseFilters;
  289. set
  290. {
  291. if(_hideDatabaseFilters != value)
  292. {
  293. _hideDatabaseFilters = value;
  294. Changed();
  295. }
  296. }
  297. }
  298. private bool _hideDirectEditButton;
  299. public bool HideDirectEditButton
  300. {
  301. get => _hideDirectEditButton;
  302. set
  303. {
  304. if(_hideDirectEditButton != value)
  305. {
  306. _hideDirectEditButton = value;
  307. Changed();
  308. }
  309. }
  310. }
  311. private ISubPanelHost? _nonModalEditorHost;
  312. public ISubPanelHost? NonModalEditorHost
  313. {
  314. get => _nonModalEditorHost;
  315. set
  316. {
  317. if(_nonModalEditorHost != value)
  318. {
  319. _nonModalEditorHost = value;
  320. Changed();
  321. }
  322. }
  323. }
  324. private int _pageSize = 0;
  325. /// <summary>
  326. /// The page size for loading data in pages; set to 0 for no paging functionality.
  327. /// </summary>
  328. public int PageSize
  329. {
  330. get => _pageSize;
  331. set
  332. {
  333. if(_pageSize != value)
  334. {
  335. _pageSize = value;
  336. Changed();
  337. }
  338. }
  339. }
  340. }
  341. public delegate bool OnFilterRecord(CoreRow row);
  342. public delegate void OnCreateItem(object sender, BaseObject item);
  343. public delegate bool OnAfterCreateItem(object sender, BaseObject item);
  344. public delegate T OnCreateItem<T>();
  345. public delegate void OnDefineLookup(ILookupEditorControl editor);
  346. public delegate void OnGridCustomiseEditor(DynamicEditorGrid sender, DynamicGridColumn column, BaseEditor editor);
  347. public delegate void OnFormCustomiseEditor(IDynamicEditorForm sender, object[] items, DynamicGridColumn column, BaseEditor editor);
  348. public delegate void ValidateEvent<T>(DynamicGrid<T> sender, T[] items, List<string> errors)
  349. where T : BaseObject, new();
  350. /// <summary>
  351. ///
  352. /// </summary>
  353. /// <typeparam name="T"></typeparam>
  354. /// <param name="sender"></param>
  355. /// <param name="items">The array of items being edited; <see langword="null"/> is synonymous with an empty array.</param>
  356. /// <param name="column"></param>
  357. /// <param name="editor"></param>
  358. public delegate void OnCustomiseEditor<T>(IDynamicEditorForm sender, T[]? items, DynamicGridColumn column, BaseEditor editor);
  359. public delegate void OnLoadEditorButtons<T>(T item, DynamicEditorButtons buttons);
  360. public delegate void OnReconfigureEditors(DynamicEditorGrid sender);
  361. public class AfterEditorValueChangedArgs
  362. {
  363. public string ColumnName { get; set; }
  364. public Dictionary<string, object?> ChangedValues { get; set; }
  365. public AfterEditorValueChangedArgs(string columnName, Dictionary<string, object?> changedValues)
  366. {
  367. ColumnName = columnName;
  368. ChangedValues = changedValues;
  369. }
  370. }
  371. public delegate Dictionary<string, object?>? OnAfterEditorValueChanged(DynamicEditorGrid sender, AfterEditorValueChangedArgs args);
  372. //public delegate void OnGridChanged(IDynamicGrid sender);
  373. public delegate void OnLoadPage(IDynamicEditorPage page);
  374. public delegate void OnSelectPage(DynamicEditorGrid sender, BaseObject[]? items);
  375. public delegate void OnUnloadPage(IDynamicEditorPage page, bool saved);
  376. public delegate void OnCustomiseColumns(object sender, DynamicGridColumns columns);
  377. public delegate BaseEditor? OnGetEditor(DynamicGridColumn column);
  378. public delegate decimal OnGetEditorSequence(DynamicGridColumn column);
  379. public delegate IFilter? OnDefineLookupFilter(Type type, string column);
  380. public delegate IFilter? OnDefineFilter(Type type);
  381. public delegate IList<string>? OnValidateData(IDynamicEditorForm sender, BaseObject[] items);
  382. public delegate void OnPrintData(object sender);
  383. public delegate void EntitySaveEvent(IDynamicEditorForm editor, BaseObject[] items);
  384. public delegate bool DynamicGridButtonClickEvent(Button button, CoreRow[] rows);
  385. public delegate void OnContextMenuOpening(CoreTreeNode? node, ContextMenu menu);
  386. public class DynamicGridSelectionEventArgs : CancelEventArgs
  387. {
  388. public DynamicGridSelectionEventArgs(CoreRow[]? rows)
  389. {
  390. Rows = rows;
  391. }
  392. public CoreRow[]? Rows { get; }
  393. }
  394. public delegate void SelectItemHandler(object sender, DynamicGridSelectionEventArgs e);
  395. public delegate void OnDoubleClick(object sender, HandledEventArgs args);
  396. public class DynamicGridCellClickEventArgs : HandledEventArgs
  397. {
  398. public CoreRow? Row { get; set; }
  399. public DynamicColumnBase? Column { get; set; }
  400. public DynamicGridCellClickEventArgs(CoreRow? row, DynamicColumnBase? column)
  401. {
  402. Row = row;
  403. Column = column;
  404. }
  405. }
  406. public delegate void OnCellDoubleClick(object sender, DynamicGridCellClickEventArgs args);
  407. public class BeforeRefreshEventArgs : CancelEventArgs { }
  408. public delegate void BeforeRefreshEventHandler(object sender, BeforeRefreshEventArgs args);
  409. public class AfterRefreshEventArgs : EventArgs { }
  410. public delegate void AfterRefreshEventHandler(object sender, AfterRefreshEventArgs args);