File: System\ComponentModel\Design\ObjectSelectorEditor.cs
Web Access
Project: src\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;
}