123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading;
- using InABox.Core;
- namespace InABox.DynamicGrid
- {
- internal class DynamicColumnGrid : DynamicGrid<DynamicGridColumn>
- {
- public DynamicColumnGrid()
- {
- Columns = new DynamicGridColumns();
- }
- protected override void Init()
- {
- ActionColumns.Add(new DynamicRowMovementColumn(DynamicRowMovement.Up, SwapRows));
- ActionColumns.Add(new DynamicRowMovementColumn(DynamicRowMovement.Down, SwapRows));
- var column = MasterColumns.FirstOrDefault(x => string.Equals(x.ColumnName, nameof(DynamicGridColumn.ColumnName)));
- if(column is not null && column.Editor is ComboLookupEditor lookup)
- {
- lookup.OnAfterGenerateLookups += DoGenerateColumns;
- }
- }
- protected override void DoReconfigure(DynamicGridOptions options)
- {
- options.RecordCount = true;
- options.MultiSelect = true;
- options.AddRows = true;
- options.EditRows = true;
- options.DeleteRows = true;
- }
- public Type Type { get; set; }
- public DynamicGridColumns Columns { get; }
- public bool DirectEdit { get; set; }
- private bool SwapRows(int row1, int row2)
- {
- var item = Columns[row1];
- Columns.Remove(item);
- Columns.Insert(row2, item);
- return true;
- }
- protected override void DoValidate(DynamicGridColumn[] items, List<string> errors)
- {
- base.DoValidate(items, errors);
- if (items.Any(x => string.IsNullOrWhiteSpace(x.ColumnName)))
- errors.Add("[ColumnName] must not be blank!");
- }
- protected override void CustomiseEditor(DynamicGridColumn[] items, DynamicGridColumn column, BaseEditor editor)
- {
- base.CustomiseEditor(items, column, editor);
- }
- private IEnumerable<DynamicGridColumn> ProcessColumns()
- {
- var result = new List<DynamicGridColumn>();
- var cols = new DynamicGridColumns();
- cols.ExtractColumns(Type);
- foreach (var col in cols)
- {
- if (col.Editor == null)
- continue;
- if (col.Editor is NullEditor)
- continue;
- if (col.Editor.Visible != Visible.Hidden)
- {
- result.Add(col);
- continue;
- }
- if (!DirectEdit)
- continue;
- if (col.Editor.Editable.IsEditable() && col.ColumnName.Split('.').Length <= 2)
- result.Add(col);
- }
- result.Sort((a, b) => a.ColumnName.CompareTo(b.ColumnName));
- return result;
- }
- private void DoGenerateColumns(ILookupGenerator generator, List<LookupEntry> entries)
- {
- var cols = ProcessColumns();
- foreach (var col in cols)
- {
- var entry = new LookupEntry(col.ColumnName, col.ColumnName);
- entries.Add(entry);
- }
- }
- protected override void DefineLookups(ILookupEditorControl sender, DynamicGridColumn[] items, bool async = true)
- {
- if (Type != null && sender.ColumnName.Equals("ColumnName"))
- {
- var results = new CoreTable();
- results.Columns.Add(new CoreColumn { ColumnName = sender.ColumnName, DataType = typeof(string) });
- results.Columns.Add(new CoreColumn { ColumnName = "Display", DataType = typeof(string) });
- var cols = ProcessColumns();
- foreach (var col in cols)
- {
- var row = results.NewRow();
- row[sender.ColumnName] = col.ColumnName;
- row["Display"] = col.ColumnName;
- results.Rows.Add(row);
- }
- ;
- sender.LoadLookups(results);
- }
- else
- {
- base.DefineLookups(sender, items, async);
- }
- }
- #region Save / Load
- protected override void Reload(
- Filters<DynamicGridColumn> criteria, Columns<DynamicGridColumn> columns, ref SortOrder<DynamicGridColumn>? sort,
- CancellationToken token, Action<CoreTable, Exception?> action)
- {
- var result = new CoreTable();
- if (columns == null || columns.Count == 0)
- result.LoadColumns(typeof(DynamicGridColumn));
- else
- result.LoadColumns(columns);
- result.LoadRows(Columns);
- action.Invoke(result, null);
- }
- //protected override DataTable Reload(Dictionary<String,Object> criteria, List<String> columnnames, String sort)
- //{
- // DataTable result = new DataTable();
- // result.LoadColumns(typeof(DynamicGridColumn));
- // result.LoadRows(Columns);
- // return result;
- //}
- public override DynamicGridColumn LoadItem(CoreRow row)
- {
- var index = Data.Rows.IndexOf(row);
- return Columns[index];
- }
- public override void SaveItem(DynamicGridColumn item)
- {
- try
- {
- var prop = DatabaseSchema.Property(Type, item.ColumnName);
- item.Editor = prop.Editor;
- }
- catch (Exception e)
- {
- Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
- }
- if (!Columns.Contains(item))
- Columns.Add(item);
- }
- public override void DeleteItems(params CoreRow[] rows)
- {
- foreach (var row in rows.OrderByDescending(x => x.Index))
- Columns.RemoveAt(row.Index);
- }
- #endregion
- }
- }
|