| File: System\ComponentModel\Design\ObjectSelectorEditor.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; namespace System.ComponentModel.Design; public abstract partial class ObjectSelectorEditor : UITypeEditor { public bool SubObjectSelector; protected object? prevValue; protected object? currValue; private Selector? _selector; public ObjectSelectorEditor() { } public ObjectSelectorEditor(bool subObjectSelector) { SubObjectSelector = subObjectSelector; } /// <inheritdoc /> public override object? EditValue(ITypeDescriptorContext? context, IServiceProvider provider, object? value) { if (!provider.TryGetService(out IWindowsFormsEditorService? editorService)) { return value; } if (_selector is null) { _selector = new Selector(this); // Enable Vista Explorer treeview style ApplyTreeViewThemeStyles(_selector); } prevValue = value; currValue = value; FillTreeWithData(_selector, context, provider); _selector.Start(editorService, value); editorService.DropDownControl(_selector); _selector.Stop(); if (prevValue != currValue) { value = currValue; } return value; } /// <summary> /// Modify a WinForms TreeView control to use the new Explorer style theme /// </summary> /// <param name="treeView">The tree view control to modify</param> public static void ApplyTreeViewThemeStyles(TreeView treeView) { ArgumentNullException.ThrowIfNull(treeView); treeView.HotTracking = true; treeView.ShowLines = false; HWND hwnd = (HWND)treeView.Handle; uint exstyle = (uint)PInvokeCore.SendMessage(hwnd, PInvoke.TVM_GETEXTENDEDSTYLE); exstyle |= PInvoke.TVS_EX_DOUBLEBUFFER | PInvoke.TVS_EX_FADEINOUTEXPANDOS; PInvokeCore.SendMessage(hwnd, PInvoke.TVM_SETEXTENDEDSTYLE, (WPARAM)0, (LPARAM)exstyle); } public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext? context) => UITypeEditorEditStyle.DropDown; protected internal bool EqualsToValue(object? value) => value == currValue; protected virtual void FillTreeWithData(Selector selector, ITypeDescriptorContext? context, IServiceProvider provider) => selector.Clear(); /// <inheritdoc /> public virtual void SetValue(object? value) => currValue = value; }