PageRenderTime 35ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/Main/src/DynamicDataDisplay/Charts/Navigation/Navigation/KeyboardNavigation.cs

#
C# | 300 lines | 229 code | 66 blank | 5 comment | 1 complexity | 02b3942a28154930f6e520fde56e0b21 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System.Windows;
  2. using System.Windows.Input;
  3. using System.Windows.Media;
  4. using Microsoft.Win32;
  5. namespace Microsoft.Research.DynamicDataDisplay.Navigation
  6. {
  7. /// <summary>Provides keyboard navigation around viewport</summary>
  8. public class KeyboardNavigation : NavigationBase
  9. {
  10. public KeyboardNavigation()
  11. {
  12. Focusable = true;
  13. Loaded += KeyboardNavigation_Loaded;
  14. }
  15. private void KeyboardNavigation_Loaded(object sender, RoutedEventArgs e)
  16. {
  17. Keyboard.Focus(this);
  18. InitCommands();
  19. }
  20. public void InitCommands()
  21. {
  22. var zoomWithParamCommandBinding = new CommandBinding(
  23. ChartCommands.ZoomWithParameter,
  24. ZoomWithParamExecute,
  25. ZoomWithParamCanExecute);
  26. Plotter2D.CommandBindings.Add(zoomWithParamCommandBinding);
  27. var zoomInCommandBinding = new CommandBinding(
  28. ChartCommands.ZoomIn,
  29. ZoomInExecute,
  30. ZoomInCanExecute);
  31. Plotter2D.CommandBindings.Add(zoomInCommandBinding);
  32. var zoomOutCommandBinding = new CommandBinding(
  33. ChartCommands.ZoomOut,
  34. ZoomOutExecute,
  35. ZoomOutCanExecute);
  36. Plotter2D.CommandBindings.Add(zoomOutCommandBinding);
  37. var fitToViewCommandBinding = new CommandBinding(
  38. ChartCommands.FitToView,
  39. FitToViewExecute,
  40. FitToViewCanExecute);
  41. Plotter2D.CommandBindings.Add(fitToViewCommandBinding);
  42. var ScrollLeftCommandBinding = new CommandBinding(
  43. ChartCommands.ScrollLeft,
  44. ScrollLeftExecute,
  45. ScrollLeftCanExecute);
  46. Plotter2D.CommandBindings.Add(ScrollLeftCommandBinding);
  47. var ScrollRightCommandBinding = new CommandBinding(
  48. ChartCommands.ScrollRight,
  49. ScrollRightExecute,
  50. ScrollRightCanExecute);
  51. Plotter2D.CommandBindings.Add(ScrollRightCommandBinding);
  52. var ScrollUpCommandBinding = new CommandBinding(
  53. ChartCommands.ScrollUp,
  54. ScrollUpExecute,
  55. ScrollUpCanExecute);
  56. Plotter2D.CommandBindings.Add(ScrollUpCommandBinding);
  57. var ScrollDownCommandBinding = new CommandBinding(
  58. ChartCommands.ScrollDown,
  59. ScrollDownExecute,
  60. ScrollDownCanExecute);
  61. Plotter2D.CommandBindings.Add(ScrollDownCommandBinding);
  62. var SaveScreenshotCommandBinding = new CommandBinding(
  63. ChartCommands.SaveScreenshot,
  64. SaveScreenshotExecute,
  65. SaveScreenshotCanExecute);
  66. Plotter2D.CommandBindings.Add(SaveScreenshotCommandBinding);
  67. var CopyScreenshotCommandBinding = new CommandBinding(
  68. ChartCommands.CopyScreenshot,
  69. CopyScreenshotExecute,
  70. CopyScreenshotCanExecute);
  71. Plotter2D.CommandBindings.Add(CopyScreenshotCommandBinding);
  72. var ShowHelpCommandBinding = new CommandBinding(
  73. ChartCommands.ShowHelp,
  74. ShowHelpExecute,
  75. ShowHelpCanExecute);
  76. Plotter2D.CommandBindings.Add(ShowHelpCommandBinding);
  77. }
  78. #region Zoom With param
  79. private void ZoomWithParamExecute(object target, ExecutedRoutedEventArgs e)
  80. {
  81. // TODO: add working code
  82. //double zoomParam = (double)e.Parameter;
  83. //Plotter2d.ZoomVisible(zoomParam);
  84. e.Handled = true;
  85. }
  86. private void ZoomWithParamCanExecute(object target, CanExecuteRoutedEventArgs e)
  87. {
  88. e.CanExecute = true;
  89. }
  90. #endregion
  91. #region Zoom in
  92. private void ZoomInExecute(object target, ExecutedRoutedEventArgs e)
  93. {
  94. Viewport.Zoom(0.9);
  95. e.Handled = true;
  96. }
  97. private void ZoomInCanExecute(object target, CanExecuteRoutedEventArgs e)
  98. {
  99. e.CanExecute = true;
  100. }
  101. #endregion
  102. #region Zoom out
  103. private void ZoomOutExecute(object target, ExecutedRoutedEventArgs e)
  104. {
  105. Viewport.Zoom(1.1);
  106. e.Handled = true;
  107. }
  108. private void ZoomOutCanExecute(object target, CanExecuteRoutedEventArgs e)
  109. {
  110. e.CanExecute = true;
  111. }
  112. #endregion
  113. #region Fit to view
  114. private void FitToViewExecute(object target, ExecutedRoutedEventArgs e)
  115. {
  116. Viewport.FitToView();
  117. e.Handled = true;
  118. }
  119. private void FitToViewCanExecute(object target, CanExecuteRoutedEventArgs e)
  120. {
  121. e.CanExecute = true;
  122. }
  123. #endregion
  124. #region Scroll
  125. private double scrollCoeff = 0.05;
  126. private void ScrollVisibleProportionally(double xShiftCoeff, double yShiftCoeff)
  127. {
  128. Rect visible = Viewport.Visible;
  129. double width = visible.Width;
  130. double height = visible.Height;
  131. visible.Offset(xShiftCoeff * width, yShiftCoeff * height);
  132. Viewport.Visible = visible;
  133. }
  134. #region ScrollLeft
  135. private void ScrollLeftExecute(object target, ExecutedRoutedEventArgs e)
  136. {
  137. ScrollVisibleProportionally(scrollCoeff, 0);
  138. e.Handled = true;
  139. }
  140. private void ScrollLeftCanExecute(object target, CanExecuteRoutedEventArgs e)
  141. {
  142. e.CanExecute = true;
  143. }
  144. #endregion
  145. #region ScrollRight
  146. private void ScrollRightExecute(object target, ExecutedRoutedEventArgs e)
  147. {
  148. ScrollVisibleProportionally(-scrollCoeff, 0);
  149. e.Handled = true;
  150. }
  151. private void ScrollRightCanExecute(object target, CanExecuteRoutedEventArgs e)
  152. {
  153. e.CanExecute = true;
  154. }
  155. #endregion
  156. #region ScrollUp
  157. private void ScrollUpExecute(object target, ExecutedRoutedEventArgs e)
  158. {
  159. ScrollVisibleProportionally(0, -scrollCoeff);
  160. e.Handled = true;
  161. }
  162. private void ScrollUpCanExecute(object target, CanExecuteRoutedEventArgs e)
  163. {
  164. e.CanExecute = true;
  165. }
  166. #endregion
  167. #region ScrollDown
  168. private void ScrollDownExecute(object target, ExecutedRoutedEventArgs e)
  169. {
  170. ScrollVisibleProportionally(0, scrollCoeff);
  171. e.Handled = true;
  172. }
  173. private void ScrollDownCanExecute(object target, CanExecuteRoutedEventArgs e)
  174. {
  175. e.CanExecute = true;
  176. }
  177. #endregion
  178. #endregion
  179. #region SaveScreenshot
  180. private void SaveScreenshotExecute(object target, ExecutedRoutedEventArgs e)
  181. {
  182. SaveFileDialog dlg = new SaveFileDialog();
  183. dlg.Filter = "JPEG(*.jpg)|*.jpg|BMP(*.bmp)|*.bmp|GIF(*.gif)|.gif|All files (*.*)|*.*";
  184. dlg.FilterIndex = 1;
  185. if (dlg.ShowDialog().GetValueOrDefault(false))
  186. {
  187. string filePath = dlg.FileName;
  188. Plotter2D.SaveScreenshot(filePath);
  189. e.Handled = true;
  190. }
  191. }
  192. private void SaveScreenshotCanExecute(object target, CanExecuteRoutedEventArgs e)
  193. {
  194. e.CanExecute = true;
  195. }
  196. #endregion
  197. #region CopyScreenshot
  198. private void CopyScreenshotExecute(object target, ExecutedRoutedEventArgs e)
  199. {
  200. Plotter2D.CopyScreenshotToClipboard();
  201. e.Handled = true;
  202. }
  203. private void CopyScreenshotCanExecute(object target, CanExecuteRoutedEventArgs e)
  204. {
  205. e.CanExecute = true;
  206. }
  207. #endregion
  208. #region ShowHelp
  209. private void ShowHelpExecute(object target, ExecutedRoutedEventArgs e)
  210. {
  211. string helpText =
  212. @"Dynamic Data Display is in ""Auto Fit"" mode by default.
  213. By using the mouse you can manually select an area to display:
  214. Mouse wheel, '+' and '-' Zoom in/Zoom out
  215. Mouse drag or arrow keys Pan the display area
  216. Ctrl + Mouse drag Select an area to zoom in
  217. Shift + Mouse drag Select an area with fixed aspect ratio
  218. Home Fit to view
  219. F11 Copy chart to clipboard";
  220. MessageBox.Show(helpText, "Quick Help", MessageBoxButton.OK, MessageBoxImage.Information);
  221. e.Handled = true;
  222. }
  223. private void ShowHelpCanExecute(object target, CanExecuteRoutedEventArgs e)
  224. {
  225. e.CanExecute = true;
  226. }
  227. #endregion
  228. protected override void OnRenderCore(DrawingContext dc, RenderState state)
  229. {
  230. // do nothing here
  231. }
  232. }
  233. }