123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using InABox.Core;
- namespace InABox.DynamicGrid
- {
- internal class DynamicColumnGrid : DynamicGrid<DynamicGridColumn>
- {
- public DynamicColumnGrid()
- {
- Columns = new DynamicGridColumns();
- Options.AddRange(DynamicGridOption.RecordCount, DynamicGridOption.MultiSelect, DynamicGridOption.AddRows, DynamicGridOption.EditRows,
- DynamicGridOption.DeleteRows);
- ActionColumns.Add(new DynamicRowMovementColumn(DynamicRowMovement.Up, SwapRows));
- ActionColumns.Add(new DynamicRowMovementColumn(DynamicRowMovement.Down, SwapRows));
- //MasterColumns.AddRange(LoadColumns());
- }
- 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;
- }
- //public DynamicGridColumns DefineColumns()
- //{
- // return LoadColumns();
- //}
- protected override DynamicGridColumns LoadColumns()
- {
- var columns = new DynamicGridColumns
- {
- new()
- {
- ColumnName = "ColumnName", /* Type = typeof(String), */ Width = 0, Editor = new ComboLookupEditor(typeof(ColumnNameGenerator))
- },
- new() { ColumnName = "Width", /* Type = typeof(int), */ Width = 80 },
- new() { ColumnName = "Caption", /* Type = typeof(String), */ Width = 0 },
- new() { ColumnName = "Format", /* Type = typeof(String), */ Width = 60 },
- new() { ColumnName = "Alignment", /* Type = typeof(String), */ Width = 100, Editor = new EnumLookupEditor(typeof(Alignment)) }
- };
- return columns;
- }
- public override void ConfigureColumns(DynamicGridColumns columns)
- {
- base.ConfigureColumns(columns);
- var column = columns.FirstOrDefault(x => x.ColumnName.Equals("ColumnName"));
- if (column != null)
- {
- var lookup = column.Editor as ComboLookupEditor;
- lookup.OnAfterGenerateLookups += DoGenerateColumns;
- }
- }
- 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 == Editable.Enabled && 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)
- {
- 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);
- }
- }
- #region Save / Load
- protected override void Reload(Filters<DynamicGridColumn> criteria, Columns<DynamicGridColumn> columns, ref SortOrder<DynamicGridColumn> sort,
- Action<CoreTable, Exception> action)
- {
- var result = new CoreTable();
- if (columns == null || !columns.Items.Any())
- result.LoadColumns(typeof(DynamicGridColumn));
- else
- foreach (var column in columns.Items)
- result.Columns.Add(new CoreColumn { ColumnName = column.ToString(), DataType = column.Expression.Type });
- 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;
- //}
- protected override DynamicGridColumn LoadItem(CoreRow row)
- {
- var index = Data.Rows.IndexOf(row);
- return Columns[index];
- }
- protected 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);
- }
- protected override void DeleteItems(params CoreRow[] rows)
- {
- foreach (var row in rows.OrderByDescending(x => x.Index))
- Columns.RemoveAt(row.Index);
- }
- #endregion
- }
- }
|