sources/Google.Solutions.IapDesktop.Extensions.Session/ToolWindows/Options/TerminalOptionsSheet.cs (152 lines of code) (raw):

// // Copyright 2020 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.Common.Util; using Google.Solutions.IapDesktop.Application.Windows.Dialog; using Google.Solutions.IapDesktop.Core.ObjectModel; using Google.Solutions.Mvvm.Binding; using System; using System.Drawing; using System.Windows.Forms; namespace Google.Solutions.IapDesktop.Extensions.Session.ToolWindows.Options { [SkipCodeCoverage("UI code")] [Service(ServiceLifetime.Transient)] [ServiceCategory(typeof(IPropertiesSheetView))] public partial class TerminalOptionsSheet : UserControl, IPropertiesSheetView { private Bound<TerminalOptionsViewModel> viewModel; private readonly IExceptionDialog exceptionDialog; public TerminalOptionsSheet( IExceptionDialog exceptionDialog) { this.exceptionDialog = exceptionDialog.ExpectNotNull(nameof(exceptionDialog)); InitializeComponent(); } public Type ViewModel => typeof(TerminalOptionsViewModel); public void Bind(PropertiesSheetViewModelBase viewModelBase, IBindingContext bindingContext) { var viewModel = (TerminalOptionsViewModel)viewModelBase; this.viewModel.Value = viewModel; // // Clipboard box. // this.copyPasteUsingCtrlCAndCtrlVEnabledCheckBox.BindObservableProperty( c => c.Checked, viewModel, m => m.IsCopyPasteUsingCtrlCAndCtrlVEnabled, bindingContext); this.copyPasteUsingShiftInsertAndCtrlInsertEnabledCheckBox.BindObservableProperty( c => c.Checked, viewModel, m => m.IsCopyPasteUsingShiftInsertAndCtrlInsertEnabled, bindingContext); this.convertTypographicQuotesCheckBox.BindObservableProperty( c => c.Checked, viewModel, m => m.IsQuoteConvertionOnPasteEnabled, bindingContext); this.bracketedPastingCheckBox.BindObservableProperty( c => c.Checked, viewModel, m => m.IsBracketedPasteEnabled, bindingContext); // // Scrolling box. // this.scrollUsingCtrlHomeEndCheckBox.BindObservableProperty( c => c.Checked, viewModel, m => m.IsScrollingUsingCtrlHomeEndEnabled, bindingContext); this.scrollUsingCtrlPageUpDownCheckBox.BindObservableProperty( c => c.Checked, viewModel, m => m.IsScrollingUsingCtrlPageUpDownEnabled, bindingContext); // // Theme box. // this.caretStyleCombobox.BindObservableProperty( viewModel.CaretStyle, bindingContext); this.terminalLook.BindReadonlyObservableProperty( c => c.Font, viewModel, m => m.TerminalFont, bindingContext); this.terminalLook.BindReadonlyObservableProperty( c => c.ForeColor, viewModel, m => m.TerminalForegroundColor, bindingContext); this.terminalLook.BindReadonlyObservableProperty( c => c.BackColor, viewModel, m => m.TerminalBackgroundColor, bindingContext); } //--------------------------------------------------------------------- // Events. //--------------------------------------------------------------------- private float PointsToPixelRatio { get { using (var graphics = CreateGraphics()) { return graphics.DpiX / 72; } } } private void selectFontButton_Click(object sender, System.EventArgs _) { try { using (var dialog = new FontDialog() { FixedPitchOnly = true, AllowScriptChange = false, FontMustExist = true, ShowColor = false, ShowApply = false, ShowEffects = false, // Sizes are in pixel, not points. MinSize = (int)Math.Ceiling(this.viewModel.Value.MinimumFontSize * this.PointsToPixelRatio), MaxSize = (int)Math.Floor(this.viewModel.Value.MaximumFontSize * this.PointsToPixelRatio), Font = this.viewModel.Value.TerminalFont.Value }) { if (dialog.ShowDialog(this) == DialogResult.OK && dialog.Font != null) { // Strip the font style. this.viewModel.Value.TerminalFont.Value = new Font( dialog.Font.FontFamily, dialog.Font.Size); } } } catch (Exception e) { this.exceptionDialog.Show(this, "Selecting font failed", e); } } private void selectTerminalColorButton_Click(object sender, EventArgs _) { try { using (var dialog = new ColorDialog() { AllowFullOpen = true, AnyColor = true, SolidColorOnly = true, Color = sender == this.selectBackgroundColorButton ? this.viewModel.Value.TerminalBackgroundColor.Value : this.viewModel.Value.TerminalForegroundColor.Value }) { if (dialog.ShowDialog(this) == DialogResult.OK) { if (sender == this.selectBackgroundColorButton) { this.viewModel.Value.TerminalBackgroundColor.Value = dialog.Color; } else { this.viewModel.Value.TerminalForegroundColor.Value = dialog.Color; } } } } catch (Exception e) { this.exceptionDialog.Show(this, "Selecting font failed", e); } } } }