File: System\Windows\Forms\Design\ListViewSubItemCollectionEditor.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.
 
#nullable disable
 
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
 
namespace System.Windows.Forms.Design;
 
/// <summary>
///  Provides an editor for a ListView subitems collection.
/// </summary>
internal class ListViewSubItemCollectionEditor : CollectionEditor
{
    private static int s_count;
    private ListViewItem.ListViewSubItem _firstSubItem;
 
    /// <summary>
    ///  Initializes a new instance of the <see cref="ListViewSubItemCollectionEditor"/> class.
    /// </summary>
    public ListViewSubItemCollectionEditor(Type type) : base(type)
    { }
 
    /// <inheritdoc />
    protected override object CreateInstance(Type type)
    {
        object instance = base.CreateInstance(type);
 
        // Create a default site-like name.
        if (instance is ListViewItem.ListViewSubItem item)
        {
            item.Name = SR.ListViewSubItemBaseName + s_count++;
        }
 
        return instance;
    }
 
    /// <inheritdoc />
    protected override string GetDisplayText(object value)
    {
        if (value is null)
        {
            return string.Empty;
        }
 
        string text;
 
        PropertyDescriptor property = TypeDescriptor.GetDefaultProperty(CollectionType);
 
        if (property?.PropertyType == typeof(string))
        {
            text = (string)property.GetValue(value);
 
            if (!string.IsNullOrEmpty(text))
            {
                return text;
            }
        }
 
        text = TypeDescriptor.GetConverter(value).ConvertToString(value);
 
        if (string.IsNullOrEmpty(text))
        {
            text = value.GetType().Name;
        }
 
        return text;
    }
 
    protected override object[] GetItems(object editValue)
    {
        var subItems = (ListViewItem.ListViewSubItemCollection)editValue;
 
        if (subItems.Count == 0)
        {
            return [];
        }
 
        // Save the first sub item.
        _firstSubItem = subItems[0];
 
        if (subItems.Count == 1)
        {
            return [];
        }
 
        object[] values = new object[subItems.Count - 1];
        int index = 0;
        IEnumerator enumerator = subItems.GetEnumerator();
        enumerator.MoveNext();
 
        while (enumerator.MoveNext())
        {
            values[index++] = enumerator.Current;
        }
 
        return values;
    }
 
    protected override object SetItems(object editValue, object[] value)
    {
        IList list = editValue as IList;
        list.Clear();
 
        list.Add(_firstSubItem);
 
        for (int i = 0; i < value.Length; i++)
        {
            list.Add(value[i]);
        }
 
        return editValue;
    }
}