using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using InABox.Core; namespace InABox.DynamicGrid { public abstract class BaseDynamicGrid : ContentControl { public static readonly DependencyProperty UseWaitCursorProperty = DependencyProperty.Register(nameof(UseWaitCursor), typeof(bool), typeof(BaseDynamicGrid)); protected enum ClipAction { Cut, Copy } public BaseDynamicGrid() { UseWaitCursor = true; } public bool UseWaitCursor { get => (bool)GetValue(UseWaitCursorProperty); set => SetValue(UseWaitCursorProperty, value); } public static Brush SelectionBackground { get; set; } public static Brush SelectionForeground { get; set; } public static Brush FilterBackground { get; set; } static BaseDynamicGrid() { SelectionForeground = new SolidColorBrush(Colors.Black); SelectionBackground = new SolidColorBrush(Colors.Silver); FilterBackground = new SolidColorBrush(Color.FromArgb(0xFF, 0xE9, 0xF7, 0xC9)); } } public abstract class BaseDynamicGrid : BaseDynamicGrid, IDynamicGrid where T : BaseObject, new() { public delegate void EntitySaveEvent(DynamicEditorForm editor, T[] items); public delegate void ValidateEvent(object sender, T[] items, List errors); public EntitySaveEvent? OnAfterSave; public EntitySaveEvent? OnBeforeSave; public event OnPrintData? OnPrintData; public event OnAfterReloadEventHandler? OnAfterReload; public event OnDefineFilter? OnDefineFilter; public abstract event OnFilterRecord? OnFilterRecord; public event OnCreateItem? OnCreateItem; public abstract event OnCustomiseEditor? OnCustomiseEditor; public abstract event OnCustomiseColumns? OnCustomiseColumns; public OnGetDynamicGridStyle? OnGetStyle { get; set; } public ValidateEvent? OnValidate; protected DynamicGridStyleSelector StyleSelector; public BaseDynamicGrid() { Options = new FluentList(); Options.OnChanged += OptionsChanged; StyleSelector = GetStyleSelector(); StyleSelector.GetStyle += (row, style) => GetStyle(row, style); HiddenColumns = new List>>(); } public List>> HiddenColumns { get; } public virtual bool EditItems(object[] items, Func? PageDataHandler = null, bool PreloadPages = false) { var values = items.Select(x => (T)x).ToArray(); return EditItems(values, PageDataHandler, PreloadPages); } public abstract bool DirectEdit(CoreTable data); public FluentList Options { get; } public DynamicGridColumns MasterColumns { get; protected set; } public DynamicGridColumns VisibleColumns { get; protected set; } public CoreTable Data { get; set; } public virtual void ConfigureColumns(DynamicGridColumns columns) { } public abstract CoreRow[] SelectedRows { get; set; } public abstract void AddVisualFilter(string column, string value); //public event DefineFilter OnDefineFilter; public virtual double RowHeight { get; set; } public virtual double HeaderHeight { get; set; } public new virtual double FontSize { get; set; } public void AddHiddenColumn(string column) { var expression = CoreUtils.CreateLambdaExpression(column); HiddenColumns.Add(expression); } public abstract int DesiredWidth(); public abstract void Refresh(bool reloadcolumns, bool reloaddata); public abstract void UpdateRow(CoreRow row, string column, TType value, bool refresh = true); public abstract void UpdateRow(CoreRow row, Expression> column, TType value, bool refresh = true); protected abstract DynamicGridStyleSelector GetStyleSelector(); protected virtual DynamicGridStyle GetStyle(CoreRow row, DynamicGridStyle style) { return OnGetStyle != null ? OnGetStyle(row, style) : style; } public abstract bool EditItems(T[] items, Func? PageDataHandler = null, bool PreloadPages = false); public Filter? DefineFilter() { if (OnDefineFilter is null) return null; var result = OnDefineFilter.Invoke(this, typeof(T)) as Filter; return result; } protected virtual T CreateItem() { var result = new T(); OnCreateItem?.Invoke(this, result); return result; } protected virtual void DoPrint(object sender) { OnPrintData?.Invoke(sender); } protected abstract void OptionsChanged(object sender, EventArgs args); protected virtual void AfterReload() { } protected void DoAfterReload() { AfterReload(); OnAfterReload?.Invoke(this); } public IEnumerable ExtractValues(Expression> column, Selection selection) { var result = selection == Selection.None ? new TType[] { } : selection == Selection.Selected ? SelectedRows.Select(r => r.Get(column)).ToArray() : Data.ExtractValues(column); return result; } } }