sources/Google.Solutions.IapDesktop.Extensions.Session/ToolWindows/SshKeys/AuthorizedPublicKeysView.cs (111 lines of code) (raw):
//
// Copyright 2022 Google LLC
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
using Google.Solutions.Common.Diagnostics;
using Google.Solutions.IapDesktop.Application.ToolWindows.ProjectExplorer;
using Google.Solutions.IapDesktop.Core.ObjectModel;
using Google.Solutions.IapDesktop.Core.ProjectModel;
using Google.Solutions.Mvvm.Binding;
using Google.Solutions.Mvvm.Binding.Commands;
using Google.Solutions.Mvvm.Controls;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Google.Solutions.IapDesktop.Extensions.Session.ToolWindows.SshKeys
{
[Service(ServiceLifetime.Singleton)]
[SkipCodeCoverage("All logic in view model")]
public partial class AuthorizedPublicKeysView
: ProjectExplorerTrackingToolWindow<AuthorizedPublicKeysViewModel>, IView<AuthorizedPublicKeysViewModel>
{
private Bound<AuthorizedPublicKeysViewModel> viewModel;
public AuthorizedPublicKeysView(
IServiceProvider serviceProvider)
: base(serviceProvider, WeifenLuo.WinFormsUI.Docking.DockState.DockBottomAutoHide)
{
this.components = new System.ComponentModel.Container();
InitializeComponent();
this.keysList.List.AddCopyCommands();
}
public void Bind(
AuthorizedPublicKeysViewModel viewModel,
IBindingContext bindingContext)
{
this.viewModel.Value = viewModel;
this.panel.BindReadonlyObservableProperty(
c => c.Text,
viewModel,
m => m.InformationText,
bindingContext);
this.BindReadonlyObservableProperty(
c => c.Text,
viewModel,
m => m.WindowTitle,
bindingContext);
this.BindReadonlyObservableProperty(
c => c.TabText,
viewModel,
m => m.WindowTitle,
bindingContext);
viewModel.ResetWindowTitleAndInformationBar(); // Fire event to set initial window title.
//
// Bind tool strip.
//
this.toolStrip.BindReadonlyObservableProperty(
c => c.Enabled,
viewModel,
m => m.IsListEnabled,
bindingContext);
this.deleteToolStripButton.BindReadonlyProperty(
c => c.Enabled,
viewModel,
m => m.IsDeleteButtonEnabled,
bindingContext);
//
// Bind list.
//
this.keysList.BindReadonlyObservableProperty(
c => c.Enabled,
viewModel,
m => m.IsListEnabled,
bindingContext);
this.keysList.List.BindCollection(viewModel.FilteredKeys);
this.keysList.List.BindProperty(
l => l.SelectedModelItem,
viewModel,
m => viewModel.SelectedItem,
bindingContext);
this.keysList.BindProperty(
c => c.SearchTerm,
viewModel,
m => m.Filter,
bindingContext);
this.keysList.BindReadonlyObservableProperty(
c => c.Loading,
viewModel,
m => m.IsLoading,
bindingContext);
this.keysList.SearchOnKeyDown = true;
this.keysList.List.MultiSelect = false;
//
// Bind commands.
//
this.refreshToolStripButton.BindObservableCommand(
viewModel,
m => m.RefreshCommand,
bindingContext);
this.deleteToolStripButton.BindObservableCommand(
viewModel,
m => m.DeleteSelectedItemCommand,
bindingContext);
}
//---------------------------------------------------------------------
// ProjectExplorerTrackingToolWindow.
//---------------------------------------------------------------------
protected override async Task SwitchToNodeAsync(IProjectModelNode node)
{
Debug.Assert(!this.InvokeRequired, "running on UI thread");
await this.viewModel.Value
.SwitchToModelAsync(node)
.ConfigureAwait(true);
}
//---------------------------------------------------------------------
// Window events.
//---------------------------------------------------------------------
private void Window_KeyDown(object sender, KeyEventArgs e)
{
//
// NB. Hook KeyDown instead of KeyUp event to not interfere with
// child dialogs. With KeyUp, we'd get an event if a child dialog
// is dismissed by pressing Enter.
//
if ((e.Control && e.KeyCode == Keys.F) || e.KeyCode == Keys.F3)
{
this.keysList.SetFocusOnSearchBox();
}
else if (e.KeyCode == Keys.Delete)
{
this.deleteToolStripButton.PerformClick();
}
}
}
}