| 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];        }        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);        }        protected override void DeleteItems(params CoreRow[] rows)        {            foreach (var row in rows.OrderByDescending(x => x.Index))                Columns.RemoveAt(row.Index);        }        #endregion    }}
 |