MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System.Globalization;5using System.Management.Automation;6using System.Windows;7using System.Windows.Documents;8using System.Windows.Input;9 10using Microsoft.Management.UI.Internal;11 12namespace Microsoft.Management.UI13{14 /// <summary>15 /// A window displaying help content and allowing search.16 /// </summary>17 public partial class HelpWindow : Window18 {19 /// <summary>20 /// Minimum zoom in the slider.21 /// </summary>22 public static double MinimumZoom23 {24 get25 {26 return 20;27 }28 }29 30 /// <summary>31 /// Maximum zoom in the slider.32 /// </summary>33 public static double MaximumZoom34 {35 get36 {37 return 300;38 }39 }40 41 /// <summary>42 /// Zoom interval.43 /// </summary>44 public static double ZoomInterval45 {46 get47 {48 return 10;49 }50 }51 52 /// <summary>53 /// The ViewModel for the dialog.54 /// </summary>55 private readonly HelpViewModel viewModel;56 57 /// <summary>58 /// Initializes a new instance of the HelpWindow class.59 /// </summary>60 /// <param name="helpObject">The object with help information.</param>61 public HelpWindow(PSObject helpObject)62 {63 InitializeComponent();64 this.viewModel = new HelpViewModel(helpObject, this.DocumentParagraph);65 CommonHelper.SetStartingPositionAndSize(66 this,67 HelpWindowSettings.Default.HelpWindowTop,68 HelpWindowSettings.Default.HelpWindowLeft,69 HelpWindowSettings.Default.HelpWindowWidth,70 HelpWindowSettings.Default.HelpWindowHeight,71 double.Parse((string)HelpWindowSettings.Default.Properties["HelpWindowWidth"].DefaultValue, CultureInfo.InvariantCulture.NumberFormat),72 double.Parse((string)HelpWindowSettings.Default.Properties["HelpWindowHeight"].DefaultValue, CultureInfo.InvariantCulture.NumberFormat),73 HelpWindowSettings.Default.HelpWindowMaximized);74 75 this.ReadZoomUserSetting();76 77 this.viewModel.PropertyChanged += this.ViewModel_PropertyChanged;78 this.DataContext = this.viewModel;79 80 this.Loaded += this.HelpDialog_Loaded;81 this.Closed += this.HelpDialog_Closed;82 }83 84 /// <summary>85 /// Handles the mouse wheel to zoom in/out.86 /// </summary>87 /// <param name="e">Event arguments.</param>88 protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)89 {90 if (Keyboard.Modifiers != ModifierKeys.Control)91 {92 return;93 }94 95 if (e.Delta > 0)96 {97 this.viewModel.ZoomIn();98 e.Handled = true;99 }100 else101 {102 this.viewModel.ZoomOut();103 e.Handled = true;104 }105 }106 107 /// <summary>108 /// Handles key down to fix the Page/Douwn going to end of help issue109 /// And to implement some additional shortcuts like Ctrl+F and ZoomIn/ZoomOut.110 /// </summary>111 /// <param name="e">Event arguments.</param>112 protected override void OnPreviewKeyDown(KeyEventArgs e)113 {114 if (Keyboard.Modifiers == ModifierKeys.None)115 {116 if (e.Key == Key.PageUp)117 {118 this.Scroll.PageUp();119 e.Handled = true;120 return;121 }122 123 if (e.Key == Key.PageDown)124 {125 this.Scroll.PageDown();126 e.Handled = true;127 return;128 }129 }130 131 if (Keyboard.Modifiers == ModifierKeys.Control)132 {133 this.HandleZoomInAndZoomOut(e);134 if (e.Handled)135 {136 return;137 }138 139 if (e.Key == Key.F)140 {141 this.Find.Focus();142 e.Handled = true;143 return;144 }145 }146 147 if (Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift))148 {149 this.HandleZoomInAndZoomOut(e);150 }151 }152 153 /// <summary>154 /// Reads the zoom part of the user settings.155 /// </summary>156 private void ReadZoomUserSetting()157 {158 if (HelpWindowSettings.Default.HelpZoom < HelpWindow.MinimumZoom || HelpWindowSettings.Default.HelpZoom > HelpWindow.MaximumZoom)159 {160 HelpWindowSettings.Default.HelpZoom = 100;161 }162 163 this.viewModel.Zoom = HelpWindowSettings.Default.HelpZoom;164 }165 166 /// <summary>167 /// Handles Zoom in and Zoom out keys.168 /// </summary>169 /// <param name="e">Event arguments.</param>170 private void HandleZoomInAndZoomOut(KeyEventArgs e)171 {172 if (e.Key == Key.OemPlus || e.Key == Key.Add)173 {174 this.viewModel.ZoomIn();175 e.Handled = true;176 }177 178 if (e.Key == Key.OemMinus || e.Key == Key.Subtract)179 {180 this.viewModel.ZoomOut();181 e.Handled = true;182 }183 }184 185 /// <summary>186 /// Listens to changes in the zoom in order to update the user settings.187 /// </summary>188 /// <param name="sender">Event sender.</param>189 /// <param name="e">Event arguments.</param>190 private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)191 {192 if (e.PropertyName == "Zoom")193 {194 HelpWindowSettings.Default.HelpZoom = this.viewModel.Zoom;195 }196 }197 198 /// <summary>199 /// Saves the user settings.200 /// </summary>201 /// <param name="sender">Event sender.</param>202 /// <param name="e">Event arguments.</param>203 private void HelpDialog_Closed(object sender, System.EventArgs e)204 {205 HelpWindowSettings.Default.Save();206 }207 208 /// <summary>209 /// Updates the user setting with window state.210 /// </summary>211 /// <param name="sender">Event sender.</param>212 /// <param name="e">Event arguments.</param>213 private void HelpDialog_StateChanged(object sender, System.EventArgs e)214 {215 HelpWindowSettings.Default.HelpWindowMaximized = this.WindowState == WindowState.Maximized;216 }217 218 /// <summary>219 /// Sets the positions from user settings and start monitoring position changes.220 /// </summary>221 /// <param name="sender">Event sender.</param>222 /// <param name="e">Event arguments.</param>223 private void HelpDialog_Loaded(object sender, RoutedEventArgs e)224 {225 this.StateChanged += this.HelpDialog_StateChanged;226 this.LocationChanged += this.HelpDialog_LocationChanged;227 this.SizeChanged += this.HelpDialog_SizeChanged;228 }229 230 /// <summary>231 /// Saves size changes in user settings.232 /// </summary>233 /// <param name="sender">Event sender.</param>234 /// <param name="e">Event arguments.</param>235 private void HelpDialog_SizeChanged(object sender, SizeChangedEventArgs e)236 {237 HelpWindowSettings.Default.HelpWindowWidth = this.Width;238 HelpWindowSettings.Default.HelpWindowHeight = this.Height;239 }240 241 /// <summary>242 /// Saves position changes in user settings.243 /// </summary>244 /// <param name="sender">Event sender.</param>245 /// <param name="e">Event arguments.</param>246 private void HelpDialog_LocationChanged(object sender, System.EventArgs e)247 {248 HelpWindowSettings.Default.HelpWindowTop = this.Top;249 HelpWindowSettings.Default.HelpWindowLeft = this.Left;250 }251 252 /// <summary>253 /// Called when the settings button is clicked.254 /// </summary>255 /// <param name="sender">Event sender.</param>256 /// <param name="e">Event arguments.</param>257 private void Settings_Click(object sender, RoutedEventArgs e)258 {259 SettingsDialog settings = new SettingsDialog();260 settings.Owner = this;261 262 settings.ShowDialog();263 264 if (settings.DialogResult == true)265 {266 this.viewModel.HelpBuilder.AddTextToParagraphBuilder();267 this.viewModel.Search();268 }269 }270 271 /// <summary>272 /// Called when the Previous button is clicked.273 /// </summary>274 /// <param name="sender">Event sender.</param>275 /// <param name="e">Event arguments.</param>276 private void PreviousMatch_Click(object sender, RoutedEventArgs e)277 {278 this.MoveToNextMatch(false);279 }280 281 /// <summary>282 /// Called when the Next button is clicked.283 /// </summary>284 /// <param name="sender">Event sender.</param>285 /// <param name="e">Event arguments.</param>286 private void NextMatch_Click(object sender, RoutedEventArgs e)287 {288 this.MoveToNextMatch(true);289 }290 291 /// <summary>292 /// Moves to the previous or next match.293 /// </summary>294 /// <param name="forward">True for forward false for backwards.</param>295 private void MoveToNextMatch(bool forward)296 {297 TextPointer caretPosition = this.HelpText.CaretPosition;298 Run nextRun = this.viewModel.Searcher.MoveAndHighlightNextNextMatch(forward, caretPosition);299 this.MoveToRun(nextRun);300 }301 302 /// <summary>303 /// Moves to the caret and brings the view to the <paramref name="run"/>.304 /// </summary>305 /// <param name="run">Run to move to.</param>306 private void MoveToRun(Run run)307 {308 if (run == null)309 {310 return;311 }312 313 run.BringIntoView();314 this.HelpText.CaretPosition = run.ElementEnd;315 this.HelpText.Focus();316 }317 }318}319 