| using System; | |
| using System.Collections; | |
| using System.Collections.Generic; | |
| using System.ComponentModel; | |
| using System.Globalization; | |
| using System.Linq; | |
| using System.Text; | |
| using System.Threading.Tasks; | |
| namespace LLVM.ClangTidy | |
| { | |
| class MagicInheritance | |
| { | |
| public static readonly string Value = "{3A27184D-1774-489B-9BB7-7191B8E8E622}"; | |
| public static readonly string Text = "<Inherit from project or parent>"; | |
| } | |
| class DynamicPropertyConverter<T> : TypeConverter | |
| { | |
| private DynamicPropertyDescriptor<T> Descriptor_; | |
| private TypeConverter Root_; | |
| public DynamicPropertyConverter(DynamicPropertyDescriptor<T> Descriptor, TypeConverter Root) | |
| { | |
| Descriptor_ = Descriptor; | |
| Root_ = Root; | |
| } | |
| /// <summary> | |
| /// Returns true if there are specific values that can be chosen from a dropdown | |
| /// for this property. Regardless of whether standard values are supported for | |
| /// the underlying type, we always support standard values because we need to | |
| /// display the inheritance option. | |
| /// </summary> | |
| /// <returns>true</returns> | |
| public override bool GetStandardValuesSupported(ITypeDescriptorContext context) | |
| { | |
| return true; | |
| } | |
| /// <summary> | |
| /// Get the set of all standard values that can be chosen from a dropdown for this | |
| /// property. If the underlying type supports standard values, we want to include | |
| /// all those. Additionally, we want to display the option to inherit the value, | |
| /// but only if the value is not already inheriting. | |
| /// </summary> | |
| public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) | |
| { | |
| List<object> Values = new List<object>(); | |
| if (Root_.GetStandardValuesSupported(context)) | |
| { | |
| StandardValuesCollection RootValues = Root_.GetStandardValues(context); | |
| Values.AddRange(RootValues.Cast<object>()); | |
| } | |
| if (!Descriptor_.IsInheriting) | |
| Values.Add(MagicInheritance.Value); | |
| StandardValuesCollection Result = new StandardValuesCollection(Values); | |
| return Result; | |
| } | |
| /// <summary> | |
| /// Determines whether this property can accept values other than those specified | |
| /// in the dropdown (for example by manually typing into the field). | |
| /// </summary> | |
| public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) | |
| { | |
| // Although we add items to the dropdown list, we do not change whether or not | |
| // the set of values are exclusive. If the user could type into the field before | |
| // they still can. And if they couldn't before, they still can't. | |
| return Root_.GetStandardValuesExclusive(context); | |
| } | |
| public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) | |
| { | |
| return Root_.CanConvertFrom(context, sourceType); | |
| } | |
| public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) | |
| { | |
| return Root_.CanConvertTo(context, destinationType); | |
| } | |
| public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) | |
| { | |
| if (value.Equals(MagicInheritance.Value)) | |
| return MagicInheritance.Text; | |
| return Root_.ConvertFrom(context, culture, value); | |
| } | |
| public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) | |
| { | |
| if (value.GetType() == destinationType) | |
| return value; | |
| return Root_.ConvertTo(context, culture, value, destinationType); | |
| } | |
| public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues) | |
| { | |
| return Root_.CreateInstance(context, propertyValues); | |
| } | |
| public override bool Equals(object obj) | |
| { | |
| return Root_.Equals(obj); | |
| } | |
| public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) | |
| { | |
| return Root_.GetCreateInstanceSupported(context); | |
| } | |
| public override int GetHashCode() | |
| { | |
| return Root_.GetHashCode(); | |
| } | |
| public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) | |
| { | |
| return Root_.GetProperties(context, value, attributes); | |
| } | |
| public override bool GetPropertiesSupported(ITypeDescriptorContext context) | |
| { | |
| return Root_.GetPropertiesSupported(context); | |
| } | |
| public override bool IsValid(ITypeDescriptorContext context, object value) | |
| { | |
| return Root_.IsValid(context, value); | |
| } | |
| public override string ToString() | |
| { | |
| return Root_.ToString(); | |
| } | |
| } | |
| } |