PageRenderTime 52ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/src/MarkPad/ShellView.xaml.cs

https://github.com/bcott/DownmarkerWPF
C# | 184 lines | 151 code | 31 blank | 2 comment | 37 complexity | 8b0f9747ea0eb18eff0f20eb63177c58 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Input;
  6. using MarkPad.Document.Commands;
  7. using MarkPad.Framework;
  8. using MarkPad.Plugins;
  9. namespace MarkPad
  10. {
  11. public partial class ShellView
  12. {
  13. bool ignoreNextMouseMove;
  14. readonly IList<ICanCreateNewPage> canCreateNewPagePlugins;
  15. readonly IList<ICanSavePage> canSavePagePlugins;
  16. public ShellView(IEnumerable<ICanCreateNewPage> canCreateNewPagePlugins, IEnumerable<ICanSavePage> canSavePagePlugins)
  17. {
  18. this.canCreateNewPagePlugins = canCreateNewPagePlugins.ToList();
  19. this.canSavePagePlugins = canSavePagePlugins.ToList();
  20. CommandBindings.Add(new CommandBinding(ShellCommands.Esc, (x, y) => PressedEsc()));
  21. CommandBindings.Add(new CommandBinding(ShellCommands.Search, (x, y) => Search()));
  22. InitializeComponent();
  23. UpdatePlugins();
  24. }
  25. void UpdatePlugins()
  26. {
  27. CreateNewPageHook.Children.Clear();
  28. foreach (var plugin in canCreateNewPagePlugins.Where(p => p.Settings.IsEnabled))
  29. {
  30. var button = new Button { Content = plugin.CreateNewPageLabel.ToUpper(), Tag = plugin };
  31. var capturedPlugin = plugin;
  32. button.Click += (o, e) =>
  33. {
  34. var text = capturedPlugin.CreateNewPage();
  35. (DataContext as ShellViewModel).ExecuteSafely(vm => vm.NewDocument(text));
  36. };
  37. CreateNewPageHook.Children.Add(button);
  38. }
  39. SavePageHook.Children.Clear();
  40. foreach (var plugin in canSavePagePlugins.Where(p => p.Settings.IsEnabled))
  41. {
  42. var button = new Button { Content = plugin.SavePageLabel.ToUpper(), Tag = plugin };
  43. var capturedPlugin = plugin;
  44. button.Click += (sender, args) => (DataContext as ShellViewModel).ExecuteSafely(vm =>
  45. {
  46. if (vm.ActiveDocumentViewModel == null) return;
  47. capturedPlugin.SavePage(vm.ActiveDocumentViewModel.MarkpadDocument);
  48. });
  49. SavePageHook.Children.Add(button);
  50. }
  51. }
  52. bool DocumentIsOpen { get { return (DataContext as ShellViewModel).Evaluate(vm => vm.MDI.ActiveItem != null); } }
  53. void DragMoveWindow(object sender, MouseButtonEventArgs e)
  54. {
  55. if (e.MiddleButton == MouseButtonState.Pressed) return;
  56. if (e.RightButton == MouseButtonState.Pressed) return;
  57. if (e.LeftButton != MouseButtonState.Pressed) return;
  58. if (DocumentIsOpen && !Header.IsMouseOver) return;
  59. if (WindowState == WindowState.Maximized && e.ClickCount != 2) return;
  60. if (e.ClickCount == 2)
  61. {
  62. WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
  63. ignoreNextMouseMove = true;
  64. return;
  65. }
  66. DragMove();
  67. }
  68. void MouseMoveWindow(object sender, MouseEventArgs e)
  69. {
  70. if (ignoreNextMouseMove)
  71. {
  72. ignoreNextMouseMove = false;
  73. return;
  74. }
  75. if (WindowState != WindowState.Maximized) return;
  76. if (e.MiddleButton == MouseButtonState.Pressed) return;
  77. if (e.RightButton == MouseButtonState.Pressed) return;
  78. if (e.LeftButton != MouseButtonState.Pressed) return;
  79. if (!Header.IsMouseOver) return;
  80. // Calculate correct left coordinate for multi-screen system
  81. var mouseX = PointToScreen(Mouse.GetPosition(this)).X;
  82. var width = RestoreBounds.Width;
  83. var left = mouseX - width / 2;
  84. if (left < 0) left = 0;
  85. // Align left edge to fit the screen
  86. var virtualScreenWidth = SystemParameters.VirtualScreenWidth;
  87. if (left + width > virtualScreenWidth) left = virtualScreenWidth - width;
  88. Top = 0;
  89. Left = left;
  90. WindowState = WindowState.Normal;
  91. DragMove();
  92. }
  93. void ToggleMaximized()
  94. {
  95. WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
  96. }
  97. void ShellViewMouseDoubleClick(object sender, MouseButtonEventArgs e)
  98. {
  99. e.Handled = true;
  100. if (DocumentIsOpen && !Header.IsMouseOver) return;
  101. ToggleMaximized();
  102. ignoreNextMouseMove = true;
  103. }
  104. void ButtonMinimiseOnClick(object sender, RoutedEventArgs e)
  105. {
  106. WindowState = WindowState.Minimized;
  107. }
  108. void ButtonMaxRestoreOnClick(object sender, RoutedEventArgs e)
  109. {
  110. ToggleMaximized();
  111. }
  112. protected override void OnStateChanged(System.EventArgs e)
  113. {
  114. RefreshMaximiseIconState();
  115. base.OnStateChanged(e);
  116. }
  117. void RefreshMaximiseIconState()
  118. {
  119. if (WindowState == WindowState.Normal)
  120. {
  121. MaxRestore.Content = "1";
  122. MaxRestore.SetResourceReference(ToolTipProperty, "WindowCommandsMaximiseToolTip");
  123. }
  124. else
  125. {
  126. MaxRestore.Content = "2";
  127. MaxRestore.SetResourceReference(ToolTipProperty, "WindowCommandsRestoreToolTip");
  128. }
  129. }
  130. void WindowDragOver(object sender, DragEventArgs e)
  131. {
  132. var isFileDrop = e.Data.GetDataPresent(DataFormats.FileDrop);
  133. e.Effects = isFileDrop ? DragDropEffects.Move : DragDropEffects.None;
  134. e.Handled = true;
  135. }
  136. private void PressedEsc()
  137. {
  138. if (SearchPanel.IsVisible)
  139. {
  140. SearchPanel.Visibility = Visibility.Collapsed;
  141. }
  142. }
  143. private void Search()
  144. {
  145. if (!SearchPanel.IsVisible)
  146. {
  147. SearchPanel.Visibility = Visibility.Visible;
  148. }
  149. SearchTextBox.Focus();
  150. SearchTextBox.SelectAll();
  151. }
  152. }
  153. }