using InABox.Configuration; using InABox.Core; using InABox.WPF; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; namespace InABox.DynamicGrid; /// /// A component which loads a custom set of columns from the database. /// public class DynamicGridCustomColumnsComponent where T : BaseObject, new() { private readonly DynamicGrid Grid; public string? Tag { get; set; } public DynamicGridCustomColumnsComponent(DynamicGrid grid, string? tag) { Grid = grid; Tag = tag; } public DynamicGridColumns LoadColumns() { var tag = GetTag(Grid.IsDirectEditMode()); var user = Task.Run(() => new UserConfiguration(tag).Load()); var global = Task.Run(() => new GlobalConfiguration(tag).Load()); Task.WaitAll(user, global); var columns = user.Result.Any() ? user.Result : global.Result; if (!columns.Any()) columns = Grid.GenerateColumns(); var removes = columns.Where(x => x is null || string.IsNullOrWhiteSpace(x.ColumnName) || DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor) .ToArray(); foreach (var remove in removes) columns.Remove(remove); foreach (var column in columns) try { var prop = DatabaseSchema.Property(typeof(T), column.ColumnName); if (prop != null) { column.Editor = prop.Editor; } else { var type = CoreUtils.GetProperty(typeof(T), column.ColumnName); column.Editor = type.GetEditor() ?? new NullEditor(); } } catch (Exception e) { Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace)); } columns.RemoveAll(x => DatabaseSchema.Property(typeof(T), x.ColumnName) == null || GetColumnEditor(x) is NullEditor); return columns; } public void SaveColumns(DynamicGridColumns columns) { var tag = GetTag(Grid.IsDirectEditMode()); new UserConfiguration(tag).Save(columns); } private string GetTag(bool directEdit) { var tag = Tag ?? typeof(T).Name; if (directEdit) tag += ":DirectEdit"; return tag; } private static BaseEditor GetColumnEditor(DynamicGridColumn column) { try { var prop = DatabaseSchema.Property(typeof(T), column.ColumnName); if (prop != null) return prop.Editor; var type = CoreUtils.GetProperty(typeof(T), column.ColumnName); return type.GetEditor() ?? new NullEditor(); } catch (Exception e) { Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace)); } return new NullEditor(); } public void LoadColumnsMenu(ContextMenu menu) { menu.AddSeparatorIfNeeded(); menu.AddItem("Reset Columns to Default", null, ResetColumnsClick); if (Security.IsAllowed()) { menu.AddItem("Reset Columns to System Default", null, ResetColumnsToSystemClick); menu.AddSeparator(); menu.AddItem("Mark Columns as Default", null, UpdateDefaultColumnsClick); } } private void ResetColumnsToSystemClick() { SaveColumns(Grid.GenerateColumns()); Grid.Refresh(true, true); } private void ResetColumnsClick() { Grid.VisibleColumns.Clear(); SaveColumns(Grid.VisibleColumns); Grid.Refresh(true, true); } private void UpdateDefaultColumnsClick() { var tag = GetTag(Grid.IsDirectEditMode()); new GlobalConfiguration(tag).Save(Grid.VisibleColumns); new UserConfiguration(tag).Delete(); Grid.Refresh(true, true); } }