// TODO: adapter à Silverlight (utiliser System.Threading.Timer ?) et à WinRT #if !SILVERLIGHT && !NETFX_CORE using System; using System.Text; using System.Timers; using Developpez.Dotnet.Properties; namespace Developpez.Dotnet { /// /// Représente une chaîne de caractères à durée de vie limitée. /// Lorsque la durée de vie expire, la chaîne de caractères est vidée. /// La durée de vie est réinitialisée à chaque ajout de caractère. /// public class TemporaryString { #region Fields /// /// Durée de vie par défaut. /// private static readonly double _DEFAULTLIFETIME = 1000; /// /// Instance du Timer. /// private readonly Timer _timer; /// /// Chaîne de caractères. /// private readonly StringBuilder _value; /// /// Evènement levé lorsque la durée de vie a expiré. /// /// La chaîne de caractère est vidée. public event EventHandler Reset; /// /// Evènement levé lorsqu'un caractère a été ajouté à l'instance. /// /// La durée de vie est réinitialisée. public event EventHandler CharAdded; #endregion #region Constructors /// /// Intialise une nouvelle instance de la classe avec la durée de vie par défaut. /// public TemporaryString() : this(_DEFAULTLIFETIME, string.Empty) { } /// /// Intialise une nouvelle instance de la classe avec la durée de vie donnée. /// /// Durée de vie (en millisecondes). public TemporaryString(double lifeTime) : this(lifeTime, string.Empty) { } /// /// Intialise une nouvelle instance de la classe avec la valeur initiale donnée. /// /// Valeur initiale. public TemporaryString(string value) : this(_DEFAULTLIFETIME, value) { } /// /// Intialise une nouvelle instance de la classe /// avec la durée de vie et la valeur initiale données. /// /// Durée de vie. /// Valeur initiale. public TemporaryString(double lifeTime, string value) { if (lifeTime <= 0) throw new ArgumentOutOfRangeException("lifeTime", ExceptionMessages.NegativeLifeTime); if (value == null) throw new ArgumentNullException("value"); this._timer = new Timer(lifeTime); this._value = new StringBuilder(value); this._timer.Elapsed += this._Timer_Elapsed; this._timer.Enabled = true; this._timer.AutoReset = false; } #endregion /// /// Elapsed timer event. /// /// Source object. /// Elapsed event arguments. private void _Timer_Elapsed(object sender, ElapsedEventArgs e) { this._value.Length = 0; // Stop the timer : this._timer.Stop(); EventHandler handler = Reset; // NOTE : Make a temporary copy of the event to avoid possibility of a race condition // if the last subscriber unsubscribes immediately after the null check and before the event is raised. if (handler != null) handler(this, new EventArgs()); } #region Public methods /// /// Ajoute un caractère à la fin de la chaîne. /// /// Le caractère Unicode à ajouter. public void Append(char value) { this._value.Append(value); // Reset the timer : this._timer.Stop(); this._timer.Start(); EventHandler handler = CharAdded; // NOTE : Make a temporary copy of the event to avoid possibility of a race condition // if the last subscriber unsubscribes immediately after the null check and before the event is raised. if (handler != null) handler(this, new EventArgs()); } /// /// Ajoute un tableau de caractères à la fin de cette instance. /// /// Le tableau de caractères Unicode à ajouter. public void Append(char[] value) { foreach (var c in value) this.Append(c); } /// /// Ajoute une chaîne de caractères à la chaîne courante. /// /// Chaîne de caractères à ajouter à la chaîne courante. public void Append(string value) { foreach (char c in value) this.Append(c); } /// /// Retourne une chaîne de caractères représentant l'instance courante. /// /// Une chaîne de caractères représentant l'instance courante. public override string ToString() { return this._value.ToString(); } #endregion } } #endif