PageRenderTime 122ms CodeModel.GetById 28ms RepoModel.GetById 3ms app.codeStats 0ms

/View/SystemDiagramView.xaml.cs

https://github.com/shader/QuickArch
C# | 251 lines | 214 code | 24 blank | 13 comment | 35 complexity | 49964add5a39d24b52daf6f1830d2d48 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14. using System.Collections.ObjectModel;
  15. using QuickArch.ViewModel;
  16. namespace QuickArch.View
  17. {
  18. /// <summary>
  19. /// Interaction logic for ComponentDiagramView.xaml
  20. /// </summary>
  21. public partial class SystemDiagramView : UserControl
  22. {
  23. AdornerLayer aLayer;
  24. bool _isDown, _isDragging;
  25. bool selected = false;
  26. bool _isAddNewLink, _isLinkStarted = false;
  27. TemporaryConnectorViewModel _tempLink;
  28. SystemBasicView _linkedSystem;
  29. UIElement selectedElement = null;
  30. LineGeometry _link;
  31. Point _startPoint, _originalPoint;
  32. private Canvas myCanvas;
  33. private ObservableCollection<ComponentViewModel> _components;
  34. SystemViewModel _context;
  35. public SystemDiagramView()
  36. {
  37. InitializeComponent();
  38. _components = new ObservableCollection<ComponentViewModel>();
  39. }
  40. private void myCanvas_Loaded(object sender, RoutedEventArgs e)
  41. {
  42. myCanvas = sender as Canvas;
  43. myCanvas.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(myCanvas_PreviewMouseLeftButtonDown);
  44. myCanvas.PreviewMouseLeftButtonUp += new MouseButtonEventHandler(DragFinishedMouseHandler);
  45. myCanvas.PreviewMouseMove += new MouseEventHandler(myCanvas_PreviewMouseMove);
  46. }
  47. private void Diagram_Created(object sender, RoutedEventArgs e)
  48. {
  49. this.MouseLeftButtonDown += new MouseButtonEventHandler(Diagram_MouseLeftButtonDown);
  50. this.MouseLeftButtonUp += new MouseButtonEventHandler(DragFinishedMouseHandler);
  51. this.MouseMove += new MouseEventHandler(Diagram_MouseMove);
  52. this.MouseLeave += new MouseEventHandler(Diagram_MouseLeave);
  53. _context = DataContext as SystemViewModel;
  54. }
  55. // Handler for drag stopping on leaving the window
  56. void Diagram_MouseLeave(object sender, MouseEventArgs e)
  57. {
  58. StopDragging();
  59. e.Handled = true;
  60. }
  61. // Handler for drag stopping on user choise
  62. void DragFinishedMouseHandler(object sender, MouseButtonEventArgs e)
  63. {
  64. if(e.Source.GetType() == typeof(SystemBasicView))
  65. {
  66. if (_tempLink != null)
  67. {
  68. SystemBasicView targetSystem = e.Source as SystemBasicView;
  69. SystemViewModel s = (targetSystem.DataContext) as SystemViewModel;
  70. _tempLink.End = s;
  71. _tempLink.EndPosition = e.GetPosition(this);
  72. Mouse.OverrideCursor = null;
  73. _isAddNewLink = false;
  74. _isLinkStarted = false;
  75. _context.ComponentVMs.Add(_tempLink);
  76. _tempLink = null;
  77. e.Handled = true;
  78. }
  79. }
  80. StopDragging();
  81. e.Handled = true;
  82. }
  83. // Method for stopping dragging
  84. private void StopDragging()
  85. {
  86. if (_isDown)
  87. {
  88. _isDown = false;
  89. _isDragging = false;
  90. }
  91. }
  92. // Hanler for providing drag operation with selected element
  93. void Diagram_MouseMove(object sender, MouseEventArgs e)
  94. {
  95. if (_isDown)
  96. {
  97. if ((_isDragging == false) &&
  98. ((Math.Abs(e.GetPosition(myCanvas).X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance) ||
  99. (Math.Abs(e.GetPosition(myCanvas).Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)))
  100. _isDragging = true;
  101. if (_isDragging)
  102. {
  103. Point position = Mouse.GetPosition(myCanvas);
  104. var newX = position.X - (_startPoint.X - _originalPoint.X);
  105. var newY = position.Y - (_startPoint.Y - _originalPoint.Y);
  106. selectedElement.RenderTransform = new TranslateTransform(newX, newY);
  107. }
  108. }
  109. }
  110. // Handler for clearing element selection, adorner removal
  111. void Diagram_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  112. {
  113. if (selected)
  114. {
  115. selected = false;
  116. if (selectedElement != null)
  117. {
  118. aLayer.Remove(aLayer.GetAdorners(selectedElement)[0]);
  119. selectedElement = null;
  120. }
  121. }
  122. }
  123. // Handler for element selection on the canvas providing resizing adorner
  124. void myCanvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  125. {
  126. // Remove selection on clicking anywhere the window
  127. if (selected)
  128. {
  129. selected = false;
  130. if (selectedElement != null && aLayer.GetAdorners(selectedElement) != null)
  131. {
  132. // Remove the adorner from the selected element
  133. aLayer.Remove(aLayer.GetAdorners(selectedElement)[0]);
  134. selectedElement = null;
  135. }
  136. }
  137. //If adding a new link
  138. if (e.Source.GetType() == typeof(SystemBasicView))
  139. {
  140. if (e.Source.GetType() == typeof(SystemBasicView) && _isAddNewLink)
  141. {
  142. if (!_isLinkStarted)
  143. {
  144. if (_link == null || _link.EndPoint != _link.StartPoint)
  145. {
  146. _isLinkStarted = true;
  147. _linkedSystem = e.Source as SystemBasicView;
  148. SystemViewModel svm = (_linkedSystem.DataContext) as SystemViewModel;
  149. _tempLink = new TemporaryConnectorViewModel(svm);
  150. _tempLink.StartPostion = _linkedSystem.Position;
  151. e.Handled = true;
  152. }
  153. }
  154. }
  155. // If a componentView is selected, add adorner layer to it
  156. else
  157. {
  158. _isDown = true;
  159. _startPoint = e.GetPosition(myCanvas);
  160. selectedElement = e.Source as UIElement;
  161. _originalPoint = selectedElement.TranslatePoint(new Point(0, 0), myCanvas);
  162. aLayer = AdornerLayer.GetAdornerLayer(selectedElement);
  163. aLayer.Add(new ResizingAdorner(selectedElement, myCanvas));
  164. selected = true;
  165. e.Handled = true;
  166. }
  167. }
  168. }
  169. void myCanvas_PreviewMouseMove(object sender, MouseEventArgs e)
  170. {
  171. if (_isAddNewLink && _isLinkStarted)
  172. e.Handled = true;
  173. }
  174. void myCanvas_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  175. {
  176. }
  177. public void NewLinkButton_Click(object sender, RoutedEventArgs e)
  178. {
  179. _isAddNewLink = true;
  180. Mouse.OverrideCursor = Cursors.Cross;
  181. }
  182. private void Components_Updated(object sender, DataTransferEventArgs e)
  183. {
  184. ComponentViewModel s = sender as ComponentViewModel;
  185. if (s != null)
  186. {
  187. _components.Add(s);
  188. }
  189. }
  190. private void ContextMenu_Opened(object sender, RoutedEventArgs e)
  191. {
  192. ContextMenu menu = sender as ContextMenu;
  193. menu.DataContext = DataContext;
  194. }
  195. }
  196. #region DataTemplateSelectorClass
  197. public class ItemsControlTemplateSelector : DataTemplateSelector
  198. {
  199. private DataTemplate _componentTemplate = null;
  200. public DataTemplate ComponentTemplate
  201. {
  202. get { return _componentTemplate; }
  203. set { _componentTemplate = value; }
  204. }
  205. private DataTemplate _tempConnectorTemplate = null;
  206. public DataTemplate TempConnectorTemplate
  207. {
  208. get { return _tempConnectorTemplate; }
  209. set { _tempConnectorTemplate = value; }
  210. }
  211. public override DataTemplate SelectTemplate(object item,
  212. DependencyObject container)
  213. {
  214. if (item is ComponentViewModel)
  215. {
  216. if (item is SystemViewModel)
  217. return _componentTemplate;
  218. if (item is TemporaryConnectorViewModel)
  219. return _tempConnectorTemplate;
  220. if (item is ConnectorViewModel)
  221. return _tempConnectorTemplate;
  222. }
  223. return base.SelectTemplate(item, container);
  224. }
  225. }
  226. #endregion
  227. }