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

/SolutionFramework/HydraPackages/PackageMonitor/MainPage.xaml.cs

#
C# | 352 lines | 284 code | 68 blank | 0 comment | 34 complexity | 2cd57c577691578bb1ef3933ff3b8160 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Documents;
  8. using System.Windows.Input;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Animation;
  11. using System.Windows.Shapes;
  12. using System.Windows.Messaging;
  13. using System.Linq;
  14. using System.Diagnostics;
  15. using System.Text.RegularExpressions;
  16. using Utils.Silverlight;
  17. using System.Windows.Media.Imaging;
  18. using System.Threading.Tasks;
  19. using System.Windows.Threading;
  20. namespace PackageMonitor
  21. {
  22. public partial class MainPage : UserControl
  23. {
  24. private Dictionary<Guid, Package> packages;
  25. private PackageInfo currentPackageInfo;
  26. public MainPage()
  27. {
  28. packages = new Dictionary<Guid, Package>();
  29. InitializeComponent();
  30. }
  31. private void DoDownload(Package package)
  32. {
  33. try
  34. {
  35. var storyboard = new Storyboard();
  36. var animation = new DoubleAnimation();
  37. var cloudPostion = CloudImage.GetRelativePosition(AnimationCanvas);
  38. var cloudCenter = cloudPostion.X + (CloudImage.ActualWidth / 2);
  39. var left = double.NaN;
  40. storyboard.Children.Add(animation);
  41. AnimationCanvas.Children.Add(package);
  42. AnimationCanvas.UpdateLayout();
  43. left = cloudCenter - (package.ActualWidth / 2);
  44. package.SetValue(Canvas.LeftProperty, left);
  45. package.SetValue(Canvas.TopProperty, (double) 0.0);
  46. package.SetValue(Canvas.ZIndexProperty, -1);
  47. animation.From = 0;
  48. animation.To = AnimationCanvas.ActualHeight;
  49. animation.Duration = new Duration(TimeSpan.FromMilliseconds(500));
  50. Storyboard.SetTarget(animation, package);
  51. Storyboard.SetTargetProperty(animation, new PropertyPath(Canvas.TopProperty));
  52. storyboard.Begin();
  53. storyboard.Completed += (sender, e) =>
  54. {
  55. AnimationCanvas.Children.Remove(package);
  56. PackagePanel.Children.Add(package);
  57. };
  58. }
  59. catch (Exception ex)
  60. {
  61. Debugger.Break();
  62. }
  63. }
  64. private void DoLoadFromCache(Package package)
  65. {
  66. try
  67. {
  68. var storyboard = new Storyboard();
  69. var animation = new DoubleAnimation();
  70. var animation2 = new DoubleAnimation();
  71. var cachePostion = Cache.GetRelativePosition(AnimationCanvas);
  72. var cacheCenter = cachePostion.X + (Cache.ActualWidth / 2);
  73. var panelCenterX = PackagePanel.ActualWidth / 2;
  74. var left = double.NaN;
  75. var top = double.NaN;
  76. storyboard.Children.Add(animation);
  77. storyboard.Children.Add(animation2);
  78. AnimationCanvas.Children.Add(package);
  79. AnimationCanvas.UpdateLayout();
  80. left = cacheCenter - (package.ActualWidth / 2);
  81. top = cachePostion.Y;
  82. package.SetValue(Canvas.LeftProperty, left);
  83. package.SetValue(Canvas.TopProperty, top);
  84. package.SetValue(Canvas.ZIndexProperty, -1);
  85. animation.From = left;
  86. animation.To = panelCenterX - (package.ActualWidth / 2);
  87. animation.Duration = new Duration(TimeSpan.FromMilliseconds(300));
  88. animation2.From = top;
  89. animation2.To = AnimationCanvas.ActualHeight;
  90. animation2.BeginTime = TimeSpan.FromMilliseconds(250);
  91. animation2.Duration = new Duration(TimeSpan.FromMilliseconds(200));
  92. Storyboard.SetTarget(animation, package);
  93. Storyboard.SetTargetProperty(animation, new PropertyPath(Canvas.LeftProperty));
  94. Storyboard.SetTarget(animation2, package);
  95. Storyboard.SetTargetProperty(animation2, new PropertyPath(Canvas.TopProperty));
  96. storyboard.Begin();
  97. storyboard.Completed += (sender, e) =>
  98. {
  99. AnimationCanvas.Children.Remove(package);
  100. if (!PackagePanel.Children.Contains(package))
  101. {
  102. PackagePanel.Children.Add(package);
  103. }
  104. };
  105. }
  106. catch (Exception ex)
  107. {
  108. Debugger.Break();
  109. }
  110. }
  111. private void UserControl_Loaded(object sender, RoutedEventArgs e)
  112. {
  113. var receiver = new LocalMessageReceiver("PackageMonitor", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);
  114. var timer = new DispatcherTimer();
  115. timer.Interval = TimeSpan.FromMilliseconds(1);
  116. timer.Tick += (sender2, e2) =>
  117. {
  118. PositionImages();
  119. timer.Stop();
  120. };
  121. timer.Start();
  122. receiver.MessageReceived += (sender2, e2) =>
  123. {
  124. try
  125. {
  126. var message = e2.Message;
  127. var messageParts = message.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
  128. var command = messageParts.First();
  129. if (command == "Ping")
  130. {
  131. StatusBar.Text = "Receiving connection from " + e2.SenderDomain;
  132. packages.Clear();
  133. PackagePanel.Children.Clear();
  134. }
  135. else if (command == "PackageMessage")
  136. {
  137. var packageInfo = messageParts.ElementAt(1);
  138. var action = messageParts.ElementAt(2);
  139. var messageText = string.Empty;
  140. var textBlock = new TextBlock();
  141. var regex = new Regex(@"(?<name>.+?)(?<guid>\{.+?\})");
  142. var match = regex.Match(packageInfo);
  143. var packageName = match.Groups["name"].Value;
  144. var packageGuid = Guid.Parse(match.Groups["guid"].Value);
  145. Package package = null;
  146. if (packages.ContainsKey(packageGuid))
  147. {
  148. package = packages[packageGuid];
  149. }
  150. else
  151. {
  152. package = new Package(packageName, packageGuid.ToString());
  153. packages.Add(packageGuid, package);
  154. package.OnDoubleClick += new OnDoubleClickHandler(Package_OnDoubleClick);
  155. }
  156. if (messageParts.Length > 3)
  157. {
  158. messageText = messageParts.ElementAt(3);
  159. }
  160. package.Messages.Add(new PackageMessage(command, action, messageText));
  161. textBlock.Text = packageInfo + " " + action + " " + messageText;
  162. MessageList.Items.Add(textBlock);
  163. MessageList.UpdateLayout();
  164. MessageList.ScrollIntoView(textBlock);
  165. StatusBar.Text = action;
  166. if (action == "Downloading")
  167. {
  168. DoDownload(package);
  169. }
  170. else if (action == "LoadingFromCache")
  171. {
  172. DoLoadFromCache(package);
  173. }
  174. }
  175. else if (command == "PackageException")
  176. {
  177. var packageInfo = messageParts.ElementAt(1);
  178. var errorMessage = messageParts.ElementAt(2);
  179. var stackTrace = string.Empty;
  180. var textBlock = new TextBlock();
  181. var regex = new Regex(@"(?<name>.+?)(?<guid>\{.+?\})");
  182. var match = regex.Match(packageInfo);
  183. var packageName = match.Groups["name"].Value;
  184. var packageGuid = Guid.Parse(match.Groups["guid"].Value);
  185. var package = packages[packageGuid];
  186. if (messageParts.Length > 3)
  187. {
  188. stackTrace = messageParts.ElementAt(3);
  189. }
  190. textBlock.Text = packageName + " " + errorMessage;
  191. textBlock.Foreground = new SolidColorBrush(Colors.Red);
  192. textBlock.FontWeight = FontWeights.Bold;
  193. package.Messages.Add(new PackageMessage(errorMessage, stackTrace));
  194. MessageList.Items.Add(textBlock);
  195. MessageList.UpdateLayout();
  196. MessageList.ScrollIntoView(textBlock);
  197. }
  198. else if (command == "GeneralMessage")
  199. {
  200. var generalMessage = messageParts.ElementAt(1);
  201. var textBlock = new TextBlock();
  202. textBlock.Text = generalMessage;
  203. MessageList.Items.Add(textBlock);
  204. MessageList.UpdateLayout();
  205. MessageList.ScrollIntoView(textBlock);
  206. }
  207. else if (command == "GeneralException")
  208. {
  209. var errorMessage = messageParts.ElementAt(1);
  210. var stackTrace = messageParts.ElementAt(1);
  211. var textBlock = new TextBlock();
  212. textBlock.Text = errorMessage;
  213. MessageList.Items.Add(textBlock);
  214. MessageList.UpdateLayout();
  215. MessageList.ScrollIntoView(textBlock);
  216. }
  217. }
  218. catch (Exception ex)
  219. {
  220. Debugger.Break();
  221. }
  222. };
  223. try
  224. {
  225. receiver.Listen();
  226. }
  227. catch (Exception ex)
  228. {
  229. StatusBar.Text = ex.Message;
  230. }
  231. }
  232. private void Package_OnDoubleClick(Package package)
  233. {
  234. if (currentPackageInfo != null && AnimationCanvas.Children.Contains(currentPackageInfo))
  235. {
  236. AnimationCanvas.Children.Remove(currentPackageInfo);
  237. }
  238. currentPackageInfo = new PackageInfo(package);
  239. currentPackageInfo.OnClose += (sender, e) =>
  240. {
  241. AnimationCanvas.Children.Remove(e.Value);
  242. };
  243. AnimationCanvas.Children.Add(currentPackageInfo);
  244. AnimationCanvas.UpdateLayout();
  245. currentPackageInfo.SetValue(Canvas.LeftProperty, (AnimationCanvas.ActualWidth / 2) - (currentPackageInfo.ActualWidth / 2));
  246. currentPackageInfo.SetValue(Canvas.TopProperty, (AnimationCanvas.ActualHeight / 2) - (currentPackageInfo.ActualHeight / 2));
  247. }
  248. private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
  249. {
  250. PositionImages();
  251. }
  252. private void CloudImage_Loaded(object sender, RoutedEventArgs e)
  253. {
  254. PositionImages();
  255. }
  256. private void CacheImage_Loaded(object sender, RoutedEventArgs e)
  257. {
  258. PositionImages();
  259. }
  260. private void PositionImages()
  261. {
  262. if (CloudImage.ActualWidth != double.NaN && CloudImage.ActualWidth != 0)
  263. {
  264. var cloudLeft = (this.ActualWidth / 4) - (CloudImage.ActualWidth / 2);
  265. Cloud.SetValue(Canvas.LeftProperty, cloudLeft);
  266. }
  267. var bitmapImage = (BitmapImage)CacheImage.Source;
  268. if (bitmapImage.PixelHeight != double.NaN && bitmapImage.PixelHeight != 0)
  269. {
  270. var listPostion = MessageList.GetRelativePosition(this);
  271. Cache.SetValue(Canvas.LeftProperty, listPostion.X);
  272. Cache.SetValue(Canvas.TopProperty, listPostion.Y - bitmapImage.PixelHeight);
  273. }
  274. }
  275. private void Cloud_Loaded(object sender, RoutedEventArgs e)
  276. {
  277. PositionImages();
  278. }
  279. private void Cache_Loaded(object sender, RoutedEventArgs e)
  280. {
  281. PositionImages();
  282. }
  283. }
  284. }