319 lines
10 KiB
C#
319 lines
10 KiB
C#
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
using System.Globalization;
|
|
using System.Management.Automation;
|
|
using System.Windows;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Input;
|
|
|
|
using Microsoft.Management.UI.Internal;
|
|
|
|
namespace Microsoft.Management.UI
|
|
{
|
|
/// <summary>
|
|
/// A window displaying help content and allowing search.
|
|
/// </summary>
|
|
public partial class HelpWindow : Window
|
|
{
|
|
/// <summary>
|
|
/// Minimum zoom in the slider.
|
|
/// </summary>
|
|
public static double MinimumZoom
|
|
{
|
|
get
|
|
{
|
|
return 20;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Maximum zoom in the slider.
|
|
/// </summary>
|
|
public static double MaximumZoom
|
|
{
|
|
get
|
|
{
|
|
return 300;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Zoom interval.
|
|
/// </summary>
|
|
public static double ZoomInterval
|
|
{
|
|
get
|
|
{
|
|
return 10;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// The ViewModel for the dialog.
|
|
/// </summary>
|
|
private readonly HelpViewModel viewModel;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the HelpWindow class.
|
|
/// </summary>
|
|
/// <param name="helpObject">The object with help information.</param>
|
|
public HelpWindow(PSObject helpObject)
|
|
{
|
|
InitializeComponent();
|
|
this.viewModel = new HelpViewModel(helpObject, this.DocumentParagraph);
|
|
CommonHelper.SetStartingPositionAndSize(
|
|
this,
|
|
HelpWindowSettings.Default.HelpWindowTop,
|
|
HelpWindowSettings.Default.HelpWindowLeft,
|
|
HelpWindowSettings.Default.HelpWindowWidth,
|
|
HelpWindowSettings.Default.HelpWindowHeight,
|
|
double.Parse((string)HelpWindowSettings.Default.Properties["HelpWindowWidth"].DefaultValue, CultureInfo.InvariantCulture.NumberFormat),
|
|
double.Parse((string)HelpWindowSettings.Default.Properties["HelpWindowHeight"].DefaultValue, CultureInfo.InvariantCulture.NumberFormat),
|
|
HelpWindowSettings.Default.HelpWindowMaximized);
|
|
|
|
this.ReadZoomUserSetting();
|
|
|
|
this.viewModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(this.ViewModel_PropertyChanged);
|
|
this.DataContext = this.viewModel;
|
|
|
|
this.Loaded += new RoutedEventHandler(this.HelpDialog_Loaded);
|
|
this.Closed += new System.EventHandler(this.HelpDialog_Closed);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles the mouse wheel to zoom in/out.
|
|
/// </summary>
|
|
/// <param name="e">Event arguments.</param>
|
|
protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
|
|
{
|
|
if (Keyboard.Modifiers != ModifierKeys.Control)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (e.Delta > 0)
|
|
{
|
|
this.viewModel.ZoomIn();
|
|
e.Handled = true;
|
|
}
|
|
else
|
|
{
|
|
this.viewModel.ZoomOut();
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles key down to fix the Page/Douwn going to end of help issue
|
|
/// And to implement some additional shortcuts like Ctrl+F and ZoomIn/ZoomOut.
|
|
/// </summary>
|
|
/// <param name="e">Event arguments.</param>
|
|
protected override void OnPreviewKeyDown(KeyEventArgs e)
|
|
{
|
|
if (Keyboard.Modifiers == ModifierKeys.None)
|
|
{
|
|
if (e.Key == Key.PageUp)
|
|
{
|
|
this.Scroll.PageUp();
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
|
|
if (e.Key == Key.PageDown)
|
|
{
|
|
this.Scroll.PageDown();
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (Keyboard.Modifiers == ModifierKeys.Control)
|
|
{
|
|
this.HandleZoomInAndZoomOut(e);
|
|
if (e.Handled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (e.Key == Key.F)
|
|
{
|
|
this.Find.Focus();
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift))
|
|
{
|
|
this.HandleZoomInAndZoomOut(e);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reads the zoom part of the user settings.
|
|
/// </summary>
|
|
private void ReadZoomUserSetting()
|
|
{
|
|
if (HelpWindowSettings.Default.HelpZoom < HelpWindow.MinimumZoom || HelpWindowSettings.Default.HelpZoom > HelpWindow.MaximumZoom)
|
|
{
|
|
HelpWindowSettings.Default.HelpZoom = 100;
|
|
}
|
|
|
|
this.viewModel.Zoom = HelpWindowSettings.Default.HelpZoom;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles Zoom in and Zoom out keys.
|
|
/// </summary>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void HandleZoomInAndZoomOut(KeyEventArgs e)
|
|
{
|
|
if (e.Key == Key.OemPlus || e.Key == Key.Add)
|
|
{
|
|
this.viewModel.ZoomIn();
|
|
e.Handled = true;
|
|
}
|
|
|
|
if (e.Key == Key.OemMinus || e.Key == Key.Subtract)
|
|
{
|
|
this.viewModel.ZoomOut();
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Listens to changes in the zoom in order to update the user settings.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
|
{
|
|
if (e.PropertyName == "Zoom")
|
|
{
|
|
HelpWindowSettings.Default.HelpZoom = this.viewModel.Zoom;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Saves the user settings.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void HelpDialog_Closed(object sender, System.EventArgs e)
|
|
{
|
|
HelpWindowSettings.Default.Save();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the user setting with window state.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void HelpDialog_StateChanged(object sender, System.EventArgs e)
|
|
{
|
|
HelpWindowSettings.Default.HelpWindowMaximized = this.WindowState == WindowState.Maximized;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the positions from user settings and start monitoring position changes.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void HelpDialog_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
this.StateChanged += new System.EventHandler(this.HelpDialog_StateChanged);
|
|
this.LocationChanged += new System.EventHandler(this.HelpDialog_LocationChanged);
|
|
this.SizeChanged += new SizeChangedEventHandler(this.HelpDialog_SizeChanged);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Saves size changes in user settings.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void HelpDialog_SizeChanged(object sender, SizeChangedEventArgs e)
|
|
{
|
|
HelpWindowSettings.Default.HelpWindowWidth = this.Width;
|
|
HelpWindowSettings.Default.HelpWindowHeight = this.Height;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Saves position changes in user settings.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void HelpDialog_LocationChanged(object sender, System.EventArgs e)
|
|
{
|
|
HelpWindowSettings.Default.HelpWindowTop = this.Top;
|
|
HelpWindowSettings.Default.HelpWindowLeft = this.Left;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called when the settings button is clicked.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void Settings_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
SettingsDialog settings = new SettingsDialog();
|
|
settings.Owner = this;
|
|
|
|
settings.ShowDialog();
|
|
|
|
if (settings.DialogResult == true)
|
|
{
|
|
this.viewModel.HelpBuilder.AddTextToParagraphBuilder();
|
|
this.viewModel.Search();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called when the Previous button is clicked.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void PreviousMatch_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
this.MoveToNextMatch(false);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called when the Next button is clicked.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private void NextMatch_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
this.MoveToNextMatch(true);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Moves to the previous or next match.
|
|
/// </summary>
|
|
/// <param name="forward">True for forward false for backwards.</param>
|
|
private void MoveToNextMatch(bool forward)
|
|
{
|
|
TextPointer caretPosition = this.HelpText.CaretPosition;
|
|
Run nextRun = this.viewModel.Searcher.MoveAndHighlightNextNextMatch(forward, caretPosition);
|
|
this.MoveToRun(nextRun);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Moves to the caret and brings the view to the <paramref name="run"/>.
|
|
/// </summary>
|
|
/// <param name="run">Run to move to.</param>
|
|
private void MoveToRun(Run run)
|
|
{
|
|
if (run == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
run.BringIntoView();
|
|
this.HelpText.CaretPosition = run.ElementEnd;
|
|
this.HelpText.Focus();
|
|
}
|
|
}
|
|
}
|