using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; using NodeNetwork.Toolkit.ValueNode; using NodeNetwork.ViewModels; using ReactiveUI; using Xceed.Wpf.Toolkit.PropertyGrid; using Xceed.Wpf.Toolkit.PropertyGrid.Attributes; using Xceed.Wpf.Toolkit.PropertyGrid.Editors; namespace Intromat.ViewModels { public class EndpointEditor : ITypeEditor { public FrameworkElement ResolveEditor(PropertyItem propertyItem) { var editor = ((EndpointPropertyDescriptor)propertyItem.PropertyDescriptor).Endpoint.Editor; return new ViewModelViewHost { ViewModel = editor, HorizontalContentAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Stretch }; } } public class EndpointPropertyDescriptor : PropertyDescriptor { public EndpointPropertyDescriptor(CodeGenNodeViewModel node, Endpoint endpoint, Attribute[] attrs) : base(endpoint.Name, attrs) { Node = node; Endpoint = endpoint; ComponentType = typeof(CodeGenNodeViewModel); PropertyType = endpoint.Editor.GetType(); IsReadOnly = false; } public static EndpointPropertyDescriptor Create(CodeGenNodeViewModel node, Endpoint endpoint, int index) { var attributes = new List(); if (endpoint.Group != null) { attributes.Add(new CategoryAttribute(endpoint.Group.Name)); } else { attributes.Add(new CategoryAttribute(node.Name)); } attributes.Add(new PropertyOrderAttribute(index)); attributes.Add(new EditorAttribute(typeof(EndpointEditor), typeof(EndpointEditor))); return new EndpointPropertyDescriptor(node, endpoint, attributes.ToArray()); } public override bool CanResetValue(object component) { return true; } public override object GetValue(object? component) { return GetEditorValue((dynamic)Endpoint.Editor); } public override void ResetValue(object component) { ResetEditorValue((dynamic)Endpoint.Editor); } public override void SetValue(object? component, object? value) { SetEditorValue((dynamic)Endpoint.Editor, (dynamic?)value); } private void SetEditorValue(ValueEditorViewModel editor, T value) { editor.Value = value; Node.RaisePropertyChanged(Name); } private void ResetEditorValue(ValueEditorViewModel editor) { SetEditorValue(editor!, default!); } private static T GetEditorValue(ValueEditorViewModel editor) { return editor.Value; } public override bool ShouldSerializeValue(object component) { return false; } public override Type ComponentType { get; } public override bool IsReadOnly { get; } public override Type PropertyType { get; } public CodeGenNodeViewModel Node { get; } public Endpoint Endpoint { get; } } }