// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.ComponentModel.Design; using System.Windows.Forms.Design; namespace System.Windows.Forms.PropertyGridInternal; /// <summary> /// Root <see cref="GridEntry"/> for the <see cref="PropertyGrid"/> when there are multiple objects /// in <see cref="PropertyGrid.SelectedObjects"/>. /// </summary> internal sealed partial class MultiSelectRootGridEntry : SingleSelectRootGridEntry { private static readonly PropertyDescriptorComparer s_propertyComparer = new(); internal MultiSelectRootGridEntry( PropertyGridView view, object[] target, IServiceProvider baseProvider, IDesignerHost? host, PropertyTab tab, PropertySort sortType) : base( view, target, baseProvider, host, tab, sortType) { } internal override bool ForceReadOnly { get { if (!_forceReadOnlyChecked) { foreach (object target in (Array)Target) { if ((TypeDescriptorHelper.TryGetAttribute(target, out ReadOnlyAttribute? readOnlyAttribute) && !readOnlyAttribute.IsDefaultAttribute()) || TypeDescriptor.GetAttributes(target).Contains(InheritanceAttribute.InheritedReadOnly)) { SetForceReadOnlyFlag(); break; } } _forceReadOnlyChecked = true; } return base.ForceReadOnly; } } protected override bool CreateChildren(bool diffOldChildren = false) { try { object[] targets = (object[])Target; ChildCollection.Clear(); var mergedProperties = PropertyMerger.GetMergedProperties(targets, this, _propertySort, OwnerTab); if (mergedProperties is not null) { ChildCollection.AddRange(mergedProperties); } bool expandable = Children.Count > 0; if (!expandable) { SetFlag(Flags.ExpandableFailed, true); } CategorizePropertyEntries(); return expandable; } catch (Exception e) when (!e.IsCriticalException()) { return false; } } } |