/branches/0.3.x/src/Html.Downloader/Forms/AddLinksForm.cs

# · C# · 236 lines · 199 code · 37 blank · 0 comment · 6 complexity · 5cf76e07c7cd04eb1a72bde0b7e8f5ae MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Windows.Forms;
  10. using Html.Downloader.Engine;
  11. using Html.Downloader.Extensions;
  12. using Melon.Commons.Aspects.WinForms;
  13. using Melon.Commons.Aspects.WinForms.Asynchronousity;
  14. using Melon.Commons.Aspects.WinForms.ExceptionHandling;
  15. using Melon.Commons.Aspects.WinForms.Synchronization;
  16. namespace Html.Downloader.Forms
  17. {
  18. public partial class AddLinksForm : Form, IExceptionHandler, IAsynchronous
  19. {
  20. #region Private Fields
  21. private ILinkPreparationService service;
  22. #endregion
  23. #region Constructors
  24. public AddLinksForm(ILinkPreparationService service)
  25. {
  26. this.service = service;
  27. this.InitializeComponent();
  28. }
  29. #endregion
  30. [ExceptionHandled]
  31. private void OnQueueRequest(object sender, EventArgs e)
  32. {
  33. var query = from item in this.lvLinks.Items.OfType<ListViewItem>()
  34. where item.Checked && item.Tag is DownloadItem
  35. select item.Tag as DownloadItem;
  36. this.service.Queue(query.ToArray());
  37. }
  38. private void OnManualLinksAreaChanged(object sender, EventArgs e)
  39. {
  40. this.btnManualFind.Enabled = this.tbLinkPasteArea.TextLength > 0;
  41. }
  42. private void OnFinalLinkChecked(object sender, ItemCheckedEventArgs e)
  43. {
  44. this.OnFinalLinksContentChanged();
  45. }
  46. private void OnFinalLinksContentChanged()
  47. {
  48. var unrecognized = from item in this.lvLinks.Items.OfType<ListViewItem>()
  49. where item.Tag is DownloadLink
  50. select item;
  51. var selectedAndRecognized = from item in this.lvLinks.Items.OfType<ListViewItem>()
  52. where item.Checked && item.Tag is DownloadItem
  53. select item;
  54. this.btnRecognize.Enabled = unrecognized.Any();
  55. this.btnQueue.Enabled = selectedAndRecognized.Any();
  56. }
  57. private void OnFoundLinksContentChanged()
  58. {
  59. var selected = from item in this.lvFoundLinks.Items.OfType<ListViewItem>()
  60. where item.Checked
  61. select item;
  62. this.btnFoundAddSelected.Enabled = selected.Any();
  63. }
  64. private void OnFindManuallyEnteredLinks(object sender, EventArgs e)
  65. {
  66. this.AddLinksToRecognizingStage(this.service.FindInText(this.tbLinkPasteArea.Text));
  67. }
  68. private void OnAnalyzePage(object sender, EventArgs e)
  69. {
  70. this.OnAnalyzePage(this.tbPageLink.Text);
  71. }
  72. [ExceptionHandled, Asynchronous(AsynchronousMode.Real, "Analyzing page...")]
  73. private void OnAnalyzePage(string link)
  74. {
  75. var links = this.service.FindAtPage(link);
  76. this.OnAnalyzePageComplete(links);
  77. }
  78. [MethodSynchronizer]
  79. private void OnAnalyzePageComplete(DownloadLink[] links)
  80. {
  81. this.AddLinksToFoundStage(links);
  82. this.lblStatus.ResetText();
  83. this.Enabled = true;
  84. }
  85. private void AddLinksToRecognizingStage(DownloadLink[] links)
  86. {
  87. var list = new List<ListViewItem>();
  88. foreach (var link in links)
  89. {
  90. var current = link;
  91. var provider = String.Empty;
  92. var linkname = current.Target;
  93. var item = new ListViewItem(new[] { linkname, provider }) { Tag = current };
  94. list.Add(item);
  95. }
  96. this.lvLinks.Items.AddRange(list.ToArray());
  97. this.OnFinalLinksContentChanged();
  98. }
  99. private void AddLinksToFoundStage(DownloadLink[] links)
  100. {
  101. foreach (var link in links)
  102. {
  103. var current = link;
  104. var linkname = current.Target;
  105. var item = new ListViewItem(new[] { linkname }) { Tag = current, Checked = true };
  106. this.lvFoundLinks.Items.Add(item);
  107. }
  108. this.OnFoundLinksContentChanged();
  109. }
  110. private void OnRecognizeAvailableLinks(object sender, EventArgs e)
  111. {
  112. this.OnRecognizeAvailableLinks(this.lvLinks.Items.OfType<ListViewItem>().ToArray());
  113. }
  114. [ExceptionHandled, Asynchronous(AsynchronousMode.Real, "Querying servers...")]
  115. private void OnRecognizeAvailableLinks(ListViewItem[] items)
  116. {
  117. var selected = from item in items
  118. where item.Tag is DownloadLink
  119. select new
  120. {
  121. Item = item,
  122. Link = item.Tag as DownloadLink
  123. };
  124. var recognized = this.service.Recognize(selected.Select(x => x.Link).ToArray());
  125. var updated = from item in selected
  126. join element in recognized on item.Link.Target equals element.GetSources().First().Link into elements
  127. from element in elements.DefaultIfEmpty()
  128. select new
  129. {
  130. Item = item.Item,
  131. Link = element
  132. };
  133. this.OnRecognizeAvailableLinksComplete(updated.ToDictionary(x => x.Item, x => x.Link));
  134. }
  135. [MethodSynchronizer]
  136. private void OnRecognizeAvailableLinksComplete(IDictionary<ListViewItem, DownloadItem> updated)
  137. {
  138. foreach (var item in updated)
  139. {
  140. if (item.Value == null)
  141. {
  142. item.Key.Remove();
  143. }
  144. else
  145. {
  146. item.Key.Checked = true;
  147. item.Key.Tag = item.Value;
  148. item.Key.SubItems[0].Text = item.Value.Filename;
  149. item.Key.SubItems[1].Text = item.Value.GetSources().First().Info.Name;
  150. }
  151. }
  152. this.OnFinalLinksContentChanged();
  153. }
  154. private void OnAddSelectedLinks(object sender, EventArgs e)
  155. {
  156. var selected = from item in this.lvFoundLinks.Items.OfType<ListViewItem>()
  157. where item.Checked
  158. select new
  159. {
  160. Item = item,
  161. Link = item.Tag as DownloadLink
  162. };
  163. this.AddLinksToRecognizingStage(selected.Select(x => x.Link).ToArray());
  164. this.lvFoundLinks.SuspendLayout();
  165. foreach (var item in selected.ToArray())
  166. item.Item.Remove();
  167. this.lvFoundLinks.ResumeLayout();
  168. this.OnFoundLinksContentChanged();
  169. }
  170. private void OnPageLinkChanged(object sender, EventArgs e)
  171. {
  172. Uri dummy;
  173. this.btnAnalyzePage.Enabled = Uri.TryCreate(this.tbPageLink.Text, UriKind.Absolute, out dummy) && dummy.Scheme == Uri.UriSchemeHttp;
  174. }
  175. #region IExceptionHandler Members
  176. [MethodSynchronizer]
  177. void IExceptionHandler.Handle(Exception ex)
  178. {
  179. this.lblStatus.ResetText();
  180. this.Enabled = true;
  181. MessageBox.Show(this, ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
  182. }
  183. #endregion
  184. #region IAsynchronous Members
  185. [MethodSynchronizer]
  186. void IAsynchronous.OnStart(string message)
  187. {
  188. this.lblStatus.Text = message;
  189. this.Enabled = false;
  190. }
  191. [MethodSynchronizer]
  192. void IAsynchronous.OnComplete()
  193. {
  194. this.lblStatus.ResetText();
  195. this.Enabled = true;
  196. }
  197. #endregion
  198. }
  199. }