using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace AVSORTER
{
public class SearchItem
{
#region 构造函数 public FileItem(string codeString,IGetable getor)
public SearchItem(string codeString, IGetable getor)
{
this._queryString = codeString;
this.Getor = getor;
}
#endregion
#region 属性 查询字符串public string SeedString
private string _queryString;
public string SeedString
{
get { return _queryString; }
}
#endregion
#region 属性 影片信息 public Movie MovieDetail
private Movie _mv;
public Movie MovieDetail
{
get { return _mv; }
}
#endregion
///
/// 结果列表
///
public List MovieBasicList { get; set; }
private QStatus _status = QStatus.未开始;
public QStatus Status
{
get { return _status; }
set { _status = value; }
}
public object Tag { get; set; }
///
/// 设定选择结果
///
///
public void Select(int index)
{
this.chooseIndex = index;
_startGetMovie();
}
public bool IsSelected
{
get
{
if (this.chooseIndex == -1)
{
return false;
}
else
{
return true;
}
}
}
///
/// 设定选择结果
///
///
public void Select(MovieBasic basic)
{
this.chooseIndex = MovieBasicList.IndexOf(basic);
_startGetMovie();
}
public MovieBasic SelectedMovieBasic
{
get
{
if (this.IsSelected)
{
return this.MovieBasicList[chooseIndex];
}
else
{
return null;
}
}
}
private void _startGetMovie()
{
if (OnAboutToLoadImage == null)
{
throw new Exception("必须注册这个事件");
}
else
{
OnAboutToLoadImage(this, new EventArgs());
}
try
{
if (this.chooseIndex != -1)
{
Func fuc = new Func(Getor.GetMovie);
fuc.BeginInvoke(this.MovieBasicList[this.chooseIndex], _getMovieCallback, fuc);
RaiseStatusChangeEvent(QStatus.查询完成一个结果, QStatus.获取信息中, "");
}
else
{
this._status = QStatus.出错;
throw new Exception("还没有选定影片");
}
}
catch (Exception ee)
{
throw ee;
}
}
private void _getMovieCallback(IAsyncResult res)
{
try
{
this._mv = (res.AsyncState as Func).EndInvoke(res);
this._status = QStatus.获取信息完成;
if (IsDownloadCover)
{
RaiseStatusChangeEvent(QStatus.获取信息中, QStatus.获取信息完成, "已经获取影片信息!");
this._status = QStatus.下载封面中;
RaiseStatusChangeEvent(QStatus.获取信息完成, QStatus.下载封面中, "已经获取影片信息!");
_startGetCover();
}
else
{
this._status = QStatus.准备好移动文件;
RaiseStatusChangeEvent(QStatus.获取信息中, QStatus.准备好移动文件, "已经获取影片信息,不要求获取封面!");
}
}
catch (Exception)
{
RaiseStatusChangeEvent(QStatus.获取信息中, QStatus.出错, "获取影片信息时出错!");
}
finally
{
if (OnCompletedLoadImage == null)
{
throw new Exception("必须注册这个事件");
}
else
{
OnCompletedLoadImage(this, new EventArgs());
}
}
}
private void _startGetCover()
{
if (IsDownloadCover)
{
Func fuc = new Func(Getor.GetCover);
fuc.BeginInvoke(this._mv, _getCoverCallBack, fuc);
}
}
private void _getCoverCallBack(IAsyncResult res)
{
try
{
var ress = (res.AsyncState as Func).EndInvoke(res);
this._status = QStatus.准备好移动文件;
RaiseStatusChangeEvent(QStatus.下载封面中, QStatus.准备好移动文件, "封面下载完毕");
}
catch (Exception)
{
RaiseStatusChangeEvent(QStatus.下载封面中, QStatus.出错, "下载封面出错");
}
}
virtual protected void RaiseStatusChangeEvent(QStatus b, QStatus aft, string msg)
{
this._status = aft;
if (OnStatusChange != null)
{
OnStatusChange(this, new StatusChangeEventArgs(b, aft, msg));
}
}
public event StatusChangeEvent OnStatusChange;
private int chooseIndex = -1;
public IGetable Getor
{
get;
set;
}
public void StartQuery()
{
if (OnAboutToLoadInfo == null)
{
throw new Exception("必须注册这个事件");
}
else
{
OnAboutToLoadInfo(this, new EventArgs());
}
if (this.Getor != null)
{
//this.MovieBasicList = Getor.Query(SeedString);
Func> fuc = new Func>(Getor.Query);
fuc.BeginInvoke(SeedString, queryFinishCallBack, fuc);
RaiseStatusChangeEvent(QStatus.未开始, QStatus.查询中, "");
}
else
{
RaiseStatusChangeEvent(QStatus.查询中, QStatus.出错, "查询影片出错");
}
}
private void queryFinishCallBack(IAsyncResult obj)
{
try
{
this.MovieBasicList = (obj.AsyncState as Func>).EndInvoke(obj);
if (this.MovieBasicList.Count > 1)
{
RaiseStatusChangeEvent(QStatus.查询中, QStatus.多个结果请选择一个, "");
}
else if (this.MovieBasicList.Count == 1)
{
RaiseStatusChangeEvent(QStatus.查询中, QStatus.查询完成一个结果, "");
if (this.IsAutoSelect)
{
RaiseStatusChangeEvent(QStatus.查询完成一个结果, QStatus.获取信息中, "");
Select(0);
}
}
else
{
RaiseStatusChangeEvent(QStatus.查询中, QStatus.查询完成无匹配, "");
}
}
catch (Exception)
{
RaiseStatusChangeEvent(QStatus.查询中, QStatus.出错, "查询出错");
this.MovieBasicList = null;
this.chooseIndex = -1;
}
finally
{
if (OnCompletedLoadInfo == null)
{
throw new Exception("必须注册这个事件");
}
else
{
OnCompletedLoadInfo(this, new EventArgs());
}
}
}
public class StatusChangeEventArgs : EventArgs
{
public QStatus Before { get; set; }
public QStatus After { get; set; }
public string Message { get; set; }
public StatusChangeEventArgs(QStatus _before, QStatus _after, string _msg)
{
this.Before = _before;
this.After = _after;
this.Message = _msg;
}
}
public delegate void StatusChangeEvent(object sender, StatusChangeEventArgs e);
public event EventHandler OnAboutToLoadInfo;
public event EventHandler OnCompletedLoadInfo;
public event EventHandler OnAboutToLoadImage;
public event EventHandler OnCompletedLoadImage;
///
/// 是否自动下载封面
///
public bool IsDownloadCover { get; set; }
///
/// 当查询结果只有一个时候,是否自动下载详细信息。
///
public bool IsAutoSelect { get; set; }
}
}