DynamicColumnGrid.cs 6.4 KB

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