/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
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Windows.Forms;
- using Html.Downloader.Engine;
- using Html.Downloader.Extensions;
- using Melon.Commons.Aspects.WinForms;
- using Melon.Commons.Aspects.WinForms.Asynchronousity;
- using Melon.Commons.Aspects.WinForms.ExceptionHandling;
- using Melon.Commons.Aspects.WinForms.Synchronization;
-
- namespace Html.Downloader.Forms
- {
- public partial class AddLinksForm : Form, IExceptionHandler, IAsynchronous
- {
- #region Private Fields
- private ILinkPreparationService service;
- #endregion
- #region Constructors
- public AddLinksForm(ILinkPreparationService service)
- {
- this.service = service;
- this.InitializeComponent();
- }
- #endregion
-
- [ExceptionHandled]
- private void OnQueueRequest(object sender, EventArgs e)
- {
- var query = from item in this.lvLinks.Items.OfType<ListViewItem>()
- where item.Checked && item.Tag is DownloadItem
- select item.Tag as DownloadItem;
-
- this.service.Queue(query.ToArray());
- }
-
- private void OnManualLinksAreaChanged(object sender, EventArgs e)
- {
- this.btnManualFind.Enabled = this.tbLinkPasteArea.TextLength > 0;
- }
-
- private void OnFinalLinkChecked(object sender, ItemCheckedEventArgs e)
- {
- this.OnFinalLinksContentChanged();
- }
-
- private void OnFinalLinksContentChanged()
- {
- var unrecognized = from item in this.lvLinks.Items.OfType<ListViewItem>()
- where item.Tag is DownloadLink
- select item;
-
- var selectedAndRecognized = from item in this.lvLinks.Items.OfType<ListViewItem>()
- where item.Checked && item.Tag is DownloadItem
- select item;
-
- this.btnRecognize.Enabled = unrecognized.Any();
- this.btnQueue.Enabled = selectedAndRecognized.Any();
- }
-
- private void OnFoundLinksContentChanged()
- {
- var selected = from item in this.lvFoundLinks.Items.OfType<ListViewItem>()
- where item.Checked
- select item;
-
- this.btnFoundAddSelected.Enabled = selected.Any();
- }
-
- private void OnFindManuallyEnteredLinks(object sender, EventArgs e)
- {
- this.AddLinksToRecognizingStage(this.service.FindInText(this.tbLinkPasteArea.Text));
- }
-
- private void OnAnalyzePage(object sender, EventArgs e)
- {
- this.OnAnalyzePage(this.tbPageLink.Text);
- }
-
- [ExceptionHandled, Asynchronous(AsynchronousMode.Real, "Analyzing page...")]
- private void OnAnalyzePage(string link)
- {
- var links = this.service.FindAtPage(link);
- this.OnAnalyzePageComplete(links);
- }
-
- [MethodSynchronizer]
- private void OnAnalyzePageComplete(DownloadLink[] links)
- {
- this.AddLinksToFoundStage(links);
-
- this.lblStatus.ResetText();
- this.Enabled = true;
- }
-
- private void AddLinksToRecognizingStage(DownloadLink[] links)
- {
- var list = new List<ListViewItem>();
-
- foreach (var link in links)
- {
- var current = link;
- var provider = String.Empty;
- var linkname = current.Target;
- var item = new ListViewItem(new[] { linkname, provider }) { Tag = current };
-
- list.Add(item);
- }
-
- this.lvLinks.Items.AddRange(list.ToArray());
- this.OnFinalLinksContentChanged();
- }
-
- private void AddLinksToFoundStage(DownloadLink[] links)
- {
- foreach (var link in links)
- {
- var current = link;
- var linkname = current.Target;
- var item = new ListViewItem(new[] { linkname }) { Tag = current, Checked = true };
-
- this.lvFoundLinks.Items.Add(item);
- }
-
- this.OnFoundLinksContentChanged();
- }
-
- private void OnRecognizeAvailableLinks(object sender, EventArgs e)
- {
- this.OnRecognizeAvailableLinks(this.lvLinks.Items.OfType<ListViewItem>().ToArray());
- }
-
- [ExceptionHandled, Asynchronous(AsynchronousMode.Real, "Querying servers...")]
- private void OnRecognizeAvailableLinks(ListViewItem[] items)
- {
- var selected = from item in items
- where item.Tag is DownloadLink
- select new
- {
- Item = item,
- Link = item.Tag as DownloadLink
- };
-
- var recognized = this.service.Recognize(selected.Select(x => x.Link).ToArray());
-
- var updated = from item in selected
- join element in recognized on item.Link.Target equals element.GetSources().First().Link into elements
- from element in elements.DefaultIfEmpty()
- select new
- {
- Item = item.Item,
- Link = element
- };
-
- this.OnRecognizeAvailableLinksComplete(updated.ToDictionary(x => x.Item, x => x.Link));
- }
-
- [MethodSynchronizer]
- private void OnRecognizeAvailableLinksComplete(IDictionary<ListViewItem, DownloadItem> updated)
- {
- foreach (var item in updated)
- {
- if (item.Value == null)
- {
- item.Key.Remove();
- }
- else
- {
- item.Key.Checked = true;
- item.Key.Tag = item.Value;
- item.Key.SubItems[0].Text = item.Value.Filename;
- item.Key.SubItems[1].Text = item.Value.GetSources().First().Info.Name;
- }
- }
-
- this.OnFinalLinksContentChanged();
- }
-
- private void OnAddSelectedLinks(object sender, EventArgs e)
- {
- var selected = from item in this.lvFoundLinks.Items.OfType<ListViewItem>()
- where item.Checked
- select new
- {
- Item = item,
- Link = item.Tag as DownloadLink
- };
-
- this.AddLinksToRecognizingStage(selected.Select(x => x.Link).ToArray());
-
- this.lvFoundLinks.SuspendLayout();
- foreach (var item in selected.ToArray())
- item.Item.Remove();
- this.lvFoundLinks.ResumeLayout();
-
- this.OnFoundLinksContentChanged();
- }
-
- private void OnPageLinkChanged(object sender, EventArgs e)
- {
- Uri dummy;
- this.btnAnalyzePage.Enabled = Uri.TryCreate(this.tbPageLink.Text, UriKind.Absolute, out dummy) && dummy.Scheme == Uri.UriSchemeHttp;
- }
-
- #region IExceptionHandler Members
- [MethodSynchronizer]
- void IExceptionHandler.Handle(Exception ex)
- {
- this.lblStatus.ResetText();
- this.Enabled = true;
-
- MessageBox.Show(this, ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- #endregion
- #region IAsynchronous Members
- [MethodSynchronizer]
- void IAsynchronous.OnStart(string message)
- {
- this.lblStatus.Text = message;
- this.Enabled = false;
- }
-
- [MethodSynchronizer]
- void IAsynchronous.OnComplete()
- {
- this.lblStatus.ResetText();
- this.Enabled = true;
- }
- #endregion
- }
- }