| File: System\ComponentModel\Design\DesignerActionUIService.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.Windows.Forms.Design.Behavior; namespace System.ComponentModel.Design; public sealed class DesignerActionUIService : IDisposable { private DesignerActionUIStateChangeEventHandler? _designerActionUIStateChangedEventHandler; private readonly IServiceProvider? _serviceProvider; // standard service provider private readonly DesignerActionService? _designerActionService; internal DesignerActionUIService(IServiceProvider? serviceProvider) { _serviceProvider = serviceProvider; if (serviceProvider is not null) { _serviceProvider = serviceProvider; IDesignerHost host = serviceProvider.GetRequiredService<IDesignerHost>(); host.AddService(this); _designerActionService = serviceProvider.GetService(typeof(DesignerActionService)) as DesignerActionService; Debug.Assert(_designerActionService is not null, "we should have created and registered the DAService first"); } } /// <summary> /// Disposes all resources and unhooks all events. /// </summary> public void Dispose() { if (_serviceProvider is not null) { IDesignerHost? host = _serviceProvider.GetService<IDesignerHost>(); host?.RemoveService<DesignerActionUIService>(); } } /// <summary> /// This event is thrown whenever a request is made to show/hide the UI. /// </summary> public event DesignerActionUIStateChangeEventHandler? DesignerActionUIStateChange { add => _designerActionUIStateChangedEventHandler += value; remove => _designerActionUIStateChangedEventHandler -= value; } public void HideUI(IComponent? component) => OnDesignerActionUIStateChange( new DesignerActionUIStateChangeEventArgs(component, DesignerActionUIStateChangeType.Hide)); public void ShowUI(IComponent? component) => OnDesignerActionUIStateChange( new DesignerActionUIStateChangeEventArgs(component, DesignerActionUIStateChangeType.Show)); /// <summary> /// Refreshes the <see cref="DesignerActionGlyph">designer action glyph</see> as well as /// <see cref="DesignerActionPanel"> designer action panels.</see> /// </summary> public void Refresh(IComponent? component) => OnDesignerActionUIStateChange( new DesignerActionUIStateChangeEventArgs(component, DesignerActionUIStateChangeType.Refresh)); /// <summary> /// This fires our DesignerActionsChanged event. /// </summary> private void OnDesignerActionUIStateChange(DesignerActionUIStateChangeEventArgs e) => _designerActionUIStateChangedEventHandler?.Invoke(this, e); public bool ShouldAutoShow(IComponent component) { // Check the designer options... if (_serviceProvider is not null) { if (_serviceProvider.GetService(typeof(DesignerOptionService)) is DesignerOptionService opts) { PropertyDescriptor? p = opts.Options.Properties["ObjectBoundSmartTagAutoShow"]; if (p is not null && p.PropertyType == typeof(bool) && !(bool)p.GetValue(null)!) { return false; } } } if (_designerActionService is not null) { DesignerActionListCollection coll = _designerActionService.GetComponentActions(component); if (coll is not null && coll.Count > 0) { for (int i = 0; i < coll.Count; i++) { if (coll[i]?.AutoShow == true) { return true; } } } } return false; } }