File: Preview\ChangeList.cs
Web Access
Project: src\src\VisualStudio\Core\Def\Microsoft.VisualStudio.LanguageServices_ozsccwvc_wpftmp.csproj (Microsoft.VisualStudio.LanguageServices)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using Microsoft.VisualStudio.Shell.Interop;
 
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Preview;
 
internal partial class ChangeList : IVsPreviewChangesList, IVsLiteTreeList
{
    public static readonly ChangeList Empty = new([]);
 
    internal AbstractChange[] Changes { get; }
 
    public ChangeList(AbstractChange[] changes)
        => this.Changes = changes;
 
    public int GetDisplayData(uint index, VSTREEDISPLAYDATA[] pData)
    {
        pData[0].Mask = (uint)_VSTREEDISPLAYMASK.TDM_STATE | (uint)_VSTREEDISPLAYMASK.TDM_IMAGE | (uint)_VSTREEDISPLAYMASK.TDM_SELECTEDIMAGE;
 
        // Set TDS_SELECTED and TDS_GRAYTEXT
        pData[0].State = Changes[index].GetDisplayState();
 
        Changes[index].GetDisplayData(pData);
        return VSConstants.S_OK;
    }
 
    public int GetExpandable(uint index, out int pfExpandable)
    {
        pfExpandable = Changes[index].IsExpandable;
        return VSConstants.S_OK;
    }
 
    public int GetExpandedList(uint index, out int pfCanRecurse, out IVsLiteTreeList pptlNode)
    {
        pfCanRecurse = Changes[index].CanRecurse;
        pptlNode = (IVsLiteTreeList)Changes[index].GetChildren();
        return VSConstants.S_OK;
    }
 
    public int GetFlags(out uint pFlags)
    {
        // The interface IVsSimplePreviewChangesList doesn't include this method.
        // Setting flags to 0 is necessary to make the underlying treeview draw
        // checkboxes and make them clickable.
        pFlags = 0;
        return VSConstants.S_OK;
    }
 
    public int GetItemCount(out uint pCount)
    {
        pCount = (uint)Changes.Length;
        return VSConstants.S_OK;
    }
 
    public int GetListChanges(ref uint pcChanges, VSTREELISTITEMCHANGE[] prgListChanges)
        => VSConstants.E_FAIL;
 
    public int GetText(uint index, VSTREETEXTOPTIONS tto, out string ppszText)
        => Changes[index].GetText(out _, out ppszText);
 
    public int GetTipText(uint index, VSTREETOOLTIPTYPE eTipType, out string ppszText)
        => Changes[index].GetTipText(out _, out ppszText);
 
    public int LocateExpandedList(IVsLiteTreeList child, out uint iIndex)
    {
        for (var i = 0; i < Changes.Length; i++)
        {
            if (Changes[i].GetChildren() == child)
            {
                iIndex = (uint)i;
                return VSConstants.S_OK;
            }
        }
 
        iIndex = 0;
        return VSConstants.S_FALSE;
    }
 
    public int OnClose(VSTREECLOSEACTIONS[] ptca)
        => VSConstants.S_OK;
 
    public int OnRequestSource(uint index, object pIUnknownTextView)
        => Changes[index].OnRequestSource(pIUnknownTextView);
 
    public int ToggleState(uint index, out uint ptscr)
    {
        Changes[index].Toggle();
        ptscr = (uint)_VSTREESTATECHANGEREFRESH.TSCR_ENTIRE;
 
        Changes[index].OnRequestSource(null);
        return VSConstants.S_OK;
    }
 
    public int UpdateCounter(out uint pCurUpdate, out uint pgrfChanges)
    {
        pCurUpdate = 0;
        pgrfChanges = 0;
        return VSConstants.S_OK;
    }
}