DynamicColumnGrid.cs 6.9 KB

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