using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Threading; namespace DevComponents.DotNetBar.Animation { internal class Storyline : Component { #region Events #endregion #region Constructor #endregion #region Implementation private bool _IsDisposed = false; /// /// Returns whether Storyline is disposed. /// public bool IsDisposed { get { return _IsDisposed; } } protected override void Dispose(bool disposing) { if (disposing) { BackgroundWorker worker = _Worker; if (worker != null) { worker.CancelAsync(); worker.Dispose(); _Worker = null; } } _IsDisposed = true; base.Dispose(disposing); } private List _Animations = new List(); /// /// Gets the list of animations to run using this storyline. /// public List Animations { get { return _Animations; } } private BackgroundWorker _Worker = null; /// /// Runs all animations from Animations list. /// public void Run() { if (_Worker != null) throw new InvalidOperationException("Storyline is already running animations"); _Worker = new BackgroundWorker(); _Worker.WorkerReportsProgress = true; _Worker.WorkerSupportsCancellation = true; _Worker.DoWork += new DoWorkEventHandler(WorkerDoWork); _Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted); _Worker.RunWorkerAsync(); } void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (_RepeatStoryTimes > 0) { if (_Worker == null) { _RepeatStoryTimes = 0; return; } _RepeatStoryTimes--; _Worker.RunWorkerAsync(); } else { if (_Worker != null) _Worker.Dispose(); _Worker = null; if (_AutoDispose && !_IsDisposed) this.Dispose(); } } void WorkerDoWork(object sender, DoWorkEventArgs e) { int count = _Animations.Count; for (int i = 0; i < count; i++) { if (e.Cancel) return; _Animations[i].Start(); while (!_Animations[i].IsCompleted) { try { using ( System.Threading.ManualResetEvent wait = new System.Threading.ManualResetEvent(false)) wait.WaitOne(50); //Thread.Sleep(50); } catch { _Animations[i].Stop(); return; } if (e.Cancel) { _Animations[i].Stop(); return; } } } } private int _RepeatStoryTimes = 0; /// /// Gets or sets number of times storyline is repeated. Default value is 0 which indicates that storyline is run only once meaning not repeated. /// public int RepeatStoryTimes { get { return _RepeatStoryTimes; } set { _RepeatStoryTimes = value; } } private bool _AutoDispose = false; /// /// Gets or sets whether storyline is auto-disposed when finished. /// public bool AutoDispose { get { return _AutoDispose; } set { _AutoDispose = value; } } #endregion } }