DynamicGridCommon.cs 9.3 KB

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