| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | using System;using System.Collections.Generic;using System.Linq;using InABox.Clients;using InABox.Core;namespace InABox.DynamicGrid;public interface IDynamicEditorHost{    /// <summary>    /// Trigger the loading of the lookup values; the canonical implementation calls <see cref="ILookupEditor.Values(string, object[]?)"/>,    /// and calls (either sync/async) <see cref="ILookupEditorControl.LoadLookups(CoreTable)"/> when the values are loaded.    /// </summary>    /// <param name="editor">The editor to load the lookups for.</param>    void LoadLookups(ILookupEditorControl editor);    /// <summary>    /// Get a document for a given filename.    /// </summary>    /// <remarks>    /// The usual implementation will go through the <see cref="Client{TEntity}"/> interface.    /// </remarks>    /// <param name="filename">The filename of the document.</param>    /// <returns>The document with the right filename, or <see langword="null"/> if not found.</returns>    Document? FindDocument(string filename)    {        return new Client<Document>().Load(new Filter<Document>(x => x.FileName).IsEqualTo(filename)).FirstOrDefault();    }    /// <summary>    /// Get a document for a given ID.    /// </summary>    /// <remarks>    /// The usual implementation will go through the <see cref="Client{TEntity}"/> interface.    /// </remarks>    /// <param name="id">The ID of the document.</param>    /// <returns>The document, or <see langword="null"/> if not found.</returns>    Document? GetDocument(Guid id)    {        return new Client<Document>().Load(new Filter<Document>(x => x.ID).IsEqualTo(id)).FirstOrDefault();    }    /// <summary>    /// Saves a document.    /// </summary>    /// <remarks>    /// The usual implementation will go through the <see cref="Client{TEntity}"/> interface.    /// </remarks>    /// <param name="document">The document to save.</param>    void SaveDocument(Document document)    {        new Client<Document>().Save(document, "Updated by Editor");    }    /// <summary>    /// Returns a list of the currently edited items; may be an empty array.    ///     /// This should probably always be a <see cref="BaseObject"/>[].    /// </summary>    /// <returns>The items being edited.</returns>    BaseObject[] GetItems();    /// <summary>    /// Return the type of the edited object.    /// </summary>    /// <returns></returns>    Type GetEditorType();    /// <summary>    /// Um... I'm really not sure; achieves the same function as <see cref="DynamicEditorGrid.OnGetEditor"/> - if you know what that does, good job.    /// </summary>    /// <remarks>    /// I think you should be fine to just return <paramref name="column"/>.Editor, as defined by <see cref="DynamicGridColumn"/>.    /// </remarks>    /// <param name="column">The column to get the editor of.</param>    /// <returns>The editor, or <see langword="null"/> if it doesn't exist.</returns>    BaseEditor? GetEditor(DynamicGridColumn column);}public class DefaultDynamicEditorHost<T> : IDynamicEditorHost    where T : BaseObject{    public virtual T[]? Items { get; set; }    public BaseEditor? GetEditor(DynamicGridColumn column) => column.Editor.CloneEditor();    public BaseObject[] GetItems() => Items ?? Array.Empty<BaseObject>();    public Type GetEditorType() => typeof(T);    public void LoadLookups(ILookupEditorControl sender)    {        var editor = sender.EditorDefinition as ILookupEditor;        var colname = sender.ColumnName;        var values = editor.Values(typeof(T), colname, Items);        sender.LoadLookups(values);    }}
 |