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 = ""; } class DynamicPropertyConverter : TypeConverter { private DynamicPropertyDescriptor Descriptor_; private TypeConverter Root_; public DynamicPropertyConverter(DynamicPropertyDescriptor Descriptor, TypeConverter Root) { Descriptor_ = Descriptor; Root_ = Root; } /// /// 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. /// /// true public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } /// /// 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. /// public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { List Values = new List(); if (Root_.GetStandardValuesSupported(context)) { StandardValuesCollection RootValues = Root_.GetStandardValues(context); Values.AddRange(RootValues.Cast()); } if (!Descriptor_.IsInheriting) Values.Add(MagicInheritance.Value); StandardValuesCollection Result = new StandardValuesCollection(Values); return Result; } /// /// Determines whether this property can accept values other than those specified /// in the dropdown (for example by manually typing into the field). /// 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(); } } }