using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; namespace Pf2e.WPF.EntityViewer.EntityViewStructure; /// /// Базовый класс для полей структуры. /// /// Класс построения структуры данных. /// Название поля. /// Глубина поля. internal abstract class StructureField(StructureBuilder builder, string name, int depth) : INotifyPropertyChanged { /// /// Название поля. /// public string Name { get; } = name; /// /// Тип поля структуры. /// public abstract StructureFieldType FieldType { get; } /// /// Класс построения структуры данных. /// public StructureBuilder Builder { get; } = builder; /// /// Флаг, указывающий, отображается ли поле. /// public virtual bool Visible { get => _visible; set { _visible = value; OnPropertyChanged(); } } private bool _visible = true; /// /// Глубина поля структуры. /// public int Depth { get; } = depth; /// /// Получить строку, представляющую тип поля. /// /// Строка, представляющая тип поля. public abstract string GetTypeString(); /// /// Получить строку, представляющую значение поля. /// /// Строка, представляющая значение поля. public abstract string GetValueString(); /// /// Получить набор строк, используя результат функция. /// /// Тип результирующей строки. /// Функция, оборажения поля в результирующую строку. /// Коллекция, содержащая набор строк. public virtual ICollection GetRows(Func func) { StructureField[] q = [this]; return q.Select(func).ToList(); } /// /// Событие изменения поля. /// public event PropertyChangedEventHandler? PropertyChanged; /// /// Запустить событие изменения поля. /// /// Название поля. protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new(propertyName)); } } /// /// Поле структуры с перечислением. /// /// Класс построения структуры данных. /// Значение поля. /// Название поля. /// Глубина поля. internal class StructureFieldEnum(StructureBuilder builder, object value, string name, int depth) : StructureField(builder, name, depth) { /// public override StructureFieldType FieldType => StructureFieldType.Enum; /// /// Значение поля. /// public readonly object Value = value; /// /// Тип значения поля. /// public readonly Type Type = value.GetType(); /// public override string GetTypeString() => "enum"; /// public override string GetValueString() => $"{Type.Name}.{Value}"; } /// /// Пустое поле структуры. /// /// Класс построения структуры данных. /// Название поля. /// Глубина поля. internal class StructureFieldNull(StructureBuilder builder, string name, int depth) : StructureField(builder, name, depth) { /// public override StructureFieldType FieldType => StructureFieldType.Null; /// public override string GetTypeString() => "null"; /// public override string GetValueString() => ""; } /// /// Простое поле структуры. /// /// Класс построения структуры данных. /// Значение поля. /// Название поля. /// Глубина поля. internal class StructureFieldPrimitive( StructureBuilder builder, object value, string name, int depth ) : StructureField(builder, name, depth) { /// public override StructureFieldType FieldType => StructureFieldType.Primitive; /// /// Значение поля. /// public readonly object Value = value; /// /// Тип значения поля. /// public readonly Type Type = value.GetType(); /// public override string GetTypeString() { return Type.GetTypeCode(Type) switch { TypeCode.Boolean => "bool", TypeCode.Int32 => "int", TypeCode.String => "string", TypeCode.Double => "double", _ => Type.Name, }; } /// public override string GetValueString() { if (Type == typeof(string)) { return "\"" + ((string)Value).Replace("\"", "\\\"") + "\""; } return Value.ToString() ?? string.Empty; } } /// /// Поле структуры с ссылкой на объект. /// /// Класс построения структуры данных. /// Название поля. /// Ссылка на объект. /// Глубина поля. internal class StructureFieldReference( StructureBuilder builder, string name, StructureFieldComplex? reference, int depth ) : StructureField(builder, name, depth) { /// /// Ссылка на объект. /// public StructureFieldComplex? Reference = reference; /// public override StructureFieldType FieldType => StructureFieldType.Reference; /// public override string GetTypeString() => Reference?.GetTypeString() ?? "???"; /// public override string GetValueString() => ""; } /// /// Поле структуры пропускаемого объекта. /// /// Класс построения структуры данных. /// Название поля. /// Ссылка на объект. /// Глубина поля. internal class StructureFieldIgnored( StructureBuilder builder, string name, StructureFieldComplex? reference, int depth ) : StructureField(builder, name, depth) { /// /// Ссылка на объект. /// public StructureFieldComplex? Reference = reference; /// public override StructureFieldType FieldType => StructureFieldType.Reference; /// public override string GetTypeString() => Reference?.GetTypeString() ?? "???"; /// public override string GetValueString() => ""; }