PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/source/library/Interlace/Utilities/DelayedEvent.cs

https://bitbucket.org/VahidN/interlace
C# | 111 lines | 60 code | 21 blank | 30 comment | 6 complexity | e0eaac9beb6d44133b1fe823aa812e16 MD5 | raw file
  1. #region Using Directives and Copyright Notice
  2. // Copyright (c) 2007-2010, Computer Consultancy Pty Ltd
  3. // All rights reserved.
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are met:
  7. // * Redistributions of source code must retain the above copyright
  8. // notice, this list of conditions and the following disclaimer.
  9. // * Redistributions in binary form must reproduce the above copyright
  10. // notice, this list of conditions and the following disclaimer in the
  11. // documentation and/or other materials provided with the distribution.
  12. // * Neither the name of the Computer Consultancy Pty Ltd nor the
  13. // names of its contributors may be used to endorse or promote products
  14. // derived from this software without specific prior written permission.
  15. //
  16. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. // ARE DISCLAIMED. IN NO EVENT SHALL COMPUTER CONSULTANCY PTY LTD BE LIABLE
  20. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25. // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  26. // DAMAGE.
  27. using System;
  28. using System.Collections.Generic;
  29. using System.Text;
  30. using System.Windows.Forms;
  31. #endregion
  32. namespace Interlace.Utilities
  33. {
  34. /// <summary>
  35. /// Hooks an event of any type and uses it to start a countdown that triggers a second
  36. /// event. Any event arguments of the first event are not kept.
  37. /// </summary>
  38. /// <typeparam name="TEventArgs">The event that triggers the countdown.</typeparam>
  39. public class DelayedEvent<TEventArgs> where TEventArgs : EventArgs
  40. {
  41. public event EventHandler Triggered;
  42. public event EventHandler<TEventArgs> TriggeredWithArgs;
  43. Timer _timer;
  44. TimeSpan _lag;
  45. bool _isActive;
  46. DateTime _elapsesAt;
  47. object _delayedSender;
  48. TEventArgs _delayedArgs;
  49. public DelayedEvent(Form owningForm)
  50. {
  51. _isActive = false;
  52. _timer = new Timer();
  53. _timer.Interval = 100;
  54. _timer.Start();
  55. _timer.Tick += new EventHandler(_timer_Tick);
  56. owningForm.FormClosed += new FormClosedEventHandler(owningForm_FormClosed);
  57. }
  58. void _timer_Tick(object sender, EventArgs e)
  59. {
  60. if (_isActive && DateTime.Now > _elapsesAt)
  61. {
  62. _isActive = false;
  63. object delayedSender = _delayedSender;
  64. TEventArgs delayedArgs = _delayedArgs;
  65. _delayedSender = null;
  66. _delayedArgs = null;
  67. if (Triggered != null) Triggered(this, EventArgs.Empty);
  68. if (TriggeredWithArgs != null) TriggeredWithArgs(delayedSender, delayedArgs);
  69. }
  70. }
  71. void owningForm_FormClosed(object sender, FormClosedEventArgs e)
  72. {
  73. _timer.Stop();
  74. _timer.Tick -= new EventHandler(_timer_Tick);
  75. (sender as Form).FormClosed -= new FormClosedEventHandler(owningForm_FormClosed);
  76. }
  77. public void HandleTriggeringEvent(object sender, TEventArgs e)
  78. {
  79. _isActive = true;
  80. _elapsesAt = DateTime.Now + Lag;
  81. _delayedSender = sender;
  82. _delayedArgs = e;
  83. }
  84. public TimeSpan Lag
  85. {
  86. get { return _lag; }
  87. set { _lag = value; }
  88. }
  89. }
  90. }