DynamicColumnGrid.cs 6.5 KB

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