namespace SheetMe.Core.Models;
///
/// 레거시 서식 XML의 Property 값 변형(variant) 기본형.
/// 레거시 직렬화기(clsBasicDesignerLoader.WriteValue)가 만들어내는 5가지 형태 + 빈 값(Null)을
/// 원형 그대로 보존해 무손실 왕복을 보장한다.
///
public abstract class LegacyPropValue
{
/// 텍스트 값 — <Property>text</Property> (TypeConverter invariant 문자열)
public sealed class TextValue : LegacyPropValue
{
/// 속성 문자열 값
public string Value { get; set; } = string.Empty;
public TextValue() { }
public TextValue(string value) => Value = value;
public override LegacyPropValue Clone() => new TextValue(Value);
}
/// 빈 값 — <Property /> 또는 내용 없는 요소 (로더에서 null 로 설정됨)
public sealed class NullValue : LegacyPropValue
{
public override LegacyPropValue Clone() => new NullValue();
}
/// 중첩 속성 — Content 직렬화 속성의 자식 <Property> 목록 (예: DataBindings)
public sealed class NestedValue : LegacyPropValue
{
/// 자식 Property 가방
public PropBag Children { get; set; } = new();
public override LegacyPropValue Clone() => new NestedValue { Children = Children.Clone() };
}
/// 컬렉션 항목 — Content IList 속성의 <Item type="AQN"> 목록 (예: ComboBox Items)
public sealed class ItemsValue : LegacyPropValue
{
/// 항목 목록
public List Items { get; set; } = new();
public override LegacyPropValue Clone()
{
var clone = new ItemsValue();
foreach (var item in Items)
{
clone.Items.Add(new LegacyItem { Aqn = item.Aqn, Value = item.Value.Clone() });
}
return clone;
}
}
/// 바이너리 값 — <Binary>base64</Binary> (BinaryFormatter/Byte[] 직렬화 잔재, verbatim 보존)
public sealed class BinaryValue : LegacyPropValue
{
/// base64 원문
public string Base64 { get; set; } = string.Empty;
public override LegacyPropValue Clone() => new BinaryValue { Base64 = Base64 };
}
/// 컴포넌트 참조 — <Reference name="..." /> (같은 호스트 내 사이트 참조)
public sealed class ReferenceValue : LegacyPropValue
{
/// 참조 대상 컴포넌트 이름
public string Name { get; set; } = string.Empty;
public override LegacyPropValue Clone() => new ReferenceValue { Name = Name };
}
/// 깊은 복제
public abstract LegacyPropValue Clone();
}
/// Content IList 속성의 항목 1개 — <Item type="AQN">값</Item>
public sealed class LegacyItem
{
/// 항목 타입의 AssemblyQualifiedName 원문
public string Aqn { get; set; } = string.Empty;
/// 항목 값(대개 TextValue)
public LegacyPropValue Value { get; set; } = new LegacyPropValue.NullValue();
}