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

/ViewModel/SystemViewModel.cs

https://github.com/shader/QuickArch
C# | 217 lines | 178 code | 25 blank | 14 comment | 33 complexity | db633a7079fe5d174228cd0bf9ad5af9 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections.ObjectModel;
  6. using System.Collections.Specialized;
  7. using System.Windows.Input;
  8. using System.ComponentModel;
  9. using QuickArch.Model;
  10. using QuickArch.Properties;
  11. using QuickArch.Utilities;
  12. namespace QuickArch.ViewModel
  13. {
  14. public class SystemViewModel : ComponentViewModel
  15. {
  16. ObservableCollection<CommandViewModel> _commands;
  17. bool _isExpanded;
  18. #region Properties
  19. public ObservableCollection<ComponentViewModel> ComponentVMs { get; private set; }
  20. public ObservableCollection<CommandViewModel> Commands
  21. {
  22. get { return _commands; }
  23. }
  24. public event ComponentSelectionHandler ComponentSelected;
  25. public bool IsExpanded
  26. {
  27. get { return _isExpanded; }
  28. set
  29. {
  30. if (value != _isExpanded)
  31. {
  32. _isExpanded = value;
  33. this.OnPropertyChanged("IsExpanded");
  34. }
  35. if (value == true)
  36. {
  37. LoadComponentViews();
  38. }
  39. }
  40. }
  41. public QuickArch.Model.System System
  42. {
  43. get { return _component as QuickArch.Model.System; }
  44. }
  45. #endregion
  46. public SystemViewModel(QuickArch.Model.System system) : base(system)
  47. {
  48. if (system == null)
  49. throw new ArgumentNullException("system");
  50. ComponentVMs = new ObservableCollection<ComponentViewModel>();
  51. if(system.Components.Count > 0)
  52. ComponentVMs.Add(new ComponentPlaceHolder());
  53. ((QuickArch.Model.System)_component).ComponentsChanged += OnComponentsChanged;
  54. _commands = new ObservableCollection<CommandViewModel>
  55. (new CommandViewModel[] {
  56. CommandUtilities.NewCommand("New Subsystem", param => this.AddSubsystem(), Resources.gear),
  57. CommandUtilities.NewCommand("Create New Link", param => this.TestAddConnector(), Resources.line)
  58. });
  59. }
  60. /// <summary>
  61. /// LoadComponentViews creates viewmodels dynamically for components stored in the system when it is expanded.
  62. /// </summary>
  63. void LoadComponentViews()
  64. {
  65. if (ComponentVMs.Count > 0 && ComponentVMs[0] is ComponentPlaceHolder) //place holder implies we need to load components
  66. {
  67. ComponentVMs.Clear();
  68. foreach (var comp in ((QuickArch.Model.System)_component).Components)
  69. {
  70. if (comp is QuickArch.Model.System)
  71. {
  72. ComponentVMs.Add(new SystemViewModel((QuickArch.Model.System)comp));
  73. }
  74. else if (comp is Sequence)
  75. {
  76. ComponentVMs.Add(new SequenceViewModel((Sequence)comp));
  77. }
  78. }
  79. foreach (var vm in ComponentVMs) { vm.PropertyChanged += this.OnComponentPropertyChanged; }
  80. }
  81. }
  82. public void AddSubsystem()
  83. {
  84. AddSubsystem(Resources.DefaultComponentName);
  85. }
  86. public void AddSubsystem(string title)
  87. {
  88. ((QuickArch.Model.System)_component).AddSubsystem(title);
  89. }
  90. public void AddConnector()
  91. {
  92. //((QuickArch.Model.System)_component).AddConnector();
  93. }
  94. public void TestAddConnector()
  95. {
  96. ComponentVMs.Add(new ConnectorViewModel(new Connector()));
  97. }
  98. public void Delete()
  99. {
  100. _component.Delete();
  101. }
  102. #region Event Handling Methods
  103. protected override void OnDispose()
  104. {
  105. foreach (ComponentViewModel compVM in this.ComponentVMs)
  106. compVM.Dispose();
  107. ComponentVMs.Clear();
  108. ComponentVMs.CollectionChanged -= OnCollectionChanged;
  109. }
  110. void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
  111. {
  112. if (e.NewItems != null && e.NewItems.Count != 0)
  113. foreach (ComponentViewModel compVM in e.NewItems)
  114. {
  115. compVM.PropertyChanged += OnComponentPropertyChanged;
  116. }
  117. if (e.OldItems != null && e.OldItems.Count != 0)
  118. foreach (ComponentViewModel compVM in e.OldItems)
  119. compVM.PropertyChanged -= OnComponentPropertyChanged;
  120. }
  121. void OnComponentPropertyChanged(object sender, PropertyChangedEventArgs e)
  122. {
  123. string IsSelected = "IsSelected";
  124. //Make sure that the property name we're referencing is valid (debug only)
  125. (sender as ComponentViewModel).VerifyPropertyName(IsSelected);
  126. }
  127. //doesn't really do anything, can be implemented for other things
  128. void OnComponentsChanged(object sender, NotifyCollectionChangedEventArgs e)
  129. {
  130. if (e.NewItems != null && e.NewItems.Count != 0)
  131. {
  132. foreach (QuickArch.Model.Component comp in e.NewItems)
  133. {
  134. if (comp is QuickArch.Model.System)
  135. {
  136. ComponentVMs.Add(new SystemViewModel((QuickArch.Model.System)comp));
  137. }
  138. else if (comp is Sequence)
  139. {
  140. ComponentVMs.Add(new SequenceViewModel((Sequence)comp));
  141. }
  142. }
  143. }
  144. if (e.OldItems != null && e.OldItems.Count != 0)
  145. {
  146. List<ComponentViewModel> marked = new List<ComponentViewModel>();
  147. foreach (var comp in e.OldItems)
  148. {
  149. foreach (var cvm in ComponentVMs)
  150. {
  151. if (cvm.Component == comp)
  152. {
  153. marked.Add(cvm);
  154. }
  155. }
  156. }
  157. foreach (var cvm in marked)
  158. {
  159. ComponentVMs.Remove(cvm);
  160. cvm.Dispose();
  161. }
  162. }
  163. }
  164. //added to ComponentSelected Event when Link button is clicked
  165. public void StartTempConnector(ComponentViewModel start, EventArgs e)
  166. {
  167. //Create temporary connector for visual display
  168. TemporaryConnectorViewModel temp = new TemporaryConnectorViewModel(start as SystemViewModel);
  169. ComponentVMs.Add(temp);
  170. //remove handler from event to prevent being called again
  171. ComponentSelected -= StartTempConnector;
  172. //create event handler closure to remember start
  173. ComponentSelectionHandler h = null;
  174. h = (end, args) =>
  175. {
  176. //create real connector with remembered start and new end
  177. CreateConnector(start as SystemViewModel, end as SystemViewModel);
  178. //remove h so not called again
  179. ComponentSelected -= h;
  180. //remove temporary connector
  181. ComponentVMs.Remove(temp);
  182. };
  183. //add anonymous event handler "h" to ComponentSelected
  184. ComponentSelected += h;
  185. }
  186. void CreateConnector(SystemViewModel start, SystemViewModel end)
  187. {
  188. System.AddConnector(start.System, end.System);
  189. }
  190. #endregion
  191. }
  192. }