using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows; using System.Windows.Data; using InABox.Core; using NPOI.OpenXmlFormats.Wordprocessing; using Syncfusion.UI.Xaml.Grid; using Syncfusion.UI.Xaml.TreeGrid; namespace InABox.DynamicGrid; public abstract class DynamicGridEditorColumn : IDynamicGridEditorColumn where TEntity : BaseObject where TEditor : class where TGridColumn : GridColumn, new() where TTreeColumn : TreeGridColumn, new() { public List ExtraColumns { get; } = new(); public string? MappingName => Definition?.ColumnName.Replace('.', '_'); public string? TreeMappingName => $"[{Definition?.ColumnName}]"; public Func? GetEntity { get; set; } public void DoEntityChanged(string columnname, Dictionary changes) { EntityChanged?.Invoke(this, new DynamicColumnEntityChangedEventArgs(columnname, changes)); } public event DynamicColumnEntityChangedEvent EntityChanged; public TGridColumn CreateGridColumn() { var column = new TGridColumn() { UpdateTrigger = UpdateSourceTrigger.PropertyChanged }; UpdateBinding(column); if(Editor is not null) { DoConfigure(column, Editor); } return column; } GridColumn IDynamicGridEditorColumn.CreateGridColumn() => CreateGridColumn(); public TTreeColumn CreateTreeGridColumn() { var column = new TTreeColumn() { UpdateTrigger = UpdateSourceTrigger.PropertyChanged }; UpdateBinding(column); if(Editor is not null) { DoConfigure(column, Editor); } return column; } TreeGridColumn IDynamicGridEditorColumn.CreateTreeGridColumn() => CreateTreeGridColumn(); protected void UpdateData(Dictionary updates) { var entity = GetEntity?.Invoke(); if (entity != null) { var changes = new Dictionary(); foreach (var key in updates.Keys) DynamicGridUtils.UpdateEditorValue(new BaseObject[] { entity }, key, updates[key], changes); EntityChanged?.Invoke(this, new DynamicColumnEntityChangedEventArgs(Definition.ColumnName, changes)); } } protected DynamicGridEditorColumn(DynamicGridColumn definition) { Definition = definition; } public DynamicGridColumn? Definition { get; set; } public virtual GridSummaryColumn? Summary() => null; public TEditor? Editor { get { if (Definition != null) { if (Definition?.Editor is not TEditor result) result = CoreUtils.GetProperty(Definition.ColumnName)?.GetEditor() as TEditor; return result; } return null; } } protected virtual void UpdateBinding(TGridColumn column) { column.MappingName = MappingName; } protected virtual void UpdateBinding(TTreeColumn column) { column.MappingName = TreeMappingName; } protected TextAlignment GetTextAlignment(TEditor editor) => Definition?.Alignment == Alignment.NotSet ? editor is NumericEditor ? TextAlignment.Right : TextAlignment.Left : Definition?.Alignment == Alignment.BottomLeft || Definition?.Alignment == Alignment.MiddleLeft || Definition?.Alignment == Alignment.TopLeft ? TextAlignment.Left : Definition?.Alignment == Alignment.BottomCenter || Definition?.Alignment == Alignment.MiddleCenter || Definition?.Alignment == Alignment.TopCenter ? TextAlignment.Center : TextAlignment.Right; protected HorizontalAlignment GetHorizontalAlignment(TEditor editor) => Definition?.Alignment == Alignment.NotSet ? editor is NumericEditor ? HorizontalAlignment.Right : HorizontalAlignment.Left : Definition?.Alignment == Alignment.BottomLeft || Definition?.Alignment == Alignment.MiddleLeft || Definition?.Alignment == Alignment.TopLeft ? HorizontalAlignment.Left : Definition?.Alignment == Alignment.BottomCenter || Definition?.Alignment == Alignment.MiddleCenter || Definition?.Alignment == Alignment.TopCenter ? HorizontalAlignment.Center : HorizontalAlignment.Right; protected VerticalAlignment GetVerticalAlignment(TEditor editor) => Definition?.Alignment == Alignment.NotSet ? VerticalAlignment.Center : Definition?.Alignment == Alignment.TopLeft || Definition?.Alignment == Alignment.TopCenter || Definition?.Alignment == Alignment.TopRight ? VerticalAlignment.Top : Definition?.Alignment == Alignment.MiddleLeft || Definition?.Alignment == Alignment.MiddleCenter || Definition?.Alignment == Alignment.MiddleRight ? VerticalAlignment.Center : VerticalAlignment.Bottom; private void DoConfigure(TGridColumn column, TEditor editor) { Configure(column, editor); // Post-Configure the column - refactor from DynamicGrid.ReloadColumns() column.Width = column.Width; // != 0 ? column.Width : double.NaN; column.ColumnSizer = GridLengthUnitType .None; //column.Width != 0 ? GridLengthUnitType.None : GridLengthUnitType.AutoWithLastColumnFill; column.HeaderText = string.IsNullOrWhiteSpace(Definition?.Caption) ? Definition?.ColumnName : Definition.Caption; column.TextAlignment = GetTextAlignment(editor); column.HorizontalHeaderContentAlignment = GetHorizontalAlignment(editor); } private void DoConfigure(TTreeColumn column, TEditor editor) { Configure(column, editor); // Post-Configure the column - refactor from DynamicGrid.ReloadColumns() column.Width = column.Width; // != 0 ? column.Width : double.NaN; column.ColumnSizer = TreeColumnSizer.None; column.HeaderText = string.IsNullOrWhiteSpace(Definition?.Caption) ? Definition?.ColumnName : Definition.Caption; column.TextAlignment = GetTextAlignment(editor); column.HorizontalHeaderContentAlignment = GetHorizontalAlignment(editor); } protected abstract void Configure(TGridColumn column, TEditor editor); protected abstract void Configure(TTreeColumn column, TEditor editor); public virtual bool VariableWidth => true; public virtual bool VariableHeight => false; public virtual bool Filtered => true; public virtual bool Editable => Definition?.Editor.Editable == InABox.Core.Editable.Enabled; }