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() => "";
}