using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; namespace MaterialDesignThemes.Wpf { public static partial class HintProxyFabric { private sealed class HintProxyBuilder { private readonly Func _canBuild; private readonly Func _build; public HintProxyBuilder(Func canBuild, Func build) { if (canBuild == null) throw new ArgumentNullException(nameof(canBuild)); if (build == null) throw new ArgumentNullException(nameof(build)); _canBuild = canBuild; _build = build; } public bool CanBuild(Control control) => _canBuild(control); public IHintProxy Build(Control control) => _build(control); } private static readonly List Builders = new List(); static HintProxyFabric() { Builders.Add(new HintProxyBuilder(c => c is ComboBox, c => new ComboBoxHintProxy((ComboBox) c))); Builders.Add(new HintProxyBuilder(c => c is TextBox, c => new TextBoxHintProxy((TextBox)c))); Builders.Add(new HintProxyBuilder(c => c is PasswordBox, c => new PasswordBoxHintProxy((PasswordBox)c))); } public static void RegisterBuilder(Func canBuild, Func build) { Builders.Add(new HintProxyBuilder(canBuild, build)); } public static IHintProxy Get(Control control) { var builder = Builders.FirstOrDefault(v => v.CanBuild(control)); if (builder == null) throw new NotImplementedException(); return builder.Build(control); } } }