aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Editors/IParameterizedExtensions.cs
blob: d238cd2974428ce9a16617012e1f806477c6f8b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Tango.Editors;

/// <summary>
/// Contains extension methods for <see cref="IParameterized"/>.
/// </summary>
public static class IParameterizedExtensions
{
    /// <summary>
    /// Creates an observable collection of the parameterized object.
    /// </summary>
    /// <param name="instance">The instance.</param>
    /// <param name="mode">The parameters update mode.</param>
    /// <returns></returns>
    public static ObservableCollection<ParameterItem> CreateParametersCollection(this IParameterized instance, ParameterItemMode mode)
    {
        var ps = new ObservableCollection<ParameterItem>();

        int index = 0;

        List<Type> types = new List<Type>();
        Type currentType = instance.GetType();

        while (true)
        {
            if (typeof(IParameterized).IsAssignableFrom(currentType) && currentType != typeof(IParameterized))
            {
                types.Add(currentType);
                currentType = currentType.BaseType;
            }
            else
            {
                break;
            }
        }

        List<PropertyInfo> properties = new List<PropertyInfo>();

        foreach (var type in types)
        {
            foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
            {
                var paramAtt = prop.GetCustomAttributes(typeof(ParameterItemAttribute), false).Cast<ParameterItemAttribute>().FirstOrDefault();
                var ignore = prop.GetCustomAttributes(typeof(ParameterIgnoreAttribute), false).Cast<ParameterIgnoreAttribute>().FirstOrDefault();

                if (ignore == null && !properties.Exists(x => x.Name == prop.Name))
                {
                    var item = instance.CreateParameterItem(prop, paramAtt, index++, mode);
                    ps.Add(item);
                    properties.Add(prop);
                }
            }
        }

        return ps;
    }

    /// <summary>
    /// Creates the parameter item.
    /// </summary>
    /// <param name="instance">The instance.</param>
    /// <param name="propertyInfo">The property information.</param>
    /// <param name="attribute">The attribute.</param>
    /// <param name="index">The index.</param>
    /// <param name="mode">The mode.</param>
    /// <returns></returns>
    public static ParameterItem CreateParameterItem(this IParameterized instance, PropertyInfo propertyInfo, ParameterItemAttribute attribute, int index, ParameterItemMode mode)
    {
        ParameterItem item = new ParameterItem();
        item.Name = propertyInfo.Name.ToTitle();
        item.Index = index;
        item.Type = propertyInfo.PropertyType;
        item.Value = propertyInfo.GetValue(instance, null);

        if (attribute != null)
        {
            item.Minimum = attribute.Minimum;
            item.Maximum = attribute.Maximum;
            item.CustomEditorTypeName = attribute.CustomEditorTypeName;
            item.ExtraObject = attribute.ExtraObject;

            if (attribute.Name != null)
            {
                item.Name = attribute.Name;
            }
        }

        if (mode == ParameterItemMode.Event)
        {
            item.ParameterValueChanged += (sender, e) =>
            {
                propertyInfo.SetValue(instance, e.Value);
            };
        }
        else if (mode == ParameterItemMode.Binding)
        {
            item.Bind(ParameterItem.ValueProperty, instance as DependencyObject, propertyInfo.Name, System.Windows.Data.BindingMode.TwoWay);
        }

        return item;
    }

    /// <summary>
    /// Creates the parameter item.
    /// </summary>
    /// <param name="instance">The instance.</param>
    /// <param name="propertyName">Name of the property.</param>
    /// <param name="attribute">The attribute.</param>
    /// <param name="index">The index.</param>
    /// <param name="mode">The mode.</param>
    /// <returns></returns>
    public static ParameterItem CreateParameterItem(this IParameterized instance, String propertyName, ParameterItemAttribute attribute, int index, ParameterItemMode mode)
    {
        return instance.CreateParameterItem(instance.GetType().GetProperty(propertyName), attribute, index, mode);
    }
}