using JD.Collections; using JD.Collections.Extensions; using JD.Collections.Interfaces; using JD.Kernel.StaticHelpers; using JD.Sequencers.Windowlesses; namespace JD.Sequencers.Times { public class AttachedControlCollection : ObservableList where TControl : WindowlessControl { #region Variables private readonly IObservableList m_originalCollection; #endregion #region Constructor public AttachedControlCollection(IObservableList originalCollection) { Throw.IfNull(originalCollection, "originalCollection"); Throw.InvalidArgumentIf(originalCollection.IsReadOnly, "Original collection is readonly", "originalCollection"); m_originalCollection = originalCollection; m_originalCollection.CollectionChanged += m_originalCollection_CollectionChanged; } #endregion #region Methods protected override void OnCollectionChanged(CollectionChangedEventArgs e) { base.OnCollectionChanged(e); switch (e.Action) { case CollectionChangeAction.ItemAdded: if (!m_originalCollection.Contains(e.Item)) { m_originalCollection.Add(e.Item); } break; case CollectionChangeAction.ItemRemoved: m_originalCollection.Remove(e.Item); break; case CollectionChangeAction.Cleared: m_originalCollection.RemoveAll(IsTControl); break; } } private static bool IsTControl(WindowlessControl control) { return control is TControl; } #endregion #region Event Handlers void m_originalCollection_CollectionChanged(object sender, CollectionChangedEventArgs e) { switch (e.Action) { case CollectionChangeAction.ItemAdded: TControl addedControl = e.Item as TControl; if (addedControl != null && !Contains(addedControl)) { Add(addedControl); } break; case CollectionChangeAction.ItemRemoved: TControl removedControl = e.Item as TControl; if (removedControl != null) { Remove(removedControl); } break; case CollectionChangeAction.Cleared: Clear(); break; } } #endregion } }