File: PullMemberUp\MainDialog\PullMemberUpDialogViewModel.cs
Web Access
Project: src\src\VisualStudio\Core\Def\Microsoft.VisualStudio.LanguageServices_pxr0p0dn_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.
 
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeRefactorings.PullMemberUp;
using Microsoft.CodeAnalysis.PullMemberUp;
using Microsoft.VisualStudio.LanguageServices.Implementation.CommonControls;
using Microsoft.VisualStudio.LanguageServices.Implementation.Utilities;
using Microsoft.VisualStudio.LanguageServices.Utilities;
using Microsoft.VisualStudio.Utilities;
 
namespace Microsoft.VisualStudio.LanguageServices.Implementation.PullMemberUp.MainDialog;
 
internal class PullMemberUpDialogViewModel : AbstractNotifyPropertyChanged
{
    public bool OkButtonEnabled { get => _okButtonEnabled; set => SetProperty(ref _okButtonEnabled, value, nameof(OkButtonEnabled)); }
    public bool? SelectAllCheckBoxState { get => _selectAllCheckBoxState; set => SetProperty(ref _selectAllCheckBoxState, value, nameof(SelectAllCheckBoxState)); }
    public bool SelectAllCheckBoxThreeStateEnable { get => _selectAllCheckBoxThreeStateEnable; set => SetProperty(ref _selectAllCheckBoxThreeStateEnable, value, nameof(SelectAllCheckBoxThreeStateEnable)); }
    public string SelectAllCheckBoxAutomationText => ServicesVSResources.Select_All;
    public string DestinationTreeViewAutomationText => ServicesVSResources.Select_destination;
    public string SelectMemberListViewAutomationText => ServicesVSResources.Select_member;
 
    private bool _selectAllCheckBoxThreeStateEnable;
    private bool? _selectAllCheckBoxState;
    private readonly IUIThreadOperationExecutor _uiThreadOperationExecutor;
    private readonly ImmutableDictionary<ISymbol, Task<ImmutableArray<ISymbol>>> _symbolToDependentsMap;
    private bool _okButtonEnabled;
 
    public PullMemberUpDialogViewModel(
        IUIThreadOperationExecutor uiThreadOperationExecutor,
        ImmutableArray<MemberSymbolViewModel> members,
        BaseTypeTreeNodeViewModel destinationTreeViewModel,
        ImmutableDictionary<ISymbol, Task<ImmutableArray<ISymbol>>> dependentsMap)
    {
        _uiThreadOperationExecutor = uiThreadOperationExecutor;
        _symbolToDependentsMap = dependentsMap;
 
        MemberSelectionViewModel = new MemberSelectionViewModel(
            _uiThreadOperationExecutor,
            members,
            _symbolToDependentsMap);
 
        MemberSelectionViewModel.PropertyChanged += (s, e)
            =>
            {
                if (e.PropertyName == nameof(MemberSelectionViewModel.CheckedMembers))
                {
                    EnableOrDisableOkButton();
                }
            };
 
        DestinationTreeNodeViewModel = destinationTreeViewModel;
        _selectedDestination = destinationTreeViewModel;
        EnableOrDisableOkButton();
    }
 
    public BaseTypeTreeNodeViewModel DestinationTreeNodeViewModel { get; }
 
    public MemberSelectionViewModel MemberSelectionViewModel { get; }
 
    private BaseTypeTreeNodeViewModel _selectedDestination;
    public BaseTypeTreeNodeViewModel SelectedDestination
    {
        get => _selectedDestination;
        set
        {
            if (SetProperty(ref _selectedDestination, value))
            {
                MemberSelectionViewModel.UpdateMembersBasedOnDestinationKind(_selectedDestination.Symbol.TypeKind);
                EnableOrDisableOkButton();
            }
        }
    }
 
    public PullMembersUpOptions CreatePullMemberUpOptions()
    {
        var selectedOptionFromDialog = MemberSelectionViewModel.GetSelectedMembers();
        var options = PullMembersUpOptionsBuilder.BuildPullMembersUpOptions(
            SelectedDestination.Symbol,
            selectedOptionFromDialog);
        return options;
    }
    private void EnableOrDisableOkButton()
    {
        var selectedMembers = MemberSelectionViewModel.CheckedMembers;
        OkButtonEnabled = SelectedDestination != DestinationTreeNodeViewModel && selectedMembers.Any();
    }
}