DynamicColumnGrid.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using InABox.Core;
  5. namespace InABox.DynamicGrid
  6. {
  7. internal class DynamicColumnGrid : DynamicGrid<DynamicGridColumn>
  8. {
  9. public DynamicColumnGrid()
  10. {
  11. Columns = new DynamicGridColumns();
  12. }
  13. protected override void Init()
  14. {
  15. ActionColumns.Add(new DynamicRowMovementColumn(DynamicRowMovement.Up, SwapRows));
  16. ActionColumns.Add(new DynamicRowMovementColumn(DynamicRowMovement.Down, SwapRows));
  17. //MasterColumns.AddRange(LoadColumns());
  18. }
  19. protected override void DoReconfigure(DynamicGridOptions options)
  20. {
  21. options.RecordCount = true;
  22. options.MultiSelect = true;
  23. options.AddRows = true;
  24. options.EditRows = true;
  25. options.DeleteRows = true;
  26. }
  27. public Type Type { get; set; }
  28. public DynamicGridColumns Columns { get; }
  29. public bool DirectEdit { get; set; }
  30. private bool SwapRows(int row1, int row2)
  31. {
  32. var item = Columns[row1];
  33. Columns.Remove(item);
  34. Columns.Insert(row2, item);
  35. return true;
  36. }
  37. //public DynamicGridColumns DefineColumns()
  38. //{
  39. // return LoadColumns();
  40. //}
  41. protected override void DoValidate(DynamicGridColumn[] items, List<string> errors)
  42. {
  43. base.DoValidate(items, errors);
  44. if (items.Any(x => string.IsNullOrWhiteSpace(x.ColumnName)))
  45. errors.Add("[ColumnName] must not be blank!");
  46. }
  47. protected override DynamicGridColumns LoadColumns()
  48. {
  49. var columns = new DynamicGridColumns
  50. {
  51. new()
  52. {
  53. ColumnName = "ColumnName", /* Type = typeof(String), */ Width = 0, Editor = new ComboLookupEditor(typeof(ColumnNameGenerator))
  54. },
  55. new() { ColumnName = "Width", /* Type = typeof(int), */ Width = 80 },
  56. new() { ColumnName = "Caption", /* Type = typeof(String), */ Width = 0 },
  57. new() { ColumnName = "Format", /* Type = typeof(String), */ Width = 60 },
  58. new() { ColumnName = "Alignment", /* Type = typeof(String), */ Width = 100, Editor = new EnumLookupEditor(typeof(Alignment)) }
  59. };
  60. return columns;
  61. }
  62. public override void ConfigureColumns(DynamicGridColumns columns)
  63. {
  64. base.ConfigureColumns(columns);
  65. var column = columns.FirstOrDefault(x => x.ColumnName.Equals("ColumnName"));
  66. if (column != null)
  67. {
  68. var lookup = column.Editor as ComboLookupEditor;
  69. lookup.OnAfterGenerateLookups += DoGenerateColumns;
  70. }
  71. }
  72. private IEnumerable<DynamicGridColumn> ProcessColumns()
  73. {
  74. var result = new List<DynamicGridColumn>();
  75. var cols = new DynamicGridColumns();
  76. cols.ExtractColumns(Type);
  77. foreach (var col in cols)
  78. {
  79. if (col.Editor == null)
  80. continue;
  81. if (col.Editor is NullEditor)
  82. continue;
  83. if (col.Editor.Visible != Visible.Hidden)
  84. {
  85. result.Add(col);
  86. continue;
  87. }
  88. if (!DirectEdit)
  89. continue;
  90. if (col.Editor.Editable.IsEditable() && col.ColumnName.Split('.').Length <= 2)
  91. result.Add(col);
  92. }
  93. result.Sort((a, b) => a.ColumnName.CompareTo(b.ColumnName));
  94. return result;
  95. }
  96. private void DoGenerateColumns(ILookupGenerator generator, List<LookupEntry> entries)
  97. {
  98. var cols = ProcessColumns();
  99. foreach (var col in cols)
  100. {
  101. var entry = new LookupEntry(col.ColumnName, col.ColumnName);
  102. entries.Add(entry);
  103. }
  104. }
  105. protected override void DefineLookups(ILookupEditorControl sender, DynamicGridColumn[] items, bool async = true)
  106. {
  107. if (Type != null && sender.ColumnName.Equals("ColumnName"))
  108. {
  109. var results = new CoreTable();
  110. results.Columns.Add(new CoreColumn { ColumnName = sender.ColumnName, DataType = typeof(string) });
  111. results.Columns.Add(new CoreColumn { ColumnName = "Display", DataType = typeof(string) });
  112. var cols = ProcessColumns();
  113. foreach (var col in cols)
  114. {
  115. var row = results.NewRow();
  116. row[sender.ColumnName] = col.ColumnName;
  117. row["Display"] = col.ColumnName;
  118. results.Rows.Add(row);
  119. }
  120. ;
  121. sender.LoadLookups(results);
  122. }
  123. else
  124. {
  125. base.DefineLookups(sender, items, async);
  126. }
  127. }
  128. #region Save / Load
  129. protected override void Reload(Filters<DynamicGridColumn> criteria, Columns<DynamicGridColumn> columns, ref SortOrder<DynamicGridColumn>? sort,
  130. Action<CoreTable, Exception?> action)
  131. {
  132. var result = new CoreTable();
  133. if (columns == null || columns.Count == 0)
  134. result.LoadColumns(typeof(DynamicGridColumn));
  135. else
  136. result.LoadColumns(columns);
  137. result.LoadRows(Columns);
  138. action.Invoke(result, null);
  139. }
  140. //protected override DataTable Reload(Dictionary<String,Object> criteria, List<String> columnnames, String sort)
  141. //{
  142. // DataTable result = new DataTable();
  143. // result.LoadColumns(typeof(DynamicGridColumn));
  144. // result.LoadRows(Columns);
  145. // return result;
  146. //}
  147. public override DynamicGridColumn LoadItem(CoreRow row)
  148. {
  149. var index = Data.Rows.IndexOf(row);
  150. return Columns[index];
  151. }
  152. public override void SaveItem(DynamicGridColumn item)
  153. {
  154. try
  155. {
  156. var prop = DatabaseSchema.Property(Type, item.ColumnName);
  157. item.Editor = prop.Editor;
  158. }
  159. catch (Exception e)
  160. {
  161. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  162. }
  163. if (!Columns.Contains(item))
  164. Columns.Add(item);
  165. }
  166. public override void DeleteItems(params CoreRow[] rows)
  167. {
  168. foreach (var row in rows.OrderByDescending(x => x.Index))
  169. Columns.RemoveAt(row.Index);
  170. }
  171. #endregion
  172. }
  173. }